/**
* Copyright Alex Objelean
*/
package ro.isdc.wro.model.group;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import ro.isdc.wro.config.Context;
import ro.isdc.wro.model.resource.Resource;
import ro.isdc.wro.model.resource.ResourceType;
import ro.isdc.wro.util.WroTestUtils;
/**
* Test class for {@link Group}.
*
* @author Alex Objelean
*/
public class TestGroup {
@BeforeClass
public static void onBeforeClass() {
assertEquals(0, Context.countActive());
}
@Test(expected = NullPointerException.class)
public void cannotCreateGroupWithNullName() {
new Group(null);
}
@Test(expected = NullPointerException.class)
public void cannotPassNullResourceType() {
final Group group = new Group("group");
group.hasResourcesOfType(null);
}
@Test
public void testNoResorucesOfTypeFound() {
final Group group = new Group("group");
Assert.assertEquals(false, group.hasResourcesOfType(ResourceType.CSS));
Assert.assertEquals(false, group.hasResourcesOfType(ResourceType.JS));
}
@Test
public void testResoruceOfTypeFound() {
final Group group = new Group("group");
final List<Resource> resources = new ArrayList<Resource>();
resources.add(Resource.create("/some.css", ResourceType.CSS));
group.setResources(resources);
Assert.assertEquals(true, group.hasResourcesOfType(ResourceType.CSS));
Assert.assertEquals(false, group.hasResourcesOfType(ResourceType.JS));
}
@Test(expected = IllegalArgumentException.class)
public void cannotReplaceMissingResource() {
final Group group = new Group("group");
group.replace(Resource.create("/path", ResourceType.JS), Arrays.asList(Resource.create("", ResourceType.JS)));
}
@SuppressWarnings("unchecked")
@Test
public void testReplaceWithEmptyCollection() {
final Group group = new Group("group");
final Resource resource = Resource.create("/path", ResourceType.JS);
group.addResource(resource);
group.replace(resource, Collections.EMPTY_LIST);
Assert.assertTrue(group.getResources().isEmpty());
}
@Test
public void testReplaceWithFewResources() {
final Group group = new Group("group");
final Resource resource = Resource.create("/static/*", ResourceType.JS);
resource.setMinimize(false);
group.addResource(resource);
group.replace(
resource,
Arrays.asList(Resource.create("/static/one.js", ResourceType.JS),
Resource.create("/static/two.js", ResourceType.JS)));
Assert.assertEquals(2, group.getResources().size());
Assert.assertEquals(resource.isMinimize(), group.getResources().get(0).isMinimize());
}
@Test
public void shouldReplaceAResourceWithSameResource() {
final Group group = new Group("group");
final Resource resource = Resource.create("/path.js");
group.addResource(resource);
final List<Resource> resourceList = new ArrayList<Resource>();
resourceList.add(resource);
group.replace(resource, resourceList);
Assert.assertFalse(group.getResources().isEmpty());
}
@Test
public void shouldReplaceOnlyOneAndPreserveOtherResources() {
final Group group = new Group("group");
final Resource resource = Resource.create("/static/*", ResourceType.JS);
final Resource r0 = Resource.create("/asset/1.js", ResourceType.JS);
group.addResource(r0);
final Resource r1 = Resource.create("/asset/2.js", ResourceType.JS);
group.addResource(r1);
group.addResource(resource);
group.replace(
resource,
Arrays.asList(Resource.create("/static/one.js", ResourceType.JS),
Resource.create("/static/two.js", ResourceType.JS)));
Assert.assertEquals(4, group.getResources().size());
Assert.assertEquals(r0, group.getResources().get(0));
Assert.assertEquals(r1, group.getResources().get(1));
}
@Test(expected = NullPointerException.class)
public void cannotCollectResourcesWithNullType() {
final Group group = new Group("group");
group.collectResourcesOfType(null);
}
@Test
public void shouldCollectCorrectNumberOfResourcesByType() {
final Group group = new Group("group");
group.addResource(Resource.create("1.js"));
group.addResource(Resource.create("2.js"));
group.addResource(Resource.create("3.js"));
group.addResource(Resource.create("4.js"));
group.addResource(Resource.create("5.js"));
group.addResource(Resource.create("6.js"));
group.addResource(Resource.create("1.css"));
Assert.assertEquals(6, group.collectResourcesOfType(ResourceType.JS).getResources().size());
Assert.assertEquals(1, group.collectResourcesOfType(ResourceType.CSS).getResources().size());
}
@Test
public void shouldBeThreadSafeWhenMutated()
throws Exception {
final Group group = new Group("group");
final List<Resource> resources = new ArrayList<Resource>();
final Resource r1 = Resource.create("/some.css", ResourceType.CSS);
resources.add(r1);
WroTestUtils.runConcurrently(new Callable<Void>() {
public Void call()
throws Exception {
if (new Random().nextBoolean()) {
group.setResources(resources);
} else {
group.addResource(r1);
group.replace(r1, resources);
}
return null;
}
});
}
}