Chromium Code Reviews| Index: pkg/polymer/test/build/script_compactor_test.dart |
| diff --git a/pkg/polymer/test/build/script_compactor_test.dart b/pkg/polymer/test/build/script_compactor_test.dart |
| index 2d32a746c4f0e0770aa3c6fe318d6857700dbbe0..f74931c161c749305044455b74bf3667c5ca08ea 100644 |
| --- a/pkg/polymer/test/build/script_compactor_test.dart |
| +++ b/pkg/polymer/test/build/script_compactor_test.dart |
| @@ -4,16 +4,24 @@ |
| library polymer.test.build.script_compactor_test; |
| +import 'package:code_transformers/tests.dart' show testingDartSdkDirectory; |
| import 'package:polymer/src/build/common.dart'; |
| import 'package:polymer/src/build/script_compactor.dart'; |
| +import 'package:smoke/codegen/generator.dart' show DEFAULT_IMPORTS; |
| import 'package:unittest/compact_vm_config.dart'; |
| +import 'package:unittest/unittest.dart'; |
| import 'common.dart'; |
| void main() { |
| useCompactVMConfiguration(); |
| - var phases = [[new ScriptCompactor(new TransformOptions())]]; |
| + var phases = [[new ScriptCompactor(new TransformOptions(), |
| + sdkDir: testingDartSdkDirectory)]]; |
| + group('initializers', () => initializerTests(phases)); |
| + group('codegen', () => codegenTests(phases)); |
| +} |
| +initializerTests(phases) { |
| testPhases('no changes', phases, { |
| 'a|web/test.html': '<!DOCTYPE html><html></html>', |
| 'a|web/test.html.scriptUrls': '[]', |
| @@ -36,7 +44,10 @@ void main() { |
| '<!DOCTYPE html><html><head>' |
| '<script type="application/dart" src="a.dart"></script>', |
| 'a|web/test.html.scriptUrls': '[]', |
| - 'a|web/a.dart': 'library a;\nmain(){}', |
| + 'a|web/a.dart': |
| + 'library a;\n' |
| + 'import "package:polymer/polymer.dart";\n' |
| + 'main(){}', |
| }, { |
| 'a|web/test.html': |
| '<!DOCTYPE html><html><head>' |
| @@ -47,14 +58,20 @@ void main() { |
| 'a|web/test.html_bootstrap.dart': |
| '''$MAIN_HEADER |
| import 'a.dart' as i0; |
| + ${DEFAULT_IMPORTS.join('\n')} |
| void main() { |
| + useGeneratedCode(new StaticConfiguration( |
| + checkedMode: false)); |
| configureForDeployment([ |
| ]); |
| i0.main(); |
| } |
| '''.replaceAll('\n ', '\n'), |
| - 'a|web/a.dart': 'library a;\nmain(){}', |
| + 'a|web/a.dart': |
| + 'library a;\n' |
| + 'import "package:polymer/polymer.dart";\n' |
| + 'main(){}', |
| }); |
| testPhases('several scripts', phases, { |
| @@ -65,13 +82,17 @@ void main() { |
| '</div>', |
| 'a|web/test.html.scriptUrls': |
| '[["a", "web/a.dart"],["a", "web/b.dart"],["a", "web/c.dart"]]', |
| - 'a|web/d.dart': 'library d;\nmain(){}\n@initMethod mD(){}', |
| + 'a|web/d.dart': |
| + 'library d;\n' |
| + 'import "package:polymer/polymer.dart";\n' |
| + 'main(){}\n@initMethod mD(){}', |
| 'a|web/a.dart': |
| 'import "package:polymer/polymer.dart";\n' |
| '@initMethod mA(){}\n', |
| 'a|web/b.dart': |
| + 'import "package:polymer/polymer.dart";\n' |
| 'export "e.dart";\n' |
| 'export "f.dart" show XF1, mF1;\n' |
| 'export "g.dart" hide XG1, mG1;\n' |
| @@ -80,11 +101,11 @@ void main() { |
| 'a|web/c.dart': |
| 'import "package:polymer/polymer.dart";\n' |
| - 'part "c_part.dart"\n' |
| - '@CustomTag("x-c2") class XC2 {}\n', |
| + 'part "c_part.dart";\n' |
| + '@CustomTag("x-c1") class XC1 {}\n', |
| 'a|web/c_part.dart': |
| - '@CustomTag("x-c1") class XC1 {}\n', |
| + '@CustomTag("x-c2") class XC2 {}\n', |
| 'a|web/e.dart': |
| 'import "package:polymer/polymer.dart";\n' |
| @@ -125,18 +146,34 @@ void main() { |
| import 'b.dart' as i1; |
| import 'c.dart' as i2; |
| import 'd.dart' as i3; |
| + ${DEFAULT_IMPORTS.join('\n')} |
| + import 'e.dart' as smoke_0; |
| + import 'f.dart' as smoke_1; |
| + import 'g.dart' as smoke_2; |
| + import 'h.dart' as smoke_3; |
| + import 'c.dart' as smoke_4; |
| void main() { |
| + useGeneratedCode(new StaticConfiguration( |
| + checkedMode: false, |
| + declarations: { |
| + smoke_4.XC1: const {}, |
| + smoke_4.XC2: const {}, |
| + smoke_0.XE: const {}, |
| + smoke_1.XF1: const {}, |
| + smoke_2.XG2: const {}, |
| + smoke_3.XH1: const {}, |
| + })); |
| configureForDeployment([ |
| i0.mA, |
| () => Polymer.register('x-e', i1.XE), |
| - i1.mE, |
| () => Polymer.register('x-f1', i1.XF1), |
| - i1.mF1, |
| () => Polymer.register('x-g2', i1.XG2), |
| - i1.mG2, |
| () => Polymer.register('x-h1', i1.XH1), |
| i1.mB, |
| + i1.mE, |
| + i1.mF1, |
| + i1.mG2, |
| () => Polymer.register('x-c1', i2.XC1), |
| () => Polymer.register('x-c2', i2.XC2), |
| i3.mD, |
| @@ -144,5 +181,313 @@ void main() { |
| i3.main(); |
| } |
| '''.replaceAll('\n ', '\n'), |
| + }, null); |
| +} |
| + |
| +codegenTests(phases) { |
| + testPhases('bindings', phases, { |
| + 'a|web/test.html': |
| + '<!DOCTYPE html><html><body>' |
| + '<polymer-element name="foo-bar"><template>' |
| + '<div>{{a.node}}</div>' |
| + '<div>{{anotherNode}}</div>' |
| + '<div class="{{an.attribute}}"></div>' |
| + '<a href="path/{{within.an.attribute}}/foo/bar"></a>' |
| + '<div data-attribute="{{anotherAttribute}}"></div>' |
| + // input and custom-element attributes are treated as 2-way bindings: |
| + '<input value="{{this.is.twoWay}}">' |
| + '<something-else my-attribute="{{here.too}}"></something-else>' |
| + '<div on-click="{{methodName}}"></div>' |
| + '<div on-click="{{@read.method}}"></div>' |
| + '</template></polymer-element>' |
| + '<script type="application/dart" src="a.dart"></script>', |
| + 'a|web/test.html.scriptUrls': '[]', |
| + 'a|web/a.dart': |
| + 'library a;\n' |
| + 'import "package:polymer/polymer.dart";\n' |
| + 'main(){}', |
| + }, { |
| + 'a|web/test.html_bootstrap.dart': |
| + '''$MAIN_HEADER |
| + import 'a.dart' as i0; |
| + ${DEFAULT_IMPORTS.join('\n')} |
| + |
| + void main() { |
| + useGeneratedCode(new StaticConfiguration( |
| + checkedMode: false, |
| + getters: { |
| + #a: (o) => o.a, |
| + #an: (o) => o.an, |
| + #anotherAttribute: (o) => o.anotherAttribute, |
| + #anotherNode: (o) => o.anotherNode, |
| + #attribute: (o) => o.attribute, |
| + #here: (o) => o.here, |
| + #is: (o) => o.is, |
| + #method: (o) => o.method, |
| + #methodName: (o) => o.methodName, |
| + #node: (o) => o.node, |
| + #read: (o) => o.read, |
| + #too: (o) => o.too, |
| + #twoWay: (o) => o.twoWay, |
| + #within: (o) => o.within, |
| + }, |
| + setters: { |
| + #too: (o, v) { o.too = v; }, |
| + #twoWay: (o, v) { o.twoWay = v; }, |
| + }, |
| + names: { |
| + #a: r'a', |
| + #an: r'an', |
| + #anotherAttribute: r'anotherAttribute', |
|
Jennifer Messerly
2014/03/27 02:20:32
not related to this CL but, I wonder if we should
Siggi Cherem (dart-lang)
2014/03/28 01:04:26
Good point. It would be totally doable. That will
|
| + #anotherNode: r'anotherNode', |
| + #attribute: r'attribute', |
| + #here: r'here', |
| + #is: r'is', |
| + #method: r'method', |
| + #methodName: r'methodName', |
| + #node: r'node', |
| + #read: r'read', |
| + #too: r'too', |
| + #twoWay: r'twoWay', |
| + #within: r'within', |
| + })); |
| + configureForDeployment([ |
| + ]); |
| + i0.main(); |
| + } |
| + '''.replaceAll('\n ', '\n'), |
| + 'a|web/a.dart': |
| + 'library a;\n' |
| + 'import "package:polymer/polymer.dart";\n' |
| + 'main(){}', |
| + }); |
| + |
| + final field1Details = "annotations: const [smoke_1.published]"; |
| + final field3Details = "isFinal: true, annotations: const [smoke_1.published]"; |
| + final prop1Details = "kind: PROPERTY, annotations: const [smoke_1.published]"; |
| + final prop3Details = |
| + "kind: PROPERTY, isFinal: true, annotations: const [smoke_1.published]"; |
| + testPhases('published via annotation', phases, { |
| + 'a|web/test.html': |
| + '<!DOCTYPE html><html><body>' |
| + '<script type="application/dart" src="a.dart"></script>', |
| + 'a|web/test.html.scriptUrls': '[]', |
| + 'a|web/a.dart': |
| + 'library a;\n' |
| + 'import "package:polymer/polymer.dart";\n' |
| + '@CustomTag("x-foo")\n' |
| + 'class XFoo {\n' |
| + ' @published int field1;\n' |
| + ' int field2;\n' |
| + ' @published final int field3;\n' |
| + ' final int field4;\n' |
| + ' @published int get prop1 => 1;\n' |
| + ' set prop1(int x) {};\n' |
| + ' int get prop2 => 2;\n' |
| + ' set prop2(int x) {};\n' |
| + ' @published int get prop3 => 3;\n' |
| + ' int get prop4 => 4;\n' |
| + ' @published int method1() => 1;\n' |
| + ' int method2() => 2;\n' |
| + '}\n' |
| + 'main(){}', |
| + }, { |
| + 'a|web/test.html_bootstrap.dart': |
| + '''$MAIN_HEADER |
| + import 'a.dart' as i0; |
| + ${DEFAULT_IMPORTS.join('\n')} |
| + import 'a.dart' as smoke_0; |
| + import 'package:polymer/polymer.dart' as smoke_1; |
| + |
| + void main() { |
| + useGeneratedCode(new StaticConfiguration( |
| + checkedMode: false, |
| + getters: { |
| + #field1: (o) => o.field1, |
| + #field3: (o) => o.field3, |
| + #prop1: (o) => o.prop1, |
| + #prop3: (o) => o.prop3, |
| + }, |
| + setters: { |
| + #field1: (o, v) { o.field1 = v; }, |
| + #prop1: (o, v) { o.prop1 = v; }, |
| + }, |
| + declarations: { |
| + smoke_0.XFoo: { |
| + #field1: const Declaration(#field1, int, $field1Details), |
| + #field3: const Declaration(#field3, int, $field3Details), |
| + #prop1: const Declaration(#prop1, int, $prop1Details), |
| + #prop3: const Declaration(#prop3, int, $prop3Details), |
| + }, |
| + }, |
| + names: { |
| + #field1: r'field1', |
| + #field3: r'field3', |
| + #prop1: r'prop1', |
| + #prop3: r'prop3', |
| + })); |
| + configureForDeployment([ |
| + () => Polymer.register(\'x-foo\', i0.XFoo), |
| + ]); |
| + i0.main(); |
| + } |
| + '''.replaceAll('\n ', '\n'), |
| + }); |
| + |
| + testPhases('published via attributes', phases, { |
| + 'a|web/test.html': |
| + '<!DOCTYPE html><html><body>' |
| + '<polymer-element name="x-foo" attributes="field1,prop2">' |
| + '</polymer-element>' |
| + '<script type="application/dart" src="a.dart"></script>', |
| + 'a|web/test.html.scriptUrls': '[]', |
| + 'a|web/a.dart': |
| + 'library a;\n' |
| + 'import "package:polymer/polymer.dart";\n' |
| + '@CustomTag("x-foo")\n' |
| + 'class XFoo {\n' |
| + ' int field1;\n' |
| + ' int field2;\n' |
| + ' int get prop1 => 1;\n' |
| + ' set prop1(int x) {};\n' |
| + ' int get prop2 => 2;\n' |
| + ' set prop2(int x) {};\n' |
| + '}\n' |
| + 'main(){}', |
| + }, { |
| + 'a|web/test.html_bootstrap.dart': |
| + '''$MAIN_HEADER |
| + import 'a.dart' as i0; |
| + ${DEFAULT_IMPORTS.join('\n')} |
| + import 'a.dart' as smoke_0; |
| + |
| + void main() { |
| + useGeneratedCode(new StaticConfiguration( |
| + checkedMode: false, |
| + getters: { |
| + #field1: (o) => o.field1, |
| + #prop2: (o) => o.prop2, |
| + }, |
| + setters: { |
| + #field1: (o, v) { o.field1 = v; }, |
| + #prop2: (o, v) { o.prop2 = v; }, |
| + }, |
| + declarations: { |
| + smoke_0.XFoo: { |
| + #field1: const Declaration(#field1, int), |
| + #prop2: const Declaration(#prop2, int, kind: PROPERTY), |
| + }, |
| + }, |
| + names: { |
| + #field1: r'field1', |
| + #prop2: r'prop2', |
| + })); |
| + configureForDeployment([ |
| + () => Polymer.register(\'x-foo\', i0.XFoo), |
| + ]); |
| + i0.main(); |
| + } |
| + '''.replaceAll('\n ', '\n'), |
| + }); |
| + |
| + final fooDetails = |
| + "kind: METHOD, annotations: const [const smoke_1.ObserveProperty('x')]"; |
| + final xChangedDetails = "Function, kind: METHOD"; |
| + testPhases('ObserveProperty and *Changed methods', phases, { |
| + 'a|web/test.html': |
| + '<!DOCTYPE html><html><body>' |
| + '</polymer-element>' |
| + '<script type="application/dart" src="a.dart"></script>', |
| + 'a|web/test.html.scriptUrls': '[]', |
| + 'a|web/a.dart': |
| + 'library a;\n' |
| + 'import "package:polymer/polymer.dart";\n' |
| + '@CustomTag("x-foo")\n' |
| + 'class XFoo {\n' |
| + ' int x;\n' |
| + ' void xChanged() {}\n' |
| + ' void attributeChanged() {}\n' // should be excluded |
| + ' @ObserveProperty("x")' |
| + ' void foo() {}\n' |
| + '}\n' |
| + 'main(){}', |
| + }, { |
| + 'a|web/test.html_bootstrap.dart': |
| + '''$MAIN_HEADER |
| + import 'a.dart' as i0; |
| + ${DEFAULT_IMPORTS.join('\n')} |
| + import 'a.dart' as smoke_0; |
| + import 'package:polymer/polymer.dart' as smoke_1; |
| + |
| + void main() { |
| + useGeneratedCode(new StaticConfiguration( |
| + checkedMode: false, |
| + getters: { |
| + #foo: (o) => o.foo, |
| + #xChanged: (o) => o.xChanged, |
| + }, |
| + declarations: { |
| + smoke_0.XFoo: { |
| + #foo: const Declaration(#foo, Function, $fooDetails), |
| + #xChanged: const Declaration(#xChanged, $xChangedDetails), |
| + }, |
| + }, |
| + names: { |
| + #foo: r'foo', |
| + #xChanged: r'xChanged', |
| + })); |
| + configureForDeployment([ |
| + () => Polymer.register(\'x-foo\', i0.XFoo), |
| + ]); |
| + i0.main(); |
| + } |
| + '''.replaceAll('\n ', '\n'), |
| + }); |
| + |
| + final rcDetails = "#registerCallback, Function, kind: METHOD, isStatic: true"; |
| + testPhases('register callback is included', phases, { |
| + 'a|web/test.html': |
| + '<!DOCTYPE html><html><body>' |
| + '</polymer-element>' |
| + '<script type="application/dart" src="a.dart"></script>', |
| + 'a|web/test.html.scriptUrls': '[]', |
| + 'a|web/a.dart': |
| + 'library a;\n' |
| + 'import "package:polymer/polymer.dart";\n' |
| + '@CustomTag("x-foo")\n' |
| + 'class XFoo {\n' |
| + ' static registerCallback() {};\n' |
| + ' static foo() {};\n' |
| + '}\n' |
| + 'main(){}', |
| + }, { |
| + 'a|web/test.html_bootstrap.dart': |
| + '''$MAIN_HEADER |
| + import 'a.dart' as i0; |
| + ${DEFAULT_IMPORTS.join('\n')} |
| + import 'a.dart' as smoke_0; |
| + |
| + void main() { |
| + useGeneratedCode(new StaticConfiguration( |
| + checkedMode: false, |
| + declarations: { |
| + smoke_0.XFoo: { |
| + #registerCallback: const Declaration($rcDetails), |
| + }, |
| + }, |
| + staticMethods: { |
| + smoke_0.XFoo: { |
| + #registerCallback: smoke_0.XFoo.registerCallback, |
| + }, |
| + }, |
| + names: { |
| + #registerCallback: r'registerCallback', |
| + })); |
| + configureForDeployment([ |
| + () => Polymer.register(\'x-foo\', i0.XFoo), |
| + ]); |
| + i0.main(); |
| + } |
| + '''.replaceAll('\n ', '\n'), |
| }); |
| } |