/* * Copyright 2009 The Closure Compiler Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.javascript.jscomp.deps; import static com.google.common.truth.Truth.assertThat; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import junit.framework.TestCase; import java.util.Collection; import java.util.HashSet; import java.util.Set; /** * Tests for DependencyResolver. */ public final class DependencyResolverTest extends TestCase { DependencyFile fakeDeps1 = new DependencyFile(new VirtualFile("deps1", "goog.addDependency('a.js', ['a'], []);\n" + "goog.addDependency('b.js', ['b'], []);\n" + "goog.addDependency('c.js', ['c', 'c2'], ['a']);\n" + "goog.addDependency('d.js', ['d'], ['b', 'c']);\n")); DependencyFile fakeDeps2 = new DependencyFile(new VirtualFile("deps2", "goog.addDependency('e.js', ['e'], ['c2']);\n" + "goog.addDependency('f.js', ['f'], ['b', 'c']);\n" + "goog.addDependency('g.js', ['g'], ['a', 'b', 'c']);\n" + "goog.addDependency('h.js', ['h', 'i'], ['g', 'd', 'c']);\n")); DefaultDependencyResolver resolver; @Override protected void setUp() throws Exception { super.setUp(); resolver = new DefaultDependencyResolver(ImmutableList.of(fakeDeps1, fakeDeps2), false); } public void testBasicCase() throws Exception { Collection<String> deps = resolver.getDependencies("goog.require('a');"); assertThat(Joiner.on(",").useForNull("null").join(deps)).isEqualTo("base.js,a.js"); } public void testSimpleDependencies() throws Exception { Collection<String> deps = resolver.getDependencies("goog.require('c');"); assertThat(Joiner.on(",").useForNull("null").join(deps)).isEqualTo("base.js,a.js,c.js"); } public void testTransitiveDependencies() throws Exception { Collection<String> deps = resolver.getDependencies("goog.require('e');"); assertThat(Joiner.on(",").useForNull("null").join(deps)).isEqualTo("base.js,a.js,c.js,e.js"); } public void testMultipleRequires() throws Exception { Collection<String> deps = resolver.getDependencies( "goog.require('e');goog.require('a');goog.require('b');"); assertThat(Joiner.on(",").useForNull("null").join(deps)) .isEqualTo("base.js,a.js,c.js,e.js,b.js"); } public void testOneMoreForGoodMeasure() throws Exception { Collection<String> deps = resolver.getDependencies( "goog.require('g');goog.require('f');goog.require('c');"); assertThat(Joiner.on(",").useForNull("null").join(deps)) .isEqualTo("base.js,a.js,b.js,c.js,g.js,f.js"); } public void testSharedSeenSetNoBaseFile() throws Exception { Set<String> seen = new HashSet<>(); Collection<String> deps = resolver.getDependencies( "goog.require('g');goog.require('f');goog.require('c');", seen, false); Collection<String> depsLater = resolver.getDependencies( "goog.require('f');goog.require('c');", seen, false); assertThat(Joiner.on(",").useForNull("null").join(deps)).isEqualTo("a.js,b.js,c.js,g.js,f.js"); assertThat(depsLater).isEmpty(); } public void testSharedSeenSetNoBaseFileNewRequires() throws Exception { Set<String> seen = new HashSet<>(); Collection<String> deps = resolver.getDependencies( "goog.require('f');goog.require('c');", seen, false); Collection<String> depsLater = resolver.getDependencies( "goog.require('g');goog.require('c');", seen, false); assertThat(Joiner.on(",").useForNull("null").join(deps)).isEqualTo("b.js,a.js,c.js,f.js"); assertThat(Joiner.on(",").useForNull("null").join(depsLater)).isEqualTo("g.js"); } public void testSharedSeenSetNoBaseFileMultipleProvides() throws Exception { Set<String> seen = new HashSet<>(); Collection<String> deps = resolver.getDependencies( "goog.require('h');goog.require('i');", seen, false); assertThat(Joiner.on(",").useForNull("null").join(deps)) .isEqualTo("a.js,b.js,c.js,g.js,d.js,h.js"); } public void testNonExistentProvideLoose() throws Exception { Set<String> seen = new HashSet<>(); resolver = new DefaultDependencyResolver(ImmutableList.of(fakeDeps1), false); Collection<String> deps = resolver.getDependencies( "goog.require('foo');goog.require('d');", seen, false); assertThat(Joiner.on(",").useForNull("null").join(deps)).isEqualTo("b.js,a.js,c.js,d.js"); } public void testNonExistentProvideStrict() throws Exception { Set<String> seen = new HashSet<>(); resolver = new DefaultDependencyResolver(ImmutableList.of(fakeDeps1), true); try { Collection<String> deps = resolver.getDependencies( "goog.require('foo');goog.require('a');", seen, false); fail("Service exception should be thrown"); } catch (ServiceException expected) {} } }