Skip to content

Commit 13f7c7f

Browse files
Add dependency order tests to prove that order is not dependent on the order files are passed to the compiler.
1 parent 0a5820a commit 13f7c7f

File tree

1 file changed

+101
-0
lines changed

1 file changed

+101
-0
lines changed

test/com/google/javascript/jscomp/JSModuleGraphTest.java

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import static com.google.common.truth.Truth.assertThat;
2020
import static com.google.common.truth.Truth.assertWithMessage;
21+
import static java.util.Collections.shuffle;
2122

2223
import com.google.common.collect.ImmutableList;
2324
import com.google.common.collect.Iterables;
@@ -27,6 +28,7 @@
2728
import java.util.Arrays;
2829
import java.util.BitSet;
2930
import java.util.List;
31+
import java.util.HashMap;
3032
import junit.framework.TestCase;
3133

3234
/**
@@ -344,6 +346,105 @@ private List<CompilerInput> setUpManageDependenciesTest() {
344346
return inputs;
345347
}
346348

349+
public void testGoogBaseOrderedCorrectly() throws Exception {
350+
List<SourceFile> sourceFiles = new ArrayList<>();
351+
sourceFiles.add(code("a9", provides("a9"), requires()));
352+
sourceFiles.add(code("a8", provides("a8"), requires()));
353+
sourceFiles.add(code("a7", provides("a7"), requires()));
354+
sourceFiles.add(code("a6", provides("a6"), requires()));
355+
sourceFiles.add(code("a5", provides("a5"), requires()));
356+
sourceFiles.add(code("a4", provides("a4"), requires()));
357+
sourceFiles.add(code("a3", provides("a3"), requires()));
358+
sourceFiles.add(code("a2", provides("a2"), requires()));
359+
sourceFiles.add(code("a1", provides("a1"), requires("a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9")));
360+
sourceFiles.add(code("base.js", BASEJS, provides(), requires()));
361+
362+
DependencyOptions depOptions = new DependencyOptions();
363+
depOptions.setDependencySorting(true);
364+
depOptions.setDependencyPruning(true);
365+
depOptions.setMoocherDropping(true);
366+
depOptions.setEntryPoints(ImmutableList.of(ModuleIdentifier.forClosure("a1")));
367+
for (int i = 0; i < 10; i++) {
368+
shuffle(sourceFiles);
369+
A.removeAll();
370+
for (SourceFile sourceFile : sourceFiles) {
371+
A.add(sourceFile);
372+
}
373+
374+
for (CompilerInput input : A.getInputs()) {
375+
input.setCompiler(compiler);
376+
}
377+
378+
List<CompilerInput> inputs = new ArrayList<>();
379+
inputs.addAll(A.getInputs());
380+
List<CompilerInput> results = graph.manageDependencies(depOptions, inputs);
381+
382+
assertInputs(A, "base.js", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a1");
383+
384+
assertThat(sourceNames(results))
385+
.containsExactly("base.js", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a1")
386+
.inOrder();
387+
}
388+
}
389+
390+
public void testProperEs6ModuleOrdering() throws Exception {
391+
List<SourceFile> sourceFiles = new ArrayList<>();
392+
sourceFiles.add(code("/entry.js", provides(), requires()));
393+
sourceFiles.add(code("/a/a.js", provides(), requires()));
394+
sourceFiles.add(code("/a/b.js", provides(), requires()));
395+
sourceFiles.add(code("/b/a.js", provides(), requires()));
396+
sourceFiles.add(code("/b/b.js", provides(), requires()));
397+
sourceFiles.add(code("/b/c.js", provides(), requires()));
398+
sourceFiles.add(code("/important.js", provides(), requires()));
399+
400+
HashMap<String, List<String>> orderedRequires = new HashMap<>();
401+
orderedRequires.put("/entry.js", ImmutableList.of(
402+
ModuleIdentifier.forFile("/b/b.js").toString(),
403+
ModuleIdentifier.forFile("/b/a.js").toString(),
404+
ModuleIdentifier.forFile("/important.js").toString(),
405+
ModuleIdentifier.forFile("/a/b.js").toString(),
406+
ModuleIdentifier.forFile("/a/a.js").toString()));
407+
orderedRequires.put("/a/a.js", ImmutableList.of());
408+
orderedRequires.put("/a/b.js", ImmutableList.of());
409+
orderedRequires.put("/b/a.js", ImmutableList.of());
410+
orderedRequires.put("/b/b.js", ImmutableList.of(
411+
ModuleIdentifier.forFile("/b/c.js").toString()));
412+
orderedRequires.put("/b/c.js", ImmutableList.of());
413+
orderedRequires.put("/important.js", ImmutableList.of());
414+
415+
DependencyOptions depOptions = new DependencyOptions();
416+
depOptions.setDependencySorting(true);
417+
depOptions.setDependencyPruning(true);
418+
depOptions.setMoocherDropping(true);
419+
depOptions.setEntryPoints(ImmutableList.of(ModuleIdentifier.forFile("/entry.js")));
420+
for (int iterationCount = 0; iterationCount < 10; iterationCount++) {
421+
shuffle(sourceFiles);
422+
A.removeAll();
423+
for (SourceFile sourceFile : sourceFiles) {
424+
A.add(sourceFile);
425+
}
426+
427+
for (CompilerInput input : A.getInputs()) {
428+
input.setCompiler(compiler);
429+
for (String require : orderedRequires.get(input.getSourceFile().getName())) {
430+
input.addOrderedRequire(require);
431+
}
432+
input.setHasFullParseDependencyInfo(true);
433+
}
434+
435+
List<CompilerInput> inputs = new ArrayList<>();
436+
inputs.addAll(A.getInputs());
437+
List<CompilerInput> results = graph.manageDependencies(depOptions, inputs);
438+
439+
assertInputs(A, "/b/c.js", "/b/b.js", "/b/a.js", "/important.js", "/a/b.js", "/a/a.js", "/entry.js");
440+
441+
assertThat(sourceNames(results))
442+
.containsExactly("/b/c.js", "/b/b.js", "/b/a.js", "/important.js", "/a/b.js", "/a/a.js", "/entry.js")
443+
.inOrder();
444+
}
445+
}
446+
447+
347448
private void assertInputs(JSModule module, String... sourceNames) {
348449
assertEquals(ImmutableList.copyOf(sourceNames), sourceNames(module.getInputs()));
349450
}

0 commit comments

Comments
 (0)