Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(996)

Side by Side Diff: pkg/front_end/test/src/incremental/file_state_test.dart

Issue 2879783002: Compute topologically sorted library cycles. (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 import 'package:front_end/memory_file_system.dart';
6 import 'package:front_end/src/fasta/translate_uri.dart';
7 import 'package:front_end/src/incremental/file_state.dart';
8 import 'package:test/test.dart';
9 import 'package:test_reflective_loader/test_reflective_loader.dart';
10
11 import 'mock_sdk.dart';
12
13 main() {
14 defineReflectiveSuite(() {
15 defineReflectiveTests(FileSystemStateTest);
16 });
17 }
18
19 @reflectiveTest
20 class FileSystemStateTest {
21 final fileSystem = new MemoryFileSystem(Uri.parse('file:///'));
22 final TranslateUri uriTranslator = new TranslateUri({}, {});
23 FileSystemState fsState;
24
25 Uri _coreUri;
26
27 void setUp() {
28 Map<String, Uri> dartLibraries = createSdkFiles(fileSystem);
29 uriTranslator.dartLibraries.addAll(dartLibraries);
30 _coreUri = uriTranslator.dartLibraries['core'];
31 expect(_coreUri, isNotNull);
32 fsState = new FileSystemState(fileSystem, uriTranslator);
33 }
34
35 test_getFile() async {
36 var a = writeFile('/a.dart', '');
37 var b = writeFile('/b.dart', '');
38 var c = writeFile('/c.dart', '');
39 var d = writeFile(
40 '/d.dart',
41 r'''
42 import "a.dart";
43 export "b.dart";
44 part "c.dart";
45 ''');
46
47 FileState aFile = await fsState.getFile(a);
48 FileState bFile = await fsState.getFile(b);
49 FileState cFile = await fsState.getFile(c);
50 FileState dFile = await fsState.getFile(d);
51
52 expect(dFile.fileUri, d);
53 expect(dFile.exists, isTrue);
54 _assertImportedUris(dFile, [a, _coreUri]);
55 expect(dFile.importedFiles, contains(aFile));
56 expect(dFile.exportedFiles, contains(bFile));
57 expect(dFile.partFiles, contains(cFile));
58
59 expect(aFile.fileUri, a);
60 expect(aFile.exists, isTrue);
61 _assertImportedUris(aFile, [_coreUri]);
62 expect(aFile.exportedFiles, isEmpty);
63 expect(aFile.partFiles, isEmpty);
64
65 expect(bFile.fileUri, b);
66 expect(bFile.exists, isTrue);
67 _assertImportedUris(bFile, [_coreUri]);
68 expect(bFile.exportedFiles, isEmpty);
69 expect(bFile.partFiles, isEmpty);
70 }
71
72 test_topologicalOrder_cycleBeforeTarget() async {
73 var aUri = _writeFileDirectives('/a.dart');
74 var bUri = _writeFileDirectives('/b.dart', imports: ['c.dart']);
75 var cUri = _writeFileDirectives('/c.dart', imports: ['b.dart']);
76 var dUri = _writeFileDirectives('/d.dart', imports: ['a.dart', 'b.dart']);
77
78 FileState core = await fsState.getFile(_coreUri);
79 FileState a = await fsState.getFile(aUri);
80 FileState b = await fsState.getFile(bUri);
81 FileState c = await fsState.getFile(cUri);
82 FileState d = await fsState.getFile(dUri);
83
84 List<LibraryCycle> order = d.topologicalOrder;
85 expect(order, hasLength(4));
86 expect(order[0].libraries, contains(core));
87 expect(order[1].libraries, unorderedEquals([a]));
88 expect(order[2].libraries, unorderedEquals([b, c]));
89 expect(order[3].libraries, unorderedEquals([d]));
90 }
91
92 test_topologicalOrder_cycleBeforeTarget_export() async {
93 var aUri = _writeFileDirectives('/a.dart');
94 var bUri = _writeFileDirectives('/b.dart', exports: ['c.dart']);
95 var cUri = _writeFileDirectives('/c.dart', imports: ['b.dart']);
96 var dUri = _writeFileDirectives('/d.dart', imports: ['a.dart', 'b.dart']);
97
98 FileState core = await fsState.getFile(_coreUri);
99 FileState a = await fsState.getFile(aUri);
100 FileState b = await fsState.getFile(bUri);
101 FileState c = await fsState.getFile(cUri);
102 FileState d = await fsState.getFile(dUri);
103
104 List<LibraryCycle> order = d.topologicalOrder;
105 expect(order, hasLength(4));
106 expect(order[0].libraries, contains(core));
107 expect(order[1].libraries, unorderedEquals([a]));
108 expect(order[2].libraries, unorderedEquals([b, c]));
109 expect(order[3].libraries, unorderedEquals([d]));
110 }
111
112 test_topologicalOrder_cycleWithTarget() async {
113 var aUri = _writeFileDirectives('/a.dart');
114 var bUri = _writeFileDirectives('/b.dart', imports: ['c.dart']);
115 var cUri = _writeFileDirectives('/c.dart', imports: ['a.dart', 'b.dart']);
116
117 FileState core = await fsState.getFile(_coreUri);
118 FileState a = await fsState.getFile(aUri);
119 FileState b = await fsState.getFile(bUri);
120 FileState c = await fsState.getFile(cUri);
121
122 List<LibraryCycle> order = c.topologicalOrder;
123 expect(order, hasLength(3));
124 expect(order[0].libraries, contains(core));
125 expect(order[1].libraries, unorderedEquals([a]));
126 expect(order[2].libraries, unorderedEquals([b, c]));
127 }
128
129 /// Write the given [text] of the file with the given [path] into the
130 /// virtual filesystem. Return the URI of the file.
131 Uri writeFile(String path, String text) {
132 Uri uri = Uri.parse('file://$path');
133 fileSystem.entityForUri(uri).writeAsStringSync(text);
134 return uri;
135 }
136
137 void _assertImportedUris(FileState file, List<Uri> expectedUris) {
138 Iterable<Uri> importedUris = _toFileUris(file.importedFiles);
139 expect(importedUris, unorderedEquals(expectedUris));
140 }
141
142 Iterable<Uri> _toFileUris(List<FileState> files) {
143 return files.map((f) => f.fileUri);
144 }
145
146 Uri _writeFileDirectives(String path,
147 {List<String> imports: const [], List<String> exports: const []}) {
148 return writeFile(
149 path,
150 '''
151 ${imports.map((uri) => 'import "$uri";').join('\n')}
152 ${exports.map((uri) => 'export "$uri";').join('\n')}
153 ''');
154 }
155 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698