package com.globant.katari.jsmodule.domain; import static org.easymock.EasyMock.*; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.assertThat; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.Before; import org.junit.Test; import com.globant.katari.jsmodule.domain.DependenciesFinder; import com.globant.katari.jsmodule.domain.DependenciesResolver; /** Represents the Test Cases for the {@link DependenciesResolver}. * <p> * The Test Cases follow this dependency graph: * <p> * f * / \ circular circular dependency * / \ dependency u * | | p |^ * a b | c d e ^ \ | \ * /|\ / \ /| / \ / \ v \ * h i j k | l m \ / /| / * | / \ / / |/ * x_____/ q z w */ public class DependenciesResolverTest { private DependenciesFinder dependenciesFinder; private DependenciesResolver resolver; private List<String> noDeps; private List<String> files; private List<String> result; private List<String> expectedResult; private List<String> bDeps; private List<String> jDeps; private List<String> kDeps; private List<String> cDeps; private List<String> lDeps; private List<String> mDeps; private List<String> aDeps; private List<String> iDeps; private List<String> hDeps; private List<String> xDeps; private List<String> fDeps; private List<String> pDeps; private List<String> qDeps; private List<String> uDeps; private List<String> vDeps; private List<String> wDeps; private List<String> zDeps; @Before public void setUp() { dependenciesFinder = createMock(DependenciesFinder.class); resolver = new DependenciesResolver(dependenciesFinder); noDeps = new ArrayList<String>(); files = new ArrayList<String>(); bDeps = new ArrayList<String>(); bDeps.add("j.js"); bDeps.add("k.js"); jDeps = noDeps; kDeps = noDeps; lDeps = noDeps; mDeps = noDeps; cDeps = new ArrayList<String>(); cDeps.add("l.js"); cDeps.add("m.js"); aDeps = new ArrayList<String>(); aDeps.add("h.js"); aDeps.add("i.js"); aDeps.add("j.js"); iDeps = new ArrayList<String>(); iDeps.add("x.js"); hDeps = noDeps; xDeps = noDeps; result = new ArrayList<String>(); expectedResult = new ArrayList<String>(); fDeps = new ArrayList<String>(); fDeps.add("a.js"); fDeps.add("k.js"); fDeps.add("x.js"); pDeps = new ArrayList<String>(); pDeps.add("q.js"); qDeps = new ArrayList<String>(); qDeps.add("p.js"); uDeps = new ArrayList<String>(); uDeps.add("v.js"); vDeps = new ArrayList<String>(); vDeps.add("z.js"); vDeps.add("w.js"); wDeps = new ArrayList<String>(); wDeps.add("u.js"); zDeps = noDeps; } @Test (expected = IllegalArgumentException.class) public void create_nullResolver() { new DependenciesResolver(null); } @Test (expected = IllegalArgumentException.class) public void resolve_nullList() { (new DependenciesResolver(dependenciesFinder)).resolve(null); } @Test public void resolve_noDepsEmpty() { result = resolver.resolve(files); expectedResult = files; assertThat(result, is(expectedResult)); } @Test public void resolve_noDepsMultiple() { expect(dependenciesFinder.find("d.js")).andReturn(noDeps); expect(dependenciesFinder.find("e.js")).andReturn(noDeps); replay(dependenciesFinder); files.add("d.js"); files.add("e.js"); result = resolver.resolve(files); expectedResult = files; assertThat(result, is(expectedResult)); verify(dependenciesFinder); } @Test public void resolve_depsSingle() { expect(dependenciesFinder.find("b.js")).andReturn(bDeps); expect(dependenciesFinder.find("j.js")).andReturn(jDeps); expect(dependenciesFinder.find("k.js")).andReturn(kDeps); replay(dependenciesFinder); files.add("b.js"); result = resolver.resolve(files); expectedResult = Arrays.asList("j.js", "k.js", "b.js"); assertThat(result, is(expectedResult)); verify(dependenciesFinder); } @Test public void resolve_depsMultiple() { expect(dependenciesFinder.find("b.js")).andReturn(bDeps); expect(dependenciesFinder.find("c.js")).andReturn(cDeps); expect(dependenciesFinder.find("j.js")).andReturn(jDeps); expect(dependenciesFinder.find("k.js")).andReturn(kDeps); expect(dependenciesFinder.find("l.js")).andReturn(lDeps); expect(dependenciesFinder.find("m.js")).andReturn(mDeps); replay(dependenciesFinder); files.add("b.js"); files.add("c.js"); result = resolver.resolve(files); expectedResult.addAll(bDeps); expectedResult.add("b.js"); expectedResult.addAll(cDeps); expectedResult.add("c.js"); expectedResult = Arrays.asList("j.js", "k.js", "b.js", "l.js", "m.js", "c.js"); assertThat(result, is(expectedResult)); verify(dependenciesFinder); } @Test public void resolve_depsSingleDeep() { expect(dependenciesFinder.find("a.js")).andReturn(aDeps); expect(dependenciesFinder.find("i.js")).andReturn(iDeps); expect(dependenciesFinder.find("h.js")).andReturn(hDeps); expect(dependenciesFinder.find("x.js")).andReturn(xDeps); expect(dependenciesFinder.find("j.js")).andReturn(jDeps); replay(dependenciesFinder); files.add("a.js"); result = resolver.resolve(files); expectedResult = Arrays.asList("h.js", "x.js", "i.js", "j.js", "a.js"); assertThat(result, is(expectedResult)); verify(dependenciesFinder); } @Test public void resolve_depsMultipleDeep() { expect(dependenciesFinder.find("a.js")).andReturn(aDeps); expect(dependenciesFinder.find("i.js")).andReturn(iDeps); expect(dependenciesFinder.find("h.js")).andReturn(hDeps); expect(dependenciesFinder.find("x.js")).andReturn(xDeps); expect(dependenciesFinder.find("j.js")).andReturn(jDeps); expect(dependenciesFinder.find("b.js")).andReturn(bDeps); expect(dependenciesFinder.find("j.js")).andReturn(jDeps); expect(dependenciesFinder.find("k.js")).andReturn(kDeps); replay(dependenciesFinder); files.add("a.js"); files.add("b.js"); result = resolver.resolve(files); expectedResult = Arrays.asList("h.js", "x.js", "i.js", "j.js", "a.js", "k.js", "b.js"); assertThat(result, is(expectedResult)); verify(dependenciesFinder); } @Test public void resolve_depsComplexDeep() { // dependencies that will be called by file a.js expect(dependenciesFinder.find("a.js")).andReturn(aDeps); expect(dependenciesFinder.find("h.js")).andReturn(hDeps); expect(dependenciesFinder.find("x.js")).andReturn(xDeps); expect(dependenciesFinder.find("i.js")).andReturn(iDeps); expect(dependenciesFinder.find("j.js")).andReturn(jDeps); // dependencies that will be called by file b.js expect(dependenciesFinder.find("b.js")).andReturn(bDeps); expect(dependenciesFinder.find("j.js")).andReturn(jDeps); expect(dependenciesFinder.find("k.js")).andReturn(kDeps); // dependencies that will be called by file f.js expect(dependenciesFinder.find("f.js")).andReturn(fDeps); expect(dependenciesFinder.find("a.js")).andReturn(aDeps); expect(dependenciesFinder.find("h.js")).andReturn(hDeps); expect(dependenciesFinder.find("i.js")).andReturn(iDeps); expect(dependenciesFinder.find("x.js")).andReturn(xDeps); expect(dependenciesFinder.find("j.js")).andReturn(jDeps); expect(dependenciesFinder.find("k.js")).andReturn(kDeps); expect(dependenciesFinder.find("x.js")).andReturn(xDeps); replay(dependenciesFinder); files.add("a.js"); files.add("b.js"); files.add("f.js"); result = resolver.resolve(files); expectedResult = Arrays.asList("h.js", "x.js", "i.js", "j.js", "a.js", "k.js", "b.js", "f.js"); assertThat(result, is(expectedResult)); verify(dependenciesFinder); } @Test (expected = RuntimeException.class) public void resolve_singleCircularDependency() { expect(dependenciesFinder.find("p.js")).andReturn(pDeps); expect(dependenciesFinder.find("q.js")).andReturn(qDeps); replay(dependenciesFinder); files.add("p.js"); result = resolver.resolve(files); } @Test (expected = RuntimeException.class) public void resolve_deepCircularDependency() { expect(dependenciesFinder.find("u.js")).andReturn(uDeps); expect(dependenciesFinder.find("v.js")).andReturn(vDeps); expect(dependenciesFinder.find("w.js")).andReturn(wDeps); expect(dependenciesFinder.find("z.js")).andReturn(zDeps); replay(dependenciesFinder); files.add("u.js"); result = resolver.resolve(files); } }