Index: packages/initialize/test/transformer_test.dart |
diff --git a/packages/initialize/test/transformer_test.dart b/packages/initialize/test/transformer_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3b637c76f50250e8f600e9969bc22c77ee870ceb |
--- /dev/null |
+++ b/packages/initialize/test/transformer_test.dart |
@@ -0,0 +1,421 @@ |
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+library initialize.transformer_test; |
+ |
+import 'common.dart'; |
+import 'package:analyzer/src/generated/element.dart'; |
+import 'package:dart_style/dart_style.dart'; |
+import 'package:initialize/transformer.dart'; |
+import 'package:unittest/compact_vm_config.dart'; |
+import 'package:unittest/unittest.dart'; |
+ |
+var formatter = new DartFormatter(); |
+ |
+main() { |
+ useCompactVMConfiguration(); |
+ |
+ group('Html entry points', htmlEntryPointTests); |
+ group('Dart entry points', dartEntryPointTests); |
+ group('InitializerPlugins', pluginTests); |
+} |
+ |
+void htmlEntryPointTests() { |
+ var phases = [[new InitializeTransformer(['web/*.html'])]]; |
+ |
+ testPhases('basic', phases, { |
+ 'a|web/index.html': ''' |
+ <html><head></head><body> |
+ <script type="application/dart" src="index.dart"></script> |
+ </body></html> |
+ '''.replaceAll(' ', ''), |
+ 'a|web/index.dart': ''' |
+ library web_foo; |
+ |
+ import 'foo.dart'; |
+ ''', |
+ 'a|web/foo.dart': ''' |
+ @constInit |
+ library foo; |
+ |
+ import 'package:initialize/initialize.dart'; |
+ import 'package:test_initializers/common.dart'; |
+ import 'package:bar/bar.dart'; |
+ |
+ @constInit |
+ class Foo extends Bar {} |
+ |
+ @initMethod |
+ foo() {} |
+ ''', |
+ 'bar|lib/bar.dart': ''' |
+ @DynamicInit('bar') |
+ @DynamicInit('bar2') |
+ library bar; |
+ |
+ import 'package:initialize/initialize.dart'; |
+ import 'package:test_initializers/common.dart'; |
+ import 'baz.dart'; |
+ |
+ @DynamicInit('Bar') |
+ @DynamicInit('Bar2') |
+ class Bar {} |
+ |
+ @DynamicInit('bar()') |
+ @initMethod |
+ bar() {} |
+ ''', |
+ 'bar|lib/baz.dart': ''' |
+ @constInit |
+ library baz; |
+ |
+ import 'package:test_initializers/common.dart'; |
+ ''', |
+ // Mock out the Initialize package plus some initializers. |
+ 'initialize|lib/initialize.dart': mockInitialize, |
+ 'test_initializers|lib/common.dart': commonInitializers, |
+ }, { |
+ 'a|web/index.html': ''' |
+ <html><head></head><body> |
+ <script type="application/dart" src="index.initialize.dart"></script> |
+ |
+ </body></html>'''.replaceAll(' ', ''), |
+ 'a|web/index.initialize.dart': formatter.format(''' |
+ import 'package:initialize/src/static_loader.dart'; |
+ import 'package:initialize/initialize.dart'; |
+ import 'index.dart' as i0; |
+ import 'package:bar/baz.dart' as i1; |
+ import 'package:test_initializers/common.dart' as i2; |
+ import 'package:bar/bar.dart' as i3; |
+ import 'package:initialize/initialize.dart' as i4; |
+ import 'foo.dart' as i5; |
+ |
+ main() { |
+ initializers.addAll([ |
+ new InitEntry(i2.constInit, const LibraryIdentifier(#baz, 'bar', 'baz.dart')), |
+ new InitEntry(const i2.DynamicInit('bar'), const LibraryIdentifier(#bar, 'bar', 'bar.dart')), |
+ new InitEntry(const i2.DynamicInit('bar2'), const LibraryIdentifier(#bar, 'bar', 'bar.dart')), |
+ new InitEntry(const i2.DynamicInit('bar()'), i3.bar), |
+ new InitEntry(i4.initMethod, i3.bar), |
+ new InitEntry(const i2.DynamicInit('Bar'), i3.Bar), |
+ new InitEntry(const i2.DynamicInit('Bar2'), i3.Bar), |
+ new InitEntry(i2.constInit, const LibraryIdentifier(#foo, null, 'foo.dart')), |
+ new InitEntry(i4.initMethod, i5.foo), |
+ new InitEntry(i2.constInit, i5.Foo), |
+ ]); |
+ |
+ return i0.main(); |
+ } |
+ ''') |
+ }, []); |
+} |
+ |
+void dartEntryPointTests() { |
+ var phases = [[new InitializeTransformer(['web/index.dart'])]]; |
+ |
+ testPhases('constructor arguments', phases, { |
+ 'a|web/index.dart': ''' |
+ @DynamicInit(foo) |
+ @DynamicInit(_foo) |
+ @DynamicInit(Foo.foo) |
+ @DynamicInit(bar.Foo.bar) |
+ @DynamicInit(bar.Foo.foo) |
+ @DynamicInit(const [foo, Foo.foo, 'foo']) |
+ @DynamicInit(const {'foo': foo, 'Foo.foo': Foo.foo, 'bar': 'bar'}) |
+ @DynamicInit('foo') |
+ @DynamicInit(true) |
+ @DynamicInit(null) |
+ @DynamicInit(1) |
+ @DynamicInit(1.1) |
+ @DynamicInit('foo-\$x\${y}') |
+ @DynamicInit(1 + 2) |
+ @DynamicInit(1.0 + 0.2) |
+ @DynamicInit(1 == 1) |
+ @NamedArgInit(1, name: 'Bill') |
+ library web_foo; |
+ |
+ import 'package:test_initializers/common.dart'; |
+ import 'foo.dart'; |
+ import 'foo.dart' as bar; |
+ |
+ const x = 'x'; |
+ const y = 'y'; |
+ const _foo = '_foo'; |
+ |
+ class MyConst { |
+ const MyConst; |
+ } |
+ ''', |
+ 'a|web/foo.dart': ''' |
+ library foo; |
+ |
+ const String foo = 'foo'; |
+ |
+ class Bar { |
+ const Bar(); |
+ } |
+ |
+ class Foo { |
+ static foo = 'Foo.foo'; |
+ static bar = const Bar(); |
+ } |
+ ''', |
+ // Mock out the Initialize package plus some initializers. |
+ 'initialize|lib/initialize.dart': mockInitialize, |
+ 'test_initializers|lib/common.dart': commonInitializers, |
+ }, { |
+ 'a|web/index.initialize.dart': formatter.format(''' |
+ import 'package:initialize/src/static_loader.dart'; |
+ import 'package:initialize/initialize.dart'; |
+ import 'index.dart' as i0; |
+ import 'package:test_initializers/common.dart' as i1; |
+ import 'foo.dart' as i2; |
+ |
+ main() { |
+ initializers.addAll([ |
+ new InitEntry(const i1.DynamicInit(i2.foo), const LibraryIdentifier(#web_foo, null, 'index.dart')), |
+ new InitEntry(const i1.DynamicInit('_foo'), const LibraryIdentifier(#web_foo, null, 'index.dart')), |
+ new InitEntry(const i1.DynamicInit(i2.Foo.foo), const LibraryIdentifier(#web_foo, null, 'index.dart')), |
+ new InitEntry(const i1.DynamicInit(i2.Foo.bar), const LibraryIdentifier(#web_foo, null, 'index.dart')), |
+ new InitEntry(const i1.DynamicInit(i2.Foo.foo), const LibraryIdentifier(#web_foo, null, 'index.dart')), |
+ new InitEntry(const i1.DynamicInit(const [i2.foo, i2.Foo.foo, 'foo']), const LibraryIdentifier(#web_foo, null, 'index.dart')), |
+ new InitEntry(const i1.DynamicInit(const {'foo': i2.foo, 'Foo.foo': i2.Foo.foo, 'bar': 'bar'}), const LibraryIdentifier(#web_foo, null, 'index.dart')), |
+ new InitEntry(const i1.DynamicInit('foo'), const LibraryIdentifier(#web_foo, null, 'index.dart')), |
+ new InitEntry(const i1.DynamicInit(true), const LibraryIdentifier(#web_foo, null, 'index.dart')), |
+ new InitEntry(const i1.DynamicInit(null), const LibraryIdentifier(#web_foo, null, 'index.dart')), |
+ new InitEntry(const i1.DynamicInit(1), const LibraryIdentifier(#web_foo, null, 'index.dart')), |
+ new InitEntry(const i1.DynamicInit(1.1), const LibraryIdentifier(#web_foo, null, 'index.dart')), |
+ new InitEntry(const i1.DynamicInit('foo-xy'), const LibraryIdentifier(#web_foo, null, 'index.dart')), |
+ new InitEntry(const i1.DynamicInit(3), const LibraryIdentifier(#web_foo, null, 'index.dart')), |
+ new InitEntry(const i1.DynamicInit(1.2), const LibraryIdentifier(#web_foo, null, 'index.dart')), |
+ new InitEntry(const i1.DynamicInit(true), const LibraryIdentifier(#web_foo, null, 'index.dart')), |
+ new InitEntry(const i1.NamedArgInit(1, name: 'Bill'), const LibraryIdentifier(#web_foo, null, 'index.dart')), |
+ ]); |
+ |
+ return i0.main(); |
+ } |
+ ''') |
+ }, []); |
+ |
+ testPhases('exported library annotations', phases, { |
+ 'a|web/index.dart': ''' |
+ library web_foo; |
+ |
+ export 'foo.dart'; |
+ ''', |
+ 'a|web/foo.dart': ''' |
+ @constInit |
+ library foo; |
+ |
+ import 'package:test_initializers/common.dart'; |
+ |
+ @constInit |
+ foo() {}; |
+ |
+ @constInit |
+ class Foo {} |
+ ''', |
+ // Mock out the Initialize package plus some initializers. |
+ 'initialize|lib/initialize.dart': mockInitialize, |
+ 'test_initializers|lib/common.dart': commonInitializers, |
+ }, { |
+ 'a|web/index.initialize.dart': formatter.format(''' |
+ import 'package:initialize/src/static_loader.dart'; |
+ import 'package:initialize/initialize.dart'; |
+ import 'index.dart' as i0; |
+ import 'foo.dart' as i1; |
+ import 'package:test_initializers/common.dart' as i2; |
+ |
+ main() { |
+ initializers.addAll([ |
+ new InitEntry(i2.constInit, const LibraryIdentifier(#foo, null, 'foo.dart')), |
+ new InitEntry(i2.constInit, i1.foo), |
+ new InitEntry(i2.constInit, i1.Foo), |
+ ]); |
+ |
+ return i0.main(); |
+ } |
+ ''') |
+ }, []); |
+ |
+ testPhases('imports from exported libraries', phases, { |
+ 'a|web/index.dart': ''' |
+ library web_foo; |
+ |
+ export 'foo.dart'; |
+ ''', |
+ 'a|web/foo.dart': ''' |
+ library foo; |
+ |
+ import 'foo/bar.dart'; |
+ ''', |
+ 'a|web/foo/bar.dart': ''' |
+ @constInit |
+ library bar; |
+ |
+ import 'package:test_initializers/common.dart'; |
+ |
+ @constInit |
+ bar() {}; |
+ |
+ @constInit |
+ class Bar {} |
+ ''', |
+ // Mock out the Initialize package plus some initializers. |
+ 'initialize|lib/initialize.dart': mockInitialize, |
+ 'test_initializers|lib/common.dart': commonInitializers, |
+ }, { |
+ 'a|web/index.initialize.dart': formatter.format(''' |
+ import 'package:initialize/src/static_loader.dart'; |
+ import 'package:initialize/initialize.dart'; |
+ import 'index.dart' as i0; |
+ import 'foo/bar.dart' as i1; |
+ import 'package:test_initializers/common.dart' as i2; |
+ |
+ main() { |
+ initializers.addAll([ |
+ new InitEntry(i2.constInit, const LibraryIdentifier(#bar, null, 'foo/bar.dart')), |
+ new InitEntry(i2.constInit, i1.bar), |
+ new InitEntry(i2.constInit, i1.Bar), |
+ ]); |
+ |
+ return i0.main(); |
+ } |
+ ''') |
+ }, []); |
+ |
+ testPhases('library parts and exports', phases, { |
+ 'a|web/index.dart': ''' |
+ @constInit |
+ library index; |
+ |
+ import 'package:test_initializers/common.dart'; |
+ export 'export.dart'; |
+ |
+ part 'foo.dart'; |
+ part 'bar.dart'; |
+ |
+ @constInit |
+ index() {}; |
+ |
+ @constInit |
+ class Index {}; |
+ ''', |
+ 'a|web/foo.dart': ''' |
+ part of index; |
+ |
+ @constInit |
+ foo() {}; |
+ |
+ @constInit |
+ class Foo {}; |
+ ''', |
+ 'a|web/bar.dart': ''' |
+ part of index; |
+ |
+ @constInit |
+ bar() {}; |
+ |
+ @constInit |
+ class Bar {}; |
+ ''', |
+ 'a|web/export.dart': ''' |
+ @constInit |
+ library export; |
+ |
+ import 'package:test_initializers/common.dart'; |
+ |
+ @constInit |
+ class Export {}; |
+ ''', |
+ // Mock out the Initialize package plus some initializers. |
+ 'initialize|lib/initialize.dart': mockInitialize, |
+ 'test_initializers|lib/common.dart': commonInitializers, |
+ }, { |
+ 'a|web/index.initialize.dart': formatter.format(''' |
+ import 'package:initialize/src/static_loader.dart'; |
+ import 'package:initialize/initialize.dart'; |
+ import 'index.dart' as i0; |
+ import 'export.dart' as i1; |
+ import 'package:test_initializers/common.dart' as i2; |
+ |
+ main() { |
+ initializers.addAll([ |
+ new InitEntry(i2.constInit, const LibraryIdentifier(#export, null, 'export.dart')), |
+ new InitEntry(i2.constInit, i1.Export), |
+ new InitEntry(i2.constInit, const LibraryIdentifier(#index, null, 'index.dart')), |
+ new InitEntry(i2.constInit, i0.bar), |
+ new InitEntry(i2.constInit, i0.foo), |
+ new InitEntry(i2.constInit, i0.index), |
+ new InitEntry(i2.constInit, i0.Bar), |
+ new InitEntry(i2.constInit, i0.Foo), |
+ new InitEntry(i2.constInit, i0.Index), |
+ ]); |
+ |
+ return i0.main(); |
+ } |
+ ''') |
+ }, []); |
+} |
+ |
+class SkipConstructorsPlugin extends InitializerPlugin { |
+ bool shouldApply(InitializerPluginData data) { |
+ return data.initializer.annotationElement.element is ConstructorElement; |
+ } |
+ |
+ String apply(_) => null; |
+} |
+ |
+void pluginTests() { |
+ var phases = [ |
+ [ |
+ new InitializeTransformer(['web/index.dart'], |
+ plugins: [new SkipConstructorsPlugin()]) |
+ ] |
+ ]; |
+ |
+ testPhases('can omit statements', phases, { |
+ 'a|web/index.dart': ''' |
+ library index; |
+ |
+ import 'package:initialize/initialize.dart'; |
+ import 'package:test_initializers/common.dart'; |
+ import 'foo.dart'; |
+ |
+ @initMethod |
+ @DynamicInit('index') |
+ index() {} |
+ ''', |
+ 'a|web/foo.dart': ''' |
+ library foo; |
+ |
+ import 'package:initialize/initialize.dart'; |
+ import 'package:test_initializers/common.dart'; |
+ |
+ @initMethod |
+ @DynamicInit('Foo') |
+ foo() {} |
+ ''', |
+ // Mock out the Initialize package plus some initializers. |
+ 'initialize|lib/initialize.dart': mockInitialize, |
+ 'test_initializers|lib/common.dart': commonInitializers, |
+ }, { |
+ 'a|web/index.initialize.dart': formatter.format(''' |
+ import 'package:initialize/src/static_loader.dart'; |
+ import 'package:initialize/initialize.dart'; |
+ import 'index.dart' as i0; |
+ import 'foo.dart' as i1; |
+ import 'package:initialize/initialize.dart' as i2; |
+ import 'package:test_initializers/common.dart' as i3; |
+ |
+ main() { |
+ initializers.addAll([ |
+ new InitEntry(i2.initMethod, i1.foo), |
+ new InitEntry(i2.initMethod, i0.index), |
+ ]); |
+ |
+ return i0.main(); |
+ } |
+ ''') |
+ }, []); |
+} |