content: package ro.isdc.wro.util.provider;
  
  import static org.junit.Assert.assertEquals;
  import static org.junit.Assert.assertTrue;
  
  import java.util.ArrayList;
  import java.util.Iterator;
  
  import org.junit.Test;
  
  import ro.isdc.wro.WroRuntimeException;
  import ro.isdc.wro.model.resource.processor.support.ProcessorProvider;
  import ro.isdc.wro.model.resource.support.hash.HashStrategyProvider;
  import ro.isdc.wro.model.resource.support.naming.NamingStrategyProvider;
  
  
  /**
   * @author Alex Objelean
   */
  public class TestProviderFinder {
    private ProviderFinder<?> victim;
  
    @Test
    public void shouldFindConfigurableProviders() {
      victim = ProviderFinder.of(ConfigurableProvider.class);
      assertEquals(2, victim.find().size());
    }
  
    @Test
    public void shouldFindProcessorsProvider() {
      victim = ProviderFinder.of(ProcessorProvider.class);
      assertEquals(4, victim.find().size());
    }
  
    @Test
    public void shouldFindNamingStrategyProviders() {
      victim = ProviderFinder.of(NamingStrategyProvider.class);
      assertEquals(2, victim.find().size());
    }
  
    @Test
    public void shouldFindHashBuilderProviders() {
      victim = ProviderFinder.of(HashStrategyProvider.class);
      assertEquals(2, victim.find().size());
    }
  
    @Test
    public void shouldNotFindProviderWhenNoneIsAvailable() {
      victim = new ProviderFinder<ProcessorProvider>(ProcessorProvider.class) {
        @Override
        <F> Iterator<F> lookupProviders(final Class<F> clazz) {
          return new ArrayList<F>().iterator();
        }
      };
      assertTrue(victim.find().isEmpty());
    }
  
    @Test(expected = WroRuntimeException.class)
    public void cannotFindAnyProviderWhenLookupFails() {
      victim = new ProviderFinder<ProcessorProvider>(ProcessorProvider.class) {
        @Override
        <F> Iterator<F> lookupProviders(final Class<F> clazz) {
          throw new IllegalStateException("BOOM!");
        }
      };
      victim.find();
    }
  }
  