| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library code_transformers.test.resolver_test; | 5 library code_transformers.test.resolver_test; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:io' show File, Platform; | 8 import 'dart:io' show File, Platform; |
| 9 | 9 |
| 10 import 'package:barback/barback.dart'; | 10 import 'package:barback/barback.dart'; |
| 11 import 'package:code_transformers/resolver.dart'; | 11 import 'package:code_transformers/resolver.dart'; |
| 12 import 'package:code_transformers/tests.dart'; | 12 import 'package:code_transformers/tests.dart'; |
| 13 import 'package:path/path.dart' as path; | 13 import 'package:path/path.dart' as path; |
| 14 import 'package:unittest/compact_vm_config.dart'; | 14 import 'package:unittest/compact_vm_config.dart'; |
| 15 import 'package:unittest/unittest.dart'; | 15 import 'package:unittest/unittest.dart'; |
| 16 | 16 |
| 17 main() { | 17 main() { |
| 18 useCompactVMConfiguration(); | 18 useCompactVMConfiguration(); |
| 19 | |
| 20 var sdkDir = dartSdkDirectory; | |
| 21 if (sdkDir == null) { | |
| 22 // If we cannot find the SDK dir, then assume this is being run from Dart's | |
| 23 // source directory and this script is the main script. | |
| 24 sdkDir = path.join( | |
| 25 path.dirname(path.fromUri(Platform.script)), '..', '..', '..', 'sdk'); | |
| 26 } | |
| 27 | |
| 28 var entryPoint = new AssetId('a', 'web/main.dart'); | 19 var entryPoint = new AssetId('a', 'web/main.dart'); |
| 29 var resolvers = new Resolvers(sdkDir); | 20 var resolvers = new Resolvers(testingDartSdkDirectory); |
| 30 | 21 |
| 31 Future validateResolver({Map<String, String> inputs, void validator(Resolver), | 22 Future validateResolver({Map<String, String> inputs, void validator(Resolver), |
| 32 List<String> messages: const[]}) { | 23 List<String> messages: const[]}) { |
| 33 return applyTransformers( | 24 return applyTransformers( |
| 34 [[new TestTransformer(resolvers, entryPoint, validator)]], | 25 [[new TestTransformer(resolvers, entryPoint, validator)]], |
| 35 inputs: inputs, | 26 inputs: inputs, |
| 36 messages: messages); | 27 messages: messages); |
| 37 } | 28 } |
| 38 | 29 |
| 39 group('Resolver', () { | 30 group('Resolver', () { |
| 40 | 31 |
| 41 test('should handle empty files', () { | 32 test('should handle empty files', () { |
| 42 return validateResolver( | 33 return validateResolver( |
| 43 inputs: { | 34 inputs: { |
| 44 'a|web/main.dart': '', | 35 'a|web/main.dart': '', |
| 45 }, | 36 }, |
| 46 validator: (resolver) { | 37 validator: (resolver) { |
| 47 var source = resolver.sources[entryPoint]; | 38 var source = resolver.sources[entryPoint]; |
| 48 expect(source.modificationStamp, 1); | 39 expect(source.modificationStamp, 1); |
| 49 | 40 |
| 50 var lib = resolver.entryLibrary; | 41 var lib = resolver.getLibrary(entryPoint); |
| 51 expect(lib, isNotNull); | 42 expect(lib, isNotNull); |
| 52 expect(lib.entryPoint, isNull); | 43 expect(lib.entryPoint, isNull); |
| 53 }); | 44 }); |
| 54 }); | 45 }); |
| 55 | 46 |
| 56 test('should update when sources change', () { | 47 test('should update when sources change', () { |
| 57 return validateResolver( | 48 return validateResolver( |
| 58 inputs: { | 49 inputs: { |
| 59 'a|web/main.dart': ''' main() {} ''', | 50 'a|web/main.dart': ''' main() {} ''', |
| 60 }, | 51 }, |
| 61 validator: (resolver) { | 52 validator: (resolver) { |
| 62 var source = resolver.sources[entryPoint]; | 53 var source = resolver.sources[entryPoint]; |
| 63 expect(source.modificationStamp, 2); | 54 expect(source.modificationStamp, 2); |
| 64 | 55 |
| 65 var lib = resolver.entryLibrary; | 56 var lib = resolver.getLibrary(entryPoint); |
| 66 expect(lib, isNotNull); | 57 expect(lib, isNotNull); |
| 67 expect(lib.entryPoint, isNotNull); | 58 expect(lib.entryPoint, isNotNull); |
| 68 }); | 59 }); |
| 69 }); | 60 }); |
| 70 | 61 |
| 71 test('should follow imports', () { | 62 test('should follow imports', () { |
| 72 return validateResolver( | 63 return validateResolver( |
| 73 inputs: { | 64 inputs: { |
| 74 'a|web/main.dart': ''' | 65 'a|web/main.dart': ''' |
| 75 import 'a.dart'; | 66 import 'a.dart'; |
| 76 | 67 |
| 77 main() { | 68 main() { |
| 78 } ''', | 69 } ''', |
| 79 'a|web/a.dart': ''' | 70 'a|web/a.dart': ''' |
| 80 library a; | 71 library a; |
| 81 ''', | 72 ''', |
| 82 }, | 73 }, |
| 83 validator: (resolver) { | 74 validator: (resolver) { |
| 84 var lib = resolver.entryLibrary; | 75 var lib = resolver.getLibrary(entryPoint); |
| 85 expect(lib.importedLibraries.length, 2); | 76 expect(lib.importedLibraries.length, 2); |
| 86 var libA = lib.importedLibraries.where((l) => l.name == 'a').single; | 77 var libA = lib.importedLibraries.where((l) => l.name == 'a').single; |
| 87 expect(libA.getType('Foo'), isNull); | 78 expect(libA.getType('Foo'), isNull); |
| 88 }); | 79 }); |
| 89 }); | 80 }); |
| 90 | 81 |
| 91 test('should update changed imports', () { | 82 test('should update changed imports', () { |
| 92 return validateResolver( | 83 return validateResolver( |
| 93 inputs: { | 84 inputs: { |
| 94 'a|web/main.dart': ''' | 85 'a|web/main.dart': ''' |
| 95 import 'a.dart'; | 86 import 'a.dart'; |
| 96 | 87 |
| 97 main() { | 88 main() { |
| 98 } ''', | 89 } ''', |
| 99 'a|web/a.dart': ''' | 90 'a|web/a.dart': ''' |
| 100 library a; | 91 library a; |
| 101 class Foo {} | 92 class Foo {} |
| 102 ''', | 93 ''', |
| 103 }, | 94 }, |
| 104 validator: (resolver) { | 95 validator: (resolver) { |
| 105 var lib = resolver.entryLibrary; | 96 var lib = resolver.getLibrary(entryPoint); |
| 106 expect(lib.importedLibraries.length, 2); | 97 expect(lib.importedLibraries.length, 2); |
| 107 var libA = lib.importedLibraries.where((l) => l.name == 'a').single; | 98 var libA = lib.importedLibraries.where((l) => l.name == 'a').single; |
| 108 expect(libA.getType('Foo'), isNotNull); | 99 expect(libA.getType('Foo'), isNotNull); |
| 109 }); | 100 }); |
| 110 }); | 101 }); |
| 111 | 102 |
| 112 test('should follow package imports', () { | 103 test('should follow package imports', () { |
| 113 return validateResolver( | 104 return validateResolver( |
| 114 inputs: { | 105 inputs: { |
| 115 'a|web/main.dart': ''' | 106 'a|web/main.dart': ''' |
| 116 import 'package:b/b.dart'; | 107 import 'package:b/b.dart'; |
| 117 | 108 |
| 118 main() { | 109 main() { |
| 119 } ''', | 110 } ''', |
| 120 'b|lib/b.dart': ''' | 111 'b|lib/b.dart': ''' |
| 121 library b; | 112 library b; |
| 122 ''', | 113 ''', |
| 123 }, | 114 }, |
| 124 validator: (resolver) { | 115 validator: (resolver) { |
| 125 var lib = resolver.entryLibrary; | 116 var lib = resolver.getLibrary(entryPoint); |
| 126 expect(lib.importedLibraries.length, 2); | 117 expect(lib.importedLibraries.length, 2); |
| 127 var libB = lib.importedLibraries.where((l) => l.name == 'b').single; | 118 var libB = lib.importedLibraries.where((l) => l.name == 'b').single; |
| 128 expect(libB.getType('Foo'), isNull); | 119 expect(libB.getType('Foo'), isNull); |
| 129 }); | 120 }); |
| 130 }); | 121 }); |
| 131 | 122 |
| 132 test('should update on changed package imports', () { | 123 test('should update on changed package imports', () { |
| 133 return validateResolver( | 124 return validateResolver( |
| 134 inputs: { | 125 inputs: { |
| 135 'a|web/main.dart': ''' | 126 'a|web/main.dart': ''' |
| 136 import 'package:b/b.dart'; | 127 import 'package:b/b.dart'; |
| 137 | 128 |
| 138 main() { | 129 main() { |
| 139 } ''', | 130 } ''', |
| 140 'b|lib/b.dart': ''' | 131 'b|lib/b.dart': ''' |
| 141 library b; | 132 library b; |
| 142 class Bar {} | 133 class Bar {} |
| 143 ''', | 134 ''', |
| 144 }, | 135 }, |
| 145 validator: (resolver) { | 136 validator: (resolver) { |
| 146 var lib = resolver.entryLibrary; | 137 var lib = resolver.getLibrary(entryPoint); |
| 147 expect(lib.importedLibraries.length, 2); | 138 expect(lib.importedLibraries.length, 2); |
| 148 var libB = lib.importedLibraries.where((l) => l.name == 'b').single; | 139 var libB = lib.importedLibraries.where((l) => l.name == 'b').single; |
| 149 expect(libB.getType('Bar'), isNotNull); | 140 expect(libB.getType('Bar'), isNotNull); |
| 150 }); | 141 }); |
| 151 }); | 142 }); |
| 152 | 143 |
| 153 test('should handle deleted files', () { | 144 test('should handle deleted files', () { |
| 154 return validateResolver( | 145 return validateResolver( |
| 155 inputs: { | 146 inputs: { |
| 156 'a|web/main.dart': ''' | 147 'a|web/main.dart': ''' |
| 157 import 'package:b/b.dart'; | 148 import 'package:b/b.dart'; |
| 158 | 149 |
| 159 main() { | 150 main() { |
| 160 } ''', | 151 } ''', |
| 161 }, | 152 }, |
| 162 messages: [ | 153 messages: [ |
| 163 'error: Unable to find asset for "package:b/b.dart"', | 154 'error: Unable to find asset for "package:b/b.dart"', |
| 164 ], | 155 ], |
| 165 validator: (resolver) { | 156 validator: (resolver) { |
| 166 var lib = resolver.entryLibrary; | 157 var lib = resolver.getLibrary(entryPoint); |
| 167 expect(lib.importedLibraries.length, 1); | 158 expect(lib.importedLibraries.length, 1); |
| 168 }); | 159 }); |
| 169 }); | 160 }); |
| 170 | 161 |
| 171 test('should fail on absolute URIs', () { | 162 test('should fail on absolute URIs', () { |
| 172 return validateResolver( | 163 return validateResolver( |
| 173 inputs: { | 164 inputs: { |
| 174 'a|web/main.dart': ''' | 165 'a|web/main.dart': ''' |
| 175 import '/b.dart'; | 166 import '/b.dart'; |
| 176 | 167 |
| 177 main() { | 168 main() { |
| 178 } ''', | 169 } ''', |
| 179 }, | 170 }, |
| 180 messages: [ | 171 messages: [ |
| 181 // First from the AST walker | 172 // First from the AST walker |
| 182 'error: absolute paths not allowed: "/b.dart" (main.dart 0 14)', | 173 'error: absolute paths not allowed: "/b.dart" (web/main.dart 0 14)', |
| 183 // Then two from the resolver. | 174 // Then two from the resolver. |
| 184 'error: absolute paths not allowed: "/b.dart"', | 175 'error: absolute paths not allowed: "/b.dart"', |
| 185 'error: absolute paths not allowed: "/b.dart"', | 176 'error: absolute paths not allowed: "/b.dart"', |
| 186 ], | 177 ], |
| 187 validator: (resolver) { | 178 validator: (resolver) { |
| 188 var lib = resolver.entryLibrary; | 179 var lib = resolver.getLibrary(entryPoint); |
| 189 expect(lib.importedLibraries.length, 1); | 180 expect(lib.importedLibraries.length, 1); |
| 190 }); | 181 }); |
| 191 }); | 182 }); |
| 192 | 183 |
| 193 test('should list all libraries', () { | 184 test('should list all libraries', () { |
| 194 return validateResolver( | 185 return validateResolver( |
| 195 inputs: { | 186 inputs: { |
| 196 'a|web/main.dart': ''' | 187 'a|web/main.dart': ''' |
| 197 library a.main; | 188 library a.main; |
| 198 import 'package:a/a.dart'; | 189 import 'package:a/a.dart'; |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 321 }); | 312 }); |
| 322 | 313 |
| 323 test('handles parallel resolves', () { | 314 test('handles parallel resolves', () { |
| 324 return Future.wait([ | 315 return Future.wait([ |
| 325 validateResolver( | 316 validateResolver( |
| 326 inputs: { | 317 inputs: { |
| 327 'a|web/main.dart': ''' | 318 'a|web/main.dart': ''' |
| 328 library foo;''' | 319 library foo;''' |
| 329 }, | 320 }, |
| 330 validator: (resolver) { | 321 validator: (resolver) { |
| 331 expect(resolver.entryLibrary.name, 'foo'); | 322 expect(resolver.getLibrary(entryPoint).name, 'foo'); |
| 332 }), | 323 }), |
| 333 validateResolver( | 324 validateResolver( |
| 334 inputs: { | 325 inputs: { |
| 335 'a|web/main.dart': ''' | 326 'a|web/main.dart': ''' |
| 336 library bar;''' | 327 library bar;''' |
| 337 }, | 328 }, |
| 338 validator: (resolver) { | 329 validator: (resolver) { |
| 339 expect(resolver.entryLibrary.name, 'bar'); | 330 expect(resolver.getLibrary(entryPoint).name, 'bar'); |
| 340 }), | 331 }), |
| 341 ]); | 332 ]); |
| 342 }); | 333 }); |
| 343 }); | 334 }); |
| 344 } | 335 } |
| 345 | 336 |
| 346 class TestTransformer extends Transformer with ResolverTransformer { | 337 class TestTransformer extends Transformer with ResolverTransformer { |
| 347 final AssetId primary; | 338 final AssetId primary; |
| 348 final Function validator; | 339 final Function validator; |
| 349 | 340 |
| 350 TestTransformer(Resolvers resolvers, this.primary, this.validator) { | 341 TestTransformer(Resolvers resolvers, this.primary, this.validator) { |
| 351 this.resolvers = resolvers; | 342 this.resolvers = resolvers; |
| 352 } | 343 } |
| 353 | 344 |
| 354 Future<bool> isPrimary(Asset input) => | 345 Future<bool> isPrimary(Asset input) => |
| 355 new Future.value(input.id == primary); | 346 new Future.value(input.id == primary); |
| 356 | 347 |
| 357 applyResolver(Transform transform, Resolver resolver) { | 348 applyResolver(Transform transform, Resolver resolver) { |
| 358 return validator(resolver); | 349 return validator(resolver); |
| 359 } | 350 } |
| 360 } | 351 } |
| OLD | NEW |