content: package ro.isdc.wro.model;
  
  import static org.junit.Assert.assertEquals;
  import static org.junit.Assert.assertFalse;
  import static org.junit.Assert.assertTrue;
  
  import java.io.InputStream;
  import java.util.Arrays;
  import java.util.Collection;
  import java.util.Collections;
  import java.util.List;
  
  import org.junit.Assert;
  import org.junit.Before;
  import org.junit.Test;
  
  import ro.isdc.wro.model.factory.WroModelFactory;
  import ro.isdc.wro.model.factory.XmlModelFactory;
  import ro.isdc.wro.model.group.Group;
  import ro.isdc.wro.model.resource.Resource;
  
  /**
   * @author Alex Objelean
   */
  public class TestWroModelInspector {
    private WroModelInspector victim;
  
    @Before
    public void setUp() {
      victim = new WroModelInspector(buildValidModel());
    }
  
    /**
     * @return a valid {@link WroModel} pre populated with some valid resources.
     */
    private WroModel buildValidModel() {
      final WroModelFactory factory = new XmlModelFactory() {
        @Override
        protected InputStream getModelResourceAsStream() {
          return getClass().getResourceAsStream("modelInspector.xml");
        }
      };
      return factory.create();
    }
  
    @Test(expected = NullPointerException.class)
    public void cannotAcceptNullModel() {
      new WroModelInspector(null);
    }
  
    public void test() {
      victim.getAllUniqueResources();
    }
  
    @Test
    public void shouldReturnEmptyCollectionWhenAResourceIsNotContainedInAnyGroup() {
      assertTrue(victim.getGroupNamesContainingResource("/resourceMissingFromModel.js").isEmpty());
    }
  
    @Test
    public void shouldFindTheGroupContainingResource() {
      final Collection<String> groups = victim.getGroupNamesContainingResource("/path/to/resource");
      assertEquals(2, groups.size());
      assertEquals("[g2, g3]", Arrays.toString(groups.toArray()));
    }
  
    @Test
    public void shouldGetGroupNamesAsString() {
      assertEquals("g1, g2, g3", victim.getGroupNamesAsString());
    }
  
    @Test(expected = NullPointerException.class)
    public void cannotGetGroupsUsingNullResource() {
      victim.getGroupNamesContainingResource(null);
    }
  
  
    @Test
    public void shouldReturnAllResourcesFromModel() {
      assertEquals(3, victim.getAllUniqueResources().size());
    }
  
    @Test
    public void testGetGroupNames() {
      final List<String> groupNames = victim.getGroupNames();
      Collections.sort(groupNames);
      final List<String> expected = Arrays.asList("g1", "g2", "g3");
      Assert.assertEquals(expected, groupNames);
    }
  
  
    /**
     * Proves that inspector works only with model snapshot and does not reflect model changes performed after inspector
     * is constructed.
     */
    @Test
    public void shouldReturnSameResultAfterModelChange() {
      final WroModel model = new WroModel();
      victim = new WroModelInspector(model);
  
      assertEquals(0, victim.getAllUniqueResources().size());
  
      model.addGroup(new Group("one").addResource(Resource.create("/one.js"))).addGroup(
          new Group("two").addResource(Resource.create("/one.js")));
      //should still be zero, even if the model changed
      assertEquals(0, victim.getAllUniqueResources().size());
      assertEquals(1, new WroModelInspector(model).getAllUniqueResources().size());
      assertEquals(2, new WroModelInspector(model).getAllResources().size());
    }
  
    @Test
    public void testHasGroup() {
      assertFalse(victim.hasGroup("NOT_EXIST"));
      assertTrue(victim.hasGroup("g1"));
    }
  
  }
  