content: package ro.isdc.wro.model.resource.processor.decorator;
  
  import static org.junit.Assert.assertEquals;
  import static org.junit.Assert.assertTrue;
  
  import java.io.Reader;
  import java.io.Writer;
  
  import org.junit.After;
  import org.junit.AfterClass;
  import org.junit.Before;
  import org.junit.BeforeClass;
  import org.junit.Test;
  import org.mockito.Mock;
  import org.mockito.Mockito;
  import org.mockito.MockitoAnnotations;
  
  import ro.isdc.wro.WroRuntimeException;
  import ro.isdc.wro.config.Context;
  import ro.isdc.wro.model.resource.Resource;
  import ro.isdc.wro.model.resource.processor.ResourcePreProcessor;
  import ro.isdc.wro.model.resource.processor.SupportAware;
  import ro.isdc.wro.model.resource.processor.impl.js.JSMinProcessor;
  
  
  /**
   * @author Alex Objelean
   */
  public class TestSupportAwareProcessorDecorator {
    @Mock
    private MockProcessor mockProcessor;
    @Mock
    private Resource mockResource;
    @Mock
    private Reader mockReader;
    @Mock
    private Writer mockWriter;
    
    private SupportAwareProcessorDecorator victim;
    
    private static interface MockProcessor
        extends ResourcePreProcessor, SupportAware {
    }
    
    @BeforeClass
    public static void onBeforeClass() {
      assertEquals(0, Context.countActive());
    }
    
    @AfterClass
    public static void onAfterClass() {
      assertEquals(0, Context.countActive());
    }
    
    @Before
    public void setUp() {
      Context.set(Context.standaloneContext());
      MockitoAnnotations.initMocks(this);
      victim = new SupportAwareProcessorDecorator(mockProcessor);
    }
    
    @After
    public void tearDown() {
      Context.unset();
    }
    
    @Test(expected = NullPointerException.class)
    public void cannotDecorateNullProcessor() {
      new SupportAwareProcessorDecorator(null);
    }
    
    @Test
    public void shouldCorrectlyDetectSupportOfDeepNestedProcessor() {
      victim = new SupportAwareProcessorDecorator(new ProcessorDecorator(new ProcessorDecorator(new JSMinProcessor())));
      assertTrue(victim.isSupported());
    }
    
    @Test
    public void shouldInvokeDecoratedProcessorWhenProcessorIsSupported()
        throws Exception {
      Mockito.when(mockProcessor.isSupported()).thenReturn(true);
      victim = new SupportAwareProcessorDecorator(mockProcessor);
      
      victim.process(mockResource, mockReader, mockWriter);
      Mockito.verify(mockProcessor).process(Mockito.any(Resource.class), Mockito.any(Reader.class),
          Mockito.any(Writer.class));
    }
    
    @Test(expected = WroRuntimeException.class)
    public void shouldThrowExceptionWhenProcessorIsNotSupported()
        throws Exception {
      Mockito.when(mockProcessor.isSupported()).thenReturn(false);
      victim = new SupportAwareProcessorDecorator(mockProcessor);
      
      victim.process(mockResource, mockReader, mockWriter);
    }
  }
  