OLD | NEW |
(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 } |
OLD | NEW |