/* * Copyright 2015 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.collect.ImmutableList; import java.util.List; import junit.framework.TestCase; /** * Tests for {@link Es6SortedDependencies} * @author nicksantos@google.com (Nick Santos) * @author stalcup@google.com (John Stalcup) */ public class Es6SortedDependenciesTest extends TestCase { private static SortedDependencies<SimpleDependencyInfo> createSortedDependencies( List<SimpleDependencyInfo> shuffled) { return new Es6SortedDependencies<>(shuffled); } public void testSort() throws Exception { SimpleDependencyInfo a = new SimpleDependencyInfo( "a", "a", provides(), requires("b", "c"), false); SimpleDependencyInfo b = new SimpleDependencyInfo( "b", "b", provides("b"), requires("d"), false); SimpleDependencyInfo c = new SimpleDependencyInfo( "c", "c", provides("c"), requires("d"), false); SimpleDependencyInfo d = new SimpleDependencyInfo( "d", "d", provides("d"), requires(), false); SimpleDependencyInfo e = new SimpleDependencyInfo( "e", "e", provides("e"), requires(), false); assertSortedInputs( ImmutableList.of(d, b, c, a), ImmutableList.of(a, b, c, d)); assertSortedInputs( ImmutableList.of(d, b, c, a), ImmutableList.of(d, b, c, a)); assertSortedInputs( ImmutableList.of(d, c, b, a), ImmutableList.of(d, c, b, a)); assertSortedInputs( ImmutableList.of(d, b, c, a), ImmutableList.of(d, a, b, c)); assertSortedDeps( ImmutableList.of(d, b, c, a), ImmutableList.of(d, b, c, a), ImmutableList.of(a)); assertSortedDeps( ImmutableList.of(d, c), ImmutableList.of(d, c, b, a), ImmutableList.of(c)); assertSortedDeps( ImmutableList.of(d), ImmutableList.of(d, c, b, a), ImmutableList.of(d)); try { assertSortedDeps( ImmutableList.<SimpleDependencyInfo>of(), ImmutableList.of(a, b, c, d), ImmutableList.of(e)); fail("Expected an exception"); } catch (IllegalArgumentException expected) {} } public void testSort2() throws Exception { SimpleDependencyInfo ab = new SimpleDependencyInfo( "ab", "ab", provides("a", "b"), requires("d", "f"), false); SimpleDependencyInfo c = new SimpleDependencyInfo( "c", "c", provides("c"), requires("h"), false); SimpleDependencyInfo d = new SimpleDependencyInfo( "d", "d", provides("d"), requires("e", "f"), false); SimpleDependencyInfo ef = new SimpleDependencyInfo( "ef", "ef", provides("e", "f"), requires("g", "c"), false); SimpleDependencyInfo g = new SimpleDependencyInfo( "g", "g", provides("g"), requires(), false); SimpleDependencyInfo hi = new SimpleDependencyInfo( "hi", "hi", provides("h", "i"), requires(), false); assertSortedInputs( ImmutableList.of(g, hi, c, ef, d, ab), ImmutableList.of(ab, c, d, ef, g, hi)); assertSortedDeps( ImmutableList.of(g), ImmutableList.of(ab, c, d, ef, g, hi), ImmutableList.of(g)); assertSortedDeps( ImmutableList.of(g, hi, c, ef, d), ImmutableList.of(ab, c, d, ef, g, hi), ImmutableList.of(d, hi)); } public void testSort3() { SimpleDependencyInfo a = new SimpleDependencyInfo( "a", "a", provides("a"), requires("c"), false); SimpleDependencyInfo b = new SimpleDependencyInfo( "b", "b", provides("b"), requires("a"), false); SimpleDependencyInfo c = new SimpleDependencyInfo( "c", "c", provides("c"), requires("b"), false); assertOrder( ImmutableList.of(a, b, c), ImmutableList.of(b, c, a)); } public void testSort4() throws Exception { // Check the degenerate case. SimpleDependencyInfo a = new SimpleDependencyInfo( "a", "a", provides("a"), requires("a"), false); assertSortedDeps( ImmutableList.of(a), ImmutableList.of(a), ImmutableList.of(a)); } public void testSort5() throws Exception { SimpleDependencyInfo a = new SimpleDependencyInfo( "a", "a", provides("a"), requires(), false); SimpleDependencyInfo b = new SimpleDependencyInfo( "b", "b", provides("b"), requires(), false); SimpleDependencyInfo c = new SimpleDependencyInfo( "c", "c", provides("c"), requires(), false); assertSortedInputs( ImmutableList.of(a, b, c), ImmutableList.of(a, b, c)); assertSortedInputs( ImmutableList.of(c, b, a), ImmutableList.of(c, b, a)); } public void testSort6() { SimpleDependencyInfo a = new SimpleDependencyInfo( "gin", "gin", provides("gin"), requires("tonic"), false); SimpleDependencyInfo b = new SimpleDependencyInfo( "tonic", "tonic", provides("tonic"), requires("gin2"), false); SimpleDependencyInfo c = new SimpleDependencyInfo( "gin2", "gin2", provides("gin2"), requires("gin"), false); SimpleDependencyInfo d = new SimpleDependencyInfo( "gin3", "gin3", provides("gin3"), requires("gin"), false); assertOrder(ImmutableList.of(a, b, c, d), ImmutableList.of(c, b, a, d)); } public void testSort7() { SimpleDependencyInfo a = new SimpleDependencyInfo( "gin", "gin", provides("gin"), requires("tonic"), false); SimpleDependencyInfo b = new SimpleDependencyInfo( "tonic", "tonic", provides("tonic"), requires("gin"), false); SimpleDependencyInfo c = new SimpleDependencyInfo( "gin2", "gin2", provides("gin2"), requires("gin"), false); SimpleDependencyInfo d = new SimpleDependencyInfo( "gin3", "gin3", provides("gin3"), requires("gin"), false); assertOrder( ImmutableList.of(a, b, c, d), ImmutableList.of(b, a, c, d)); } public void testSort8() { SimpleDependencyInfo a = new SimpleDependencyInfo( "A", "A", provides("A"), requires("B"), false); SimpleDependencyInfo b = new SimpleDependencyInfo( "B", "B", provides("B"), requires("C"), false); SimpleDependencyInfo c = new SimpleDependencyInfo( "C", "C", provides("C"), requires("D"), false); SimpleDependencyInfo d = new SimpleDependencyInfo( "D", "D", provides("D"), requires("A"), false); assertOrder( ImmutableList.of(a, b, c, d), ImmutableList.of(d, c, b, a)); } public void testSort9() { SimpleDependencyInfo a = new SimpleDependencyInfo( "A", "A", provides("A"), requires("B"), false); SimpleDependencyInfo a2 = new SimpleDependencyInfo( "A", "A", provides("A"), requires("B1"), false); SimpleDependencyInfo b = new SimpleDependencyInfo( "B", "B", provides("B"), requires("C"), false); SimpleDependencyInfo c = new SimpleDependencyInfo( "C", "C", provides("C"), requires("E"), false); SimpleDependencyInfo d = new SimpleDependencyInfo( "D", "D", provides("D"), requires("A"), false); SimpleDependencyInfo e = new SimpleDependencyInfo( "B1", "B1", provides("B1"), requires("C1"), false); SimpleDependencyInfo f = new SimpleDependencyInfo( "C1", "C1", provides("C1"), requires("D1"), false); SimpleDependencyInfo g = new SimpleDependencyInfo( "D1", "D1", provides("D1"), requires("A"), false); assertOrder(ImmutableList.of(a, a2, b, c, d, e, f, g), ImmutableList.of(c, b, a, g, f, e, a2, d)); } public void testSort10() throws Exception { SimpleDependencyInfo a = new SimpleDependencyInfo("A", "A", provides("A"), requires("C"), false); SimpleDependencyInfo b = new SimpleDependencyInfo("B", "B", provides("B"), requires(), false); SimpleDependencyInfo c = new SimpleDependencyInfo("C", "C", provides("C"), requires(), false); SortedDependencies<SimpleDependencyInfo> sorted = createSortedDependencies(ImmutableList.of(a, b, c)); assertThat(sorted.getSortedList()).containsExactly(c, a, b).inOrder(); } private static void assertSortedInputs( List<SimpleDependencyInfo> expected, List<SimpleDependencyInfo> shuffled) throws Exception { SortedDependencies<SimpleDependencyInfo> sorted = createSortedDependencies(shuffled); assertThat(sorted.getSortedList()).isEqualTo(expected); } private static void assertSortedDeps( List<SimpleDependencyInfo> expected, List<SimpleDependencyInfo> shuffled, List<SimpleDependencyInfo> roots) throws Exception { SortedDependencies<SimpleDependencyInfo> sorted = createSortedDependencies(shuffled); assertThat(sorted.getSortedDependenciesOf(roots)).isEqualTo(expected); } private static void assertOrder( ImmutableList<SimpleDependencyInfo> shuffle, ImmutableList<SimpleDependencyInfo> expected) { SortedDependencies<SimpleDependencyInfo> sorted = createSortedDependencies(shuffle); assertThat(sorted.getSortedList()).isEqualTo(expected); } private static List<String> requires(String... strings) { return ImmutableList.copyOf(strings); } private static List<String> provides(String... strings) { return ImmutableList.copyOf(strings); } }