Index: tests/try/web/incremental_compilation_update_test.dart |
diff --git a/tests/try/web/incremental_compilation_update_test.dart b/tests/try/web/incremental_compilation_update_test.dart |
deleted file mode 100644 |
index d434b473aba55e2fada927f8453f44e2f7fb4ccf..0000000000000000000000000000000000000000 |
--- a/tests/try/web/incremental_compilation_update_test.dart |
+++ /dev/null |
@@ -1,2062 +0,0 @@ |
-// Copyright (c) 2014, 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 trydart.incremental_compilation_update_test; |
- |
-import 'dart:html' hide |
- Element; |
- |
-import 'dart:async' show |
- Future; |
- |
-import 'package:async_helper/async_helper.dart' show |
- asyncTest; |
- |
-import 'package:expect/expect.dart' show |
- Expect; |
- |
-import 'package:try/src/interaction_manager.dart' show |
- splitLines; |
- |
-import 'package:try/poi/scope_information_visitor.dart' show |
- ScopeInformationVisitor; |
- |
-import 'sandbox.dart' show |
- appendIFrame, |
- listener; |
- |
-import 'web_compiler_test_case.dart' show |
- WebCompilerTestCase, |
- WebInputProvider; |
- |
-import '../poi/compiler_test_case.dart' show |
- CompilerTestCase; |
- |
-import 'package:compiler/src/elements/elements.dart' show |
- Element, |
- LibraryElement; |
- |
-import 'package:compiler/src/compiler.dart' show |
- Compiler; |
- |
-import 'package:dart2js_incremental/dart2js_incremental.dart' show |
- IncrementalCompilationFailed; |
- |
-import 'program_result.dart'; |
- |
-const int TIMEOUT = 100; |
- |
-const List<EncodedResult> tests = const <EncodedResult>[ |
- // Basic hello-world test. |
- const EncodedResult( |
- const [ |
- "main() { print('Hello, ", |
- const ["", "Brave New "], |
- "World!'); }", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['Hello, World!']), |
- const ProgramExpectation( |
- const <String>['Hello, Brave New World!']), |
- ]), |
- |
- // Test that the test framework handles more than one update. |
- const EncodedResult( |
- const [ |
- "main() { print('", |
- const [ |
- "Hello darkness, my old friend", |
- "I\\'ve come to talk with you again", |
- "Because a vision softly creeping", |
- ], |
- "'); }", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['Hello darkness, my old friend']), |
- const ProgramExpectation( |
- const <String>['I\'ve come to talk with you again']), |
- const ProgramExpectation( |
- const <String>['Because a vision softly creeping']), |
- ]), |
- |
- // Test that that isolate support works. |
- const EncodedResult( |
- const [ |
- "main(arguments) { print(", |
- const [ |
- "'Hello, Isolated World!'", |
- "arguments" |
- ], |
- "); }", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['Hello, Isolated World!']), |
- const ProgramExpectation( |
- const <String>['[]']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that a stored closure changes behavior when updated. |
- |
-var closure; |
- |
-foo(a, [b = 'b']) { |
-""", |
- const [ |
- r""" |
- print('$a $b'); |
-""", |
- r""" |
- print('$b $a'); |
-""", |
- ], |
- r""" |
-} |
- |
-main() { |
- if (closure == null) { |
- print('[closure] is null.'); |
- closure = foo; |
- } |
- closure('a'); |
- closure('a', 'c'); |
-} |
-"""], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['[closure] is null.', 'a b', 'a c']), |
- const ProgramExpectation( |
- const <String>['b a', 'c a']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- """ |
-// Test modifying a static method works. |
- |
-class C { |
- static m() { |
-""", |
- const [ |
- r""" |
- print('v1'); |
-""", |
- r""" |
- print('v2'); |
-""", |
- ], |
- """ |
- } |
-} |
-main() { |
- C.m(); |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['v1']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- """ |
-// Test modifying an instance method works. |
- |
-class C { |
- m() { |
-""", |
- const [ |
- r""" |
- print('v1'); |
-""", |
- r""" |
- print('v2'); |
-""", |
- ], |
- """ |
- } |
-} |
-var instance; |
-main() { |
- if (instance == null) { |
- print('instance is null'); |
- instance = new C(); |
- } |
- instance.m(); |
-} |
-""", |
- |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['instance is null', 'v1']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- """ |
-// Test that a stored instance tearoff changes behavior when updated. |
- |
-class C { |
- m() { |
-""", |
- const [ |
- r""" |
- print('v1'); |
-""", |
- r""" |
- print('v2'); |
-""", |
- ], |
- """ |
- } |
-} |
-var closure; |
-main() { |
- if (closure == null) { |
- print('closure is null'); |
- closure = new C().m; |
- } |
- closure(); |
-} |
-""", |
- |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['closure is null', 'v1']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- """ |
-// Test that deleting an instance method works. |
- |
-class C { |
-""", |
- const [ |
- """ |
- m() { |
- print('v1'); |
- } |
-""", |
- """ |
-""", |
- ], |
- """ |
-} |
-var instance; |
-main() { |
- if (instance == null) { |
- print('instance is null'); |
- instance = new C(); |
- } |
- try { |
- instance.m(); |
- } catch (e) { |
- print('threw'); |
- } |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['instance is null', 'v1']), |
- const ProgramExpectation( |
- const <String>['threw']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- """ |
-// Test that deleting an instance method works, even when accessed through |
-// super. |
- |
-class A { |
- m() { |
- print('v2'); |
- } |
-} |
-class B extends A { |
-""", |
- const [ |
- """ |
- m() { |
- print('v1'); |
- } |
-""", |
- """ |
-""", |
- ], |
- """ |
-} |
-class C extends B { |
- m() { |
- super.m(); |
- } |
-} |
-var instance; |
-main() { |
- if (instance == null) { |
- print('instance is null'); |
- instance = new C(); |
- } |
- instance.m(); |
-} |
-""", |
- |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['instance is null', 'v1']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- """ |
-// Test that deleting a top-level method works. |
- |
-""", |
- const [ |
- """ |
-toplevel() { |
- print('v1'); |
-} |
-""", |
- """ |
-""", |
- ], |
- """ |
-class C { |
- m() { |
- try { |
- toplevel(); |
- } catch (e) { |
- print('threw'); |
- } |
- } |
-} |
-var instance; |
-main() { |
- if (instance == null) { |
- print('instance is null'); |
- instance = new C(); |
- } |
- instance.m(); |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['instance is null', 'v1']), |
- const ProgramExpectation( |
- const <String>['threw']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- """ |
-// Test that deleting a static method works. |
- |
-class B { |
-""", |
- const [ |
- """ |
- static staticMethod() { |
- print('v1'); |
- } |
-""", |
- """ |
-""", |
- ], |
- """ |
-} |
-class C { |
- m() { |
- try { |
- B.staticMethod(); |
- } catch (e) { |
- print('threw'); |
- } |
- try { |
- // Ensure that noSuchMethod support is compiled. This test is not about |
- // adding new classes. |
- B.missingMethod(); |
- print('bad'); |
- } catch (e) { |
- } |
- } |
-} |
-var instance; |
-main() { |
- if (instance == null) { |
- print('instance is null'); |
- instance = new C(); |
- } |
- instance.m(); |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['instance is null', 'v1']), |
- const ProgramExpectation( |
- const <String>['threw']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- """ |
-// Test that a newly instantiated class is handled. |
- |
-class A { |
- m() { |
- print('Called A.m'); |
- } |
-} |
- |
-class B { |
- m() { |
- print('Called B.m'); |
- } |
-} |
- |
-var instance; |
-main() { |
- if (instance == null) { |
- print('instance is null'); |
- instance = new A(); |
-""", |
- const [ |
- """ |
-""", |
- """ |
- } else { |
- instance = new B(); |
-""", |
- ], |
- """ |
- } |
- instance.m(); |
-} |
-""", |
- |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['instance is null', 'Called A.m']), |
- const ProgramExpectation( |
- const <String>['Called B.m']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- """ |
-// Test that source maps don't throw exceptions. |
- |
-main() { |
- print('a'); |
-""", |
- const [ |
- """ |
-""", |
- """ |
- print('b'); |
- print('c'); |
-""", |
- ], |
- """ |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['a']), |
- const ProgramExpectation( |
- const <String>['a', 'b', 'c']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that a newly instantiated class is handled. |
- |
-class A { |
- get name => 'A.m'; |
- |
- m() { |
- print('Called $name'); |
- } |
-} |
- |
-class B extends A { |
- get name => 'B.m'; |
-} |
- |
-var instance; |
-main() { |
- if (instance == null) { |
- print('instance is null'); |
- instance = new A(); |
-""", |
- const [ |
- r""" |
-""", |
- r""" |
- } else { |
- instance = new B(); |
-""", |
- ], |
- r""" |
- } |
- instance.m(); |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['instance is null', 'Called A.m']), |
- const ProgramExpectation( |
- const <String>['Called B.m']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that fields of a newly instantiated class are handled. |
- |
-class A { |
- var x; |
- A(this.x); |
-} |
-var instance; |
-foo() { |
- if (instance != null) { |
- print(instance.x); |
- } else { |
- print('v1'); |
- } |
-} |
-main() { |
-""", |
- const [ |
- r""" |
-""", |
- r""" |
- instance = new A('v2'); |
-""", |
- ], |
- r""" |
- foo(); |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['v1']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that top-level functions can be added. |
- |
-""", |
- const [ |
- "", |
- r""" |
-foo() { |
- print('v2'); |
-} |
-""", |
- ], |
- r""" |
-main() { |
- try { |
- foo(); |
- } catch(e) { |
- print('threw'); |
- } |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['threw']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that static methods can be added. |
- |
-class C { |
-""", |
- const [ |
- "", |
- r""" |
- static foo() { |
- print('v2'); |
- } |
-""", |
- ], |
- r""" |
-} |
- |
-main() { |
- try { |
- C.foo(); |
- } catch(e) { |
- print('threw'); |
- } |
-} |
-""", |
- |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['threw']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that instance methods can be added. |
- |
-class C { |
-""", |
- const [ |
- "", |
- r""" |
- foo() { |
- print('v2'); |
- } |
-""", |
- ], |
- r""" |
-} |
- |
-var instance; |
- |
-main() { |
- if (instance == null) { |
- print('instance is null'); |
- instance = new C(); |
- } |
- |
- try { |
- instance.foo(); |
- } catch(e) { |
- print('threw'); |
- } |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['instance is null', 'threw']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that top-level functions can have signature changed. |
- |
-""", |
- const [ |
- r""" |
-foo() { |
- print('v1'); |
-""", |
- r""" |
-void foo() { |
- print('v2'); |
-""", |
- ], |
- r""" |
-} |
- |
-main() { |
- foo(); |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['v1']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that static methods can have signature changed. |
- |
-class C { |
-""", |
- const [ |
- r""" |
- static foo() { |
- print('v1'); |
-""", |
- r""" |
- static void foo() { |
- print('v2'); |
-""", |
- ], |
- r""" |
- } |
-} |
- |
-main() { |
- C.foo(); |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['v1']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that instance methods can have signature changed. |
- |
-class C { |
-""", |
- const [ |
- r""" |
- foo() { |
- print('v1'); |
-""", |
- r""" |
- void foo() { |
- print('v2'); |
-""", |
- ], |
- r""" |
- } |
-} |
- |
-var instance; |
- |
-main() { |
- if (instance == null) { |
- print('instance is null'); |
- instance = new C(); |
- } |
- |
- instance.foo(); |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['instance is null', 'v1']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that adding a class is supported. |
- |
-""", |
- const [ |
- "", |
- r""" |
-class C { |
- void foo() { |
- print('v2'); |
- } |
-} |
-""", |
- ], |
- r""" |
-main() { |
-""", |
- const [ |
- r""" |
- print('v1'); |
-""", |
- r""" |
- new C().foo(); |
-""", |
- ], |
- r""" |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['v1']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that removing a class is supported, using constructor. |
- |
-""", |
- const [ |
- r""" |
-class C { |
-} |
-""", |
- "" |
- ], |
- r""" |
-main() { |
- try { |
- new C(); |
- print('v1'); |
- } catch (e) { |
- print('v2'); |
- } |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['v1']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that removing a class is supported, using a static method. |
- |
-""", |
- const [ |
- r""" |
-class C { |
- static m() { |
- print('v1'); |
- } |
-} |
-""", |
- "", |
- ], |
- r""" |
-main() { |
- try { |
- C.m(); |
- } catch (e) { |
- print('v2'); |
- } |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['v1']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that changing the supertype of a class. |
- |
-class A { |
- m() { |
- print('v2'); |
- } |
-} |
-class B extends A { |
- m() { |
- print('v1'); |
- } |
-} |
-""", |
- const [ |
- r""" |
-class C extends B { |
-""", |
- r""" |
-class C extends A { |
-""", |
- ], |
- r""" |
- m() { |
- super.m(); |
- } |
-} |
- |
-var instance; |
- |
-main() { |
- if (instance == null) { |
- print('instance is null'); |
- instance = new C(); |
- } |
- instance.m(); |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['instance is null', 'v1']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test adding a field to a class works. |
- |
-class A { |
-""", |
- const [ |
- "", |
- r""" |
- var x; |
-""", |
- ], |
- r""" |
-} |
- |
-var instance; |
- |
-main() { |
- if (instance == null) { |
- print('instance is null'); |
- instance = new A(); |
- } |
- try { |
- instance.x = 'v2'; |
- } catch(e) { |
- print('setter threw'); |
- } |
- try { |
- print(instance.x); |
- } catch (e) { |
- print('getter threw'); |
- } |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['instance is null', 'setter threw', 'getter threw']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test removing a field from a class works. |
- |
-class A { |
-""", |
- const [ |
- r""" |
- var x; |
-""", |
- "", |
- ], |
- r""" |
-} |
- |
-var instance; |
- |
-main() { |
- if (instance == null) { |
- print('instance is null'); |
- instance = new A(); |
- } |
- try { |
- instance.x = 'v1'; |
- } catch(e) { |
- print('setter threw'); |
- } |
- try { |
- print(instance.x); |
- } catch (e) { |
- print('getter threw'); |
- } |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['instance is null', 'v1']), |
- const ProgramExpectation( |
- const <String>['setter threw', 'getter threw']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that named arguments can be called. |
- |
-class C { |
- foo({a, named: 'v1', x}) { |
- print(named); |
- } |
-} |
- |
-var instance; |
- |
-main() { |
- if (instance == null) { |
- print('instance is null'); |
- instance = new C(); |
- } |
-""", |
- const [ |
- r""" |
- instance.foo(); |
-""", |
- r""" |
- instance.foo(named: 'v2'); |
-""", |
- ], |
- r""" |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['instance is null', 'v1']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test than named arguments can be called. |
- |
-class C { |
- foo({a, named: 'v2', x}) { |
- print(named); |
- } |
-} |
- |
-var instance; |
- |
-main() { |
- if (instance == null) { |
- print('instance is null'); |
- instance = new C(); |
- } |
-""", |
- const [ |
- r""" |
- instance.foo(named: 'v1'); |
-""", |
- r""" |
- instance.foo(); |
-""", |
- ], |
- r""" |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['instance is null', 'v1']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that an instance tear-off with named parameters can be called. |
- |
-class C { |
- foo({a, named: 'v1', x}) { |
- print(named); |
- } |
-} |
- |
-var closure; |
- |
-main() { |
- if (closure == null) { |
- print('closure is null'); |
- closure = new C().foo; |
- } |
-""", |
- const [ |
- r""" |
- closure(); |
-""", |
- r""" |
- closure(named: 'v2'); |
-""", |
- ], |
- r""" |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['closure is null', 'v1']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that a lazy static is supported. |
- |
-var normal; |
- |
-""", |
- const [ |
- r""" |
-foo() { |
- print(normal); |
-} |
-""", |
- r""" |
-var lazy = bar(); |
- |
-foo() { |
- print(lazy); |
-} |
- |
-bar() { |
- print('v2'); |
- return 'lazy'; |
-} |
- |
-""", |
- ], |
- r""" |
-main() { |
- if (normal == null) { |
- normal = 'v1'; |
- } else { |
- normal = ''; |
- } |
- foo(); |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['v1']), |
- const ProgramExpectation( |
- const <String>['v2', 'lazy']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that superclasses of directly instantiated classes are also emitted. |
-class A { |
-} |
- |
-class B extends A { |
-} |
- |
-main() { |
-""", |
- const [ |
- r""" |
- print('v1'); |
-""", |
- r""" |
- new B(); |
- print('v2'); |
-""", |
- ], |
- r""" |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['v1']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that interceptor classes are handled correctly. |
- |
-main() { |
-""", |
- const [ |
- r""" |
- print('v1'); |
-""", |
- r""" |
- ['v2'].forEach(print); |
-""", |
- ], |
- r""" |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['v1']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that newly instantiated superclasses are handled correctly when there |
-// is more than one change. |
- |
-class A { |
- foo() { |
- print('Called foo'); |
- } |
- |
- bar() { |
- print('Called bar'); |
- } |
-} |
- |
-class B extends A { |
-} |
- |
-main() { |
-""", |
- const [ |
- r""" |
- new B().foo(); |
-""", |
- r""" |
- new B().foo(); |
-""", |
- r""" |
- new A().bar(); |
-""", |
- ], |
- r""" |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['Called foo']), |
- const ProgramExpectation( |
- const <String>['Called foo']), |
- const ProgramExpectation( |
- const <String>['Called bar']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that newly instantiated subclasses are handled correctly when there is |
-// more than one change. |
- |
-class A { |
- foo() { |
- print('Called foo'); |
- } |
- |
- bar() { |
- print('Called bar'); |
- } |
-} |
- |
-class B extends A { |
-} |
- |
-main() { |
-""", |
- const [ |
- r""" |
- new A().foo(); |
-""", |
- r""" |
- new A().foo(); |
-""", |
- r""" |
- new B().bar(); |
-""", |
- ], |
- r""" |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['Called foo']), |
- const ProgramExpectation( |
- const <String>['Called foo']), |
- const ProgramExpectation( |
- const <String>['Called bar']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that constants are handled correctly. |
- |
-class C { |
- final String value; |
- const C(this.value); |
-} |
- |
-main() { |
-""", |
- const [ |
- r""" |
- print(const C('v1').value); |
-""", |
- r""" |
- print(const C('v2').value); |
-""", |
- ], |
- r""" |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['v1']), |
- const ProgramExpectation( |
- const <String>['v2']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that an instance field can be added to a compound declaration. |
- |
-class C { |
-""", |
- const [ |
- r""" |
- int x; |
-""", |
- r""" |
- int x, y; |
-""", |
- ], |
- r""" |
-} |
- |
-var instance; |
- |
-main() { |
- if (instance == null) { |
- print('[instance] is null'); |
- instance = new C(); |
- instance.x = 'v1'; |
- } else { |
- instance.y = 'v2'; |
- } |
- try { |
- print(instance.x); |
- } catch (e) { |
- print('[instance.x] threw'); |
- } |
- try { |
- print(instance.y); |
- } catch (e) { |
- print('[instance.y] threw'); |
- } |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>[ |
- '[instance] is null', 'v1', '[instance.y] threw']), |
- const ProgramExpectation( |
- const <String>['v1', 'v2'], |
- // TODO(ahe): Shouldn't throw. |
- compileUpdatesShouldThrow: true), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that an instance field can be removed from a compound declaration. |
- |
-class C { |
-""", |
- const [ |
- r""" |
- int x, y; |
-""", |
- r""" |
- int x; |
-""", |
- ], |
- r""" |
-} |
- |
-var instance; |
- |
-main() { |
- if (instance == null) { |
- print('[instance] is null'); |
- instance = new C(); |
- instance.x = 'v1'; |
- instance.y = 'v2'; |
- } |
- try { |
- print(instance.x); |
- } catch (e) { |
- print('[instance.x] threw'); |
- } |
- try { |
- print(instance.y); |
- } catch (e) { |
- print('[instance.y] threw'); |
- } |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['[instance] is null', 'v1', 'v2']), |
- const ProgramExpectation( |
- const <String>['v1', '[instance.y] threw'], |
- // TODO(ahe): Shouldn't throw. |
- compileUpdatesShouldThrow: true), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that a static field can be made an instance field. |
- |
-class C { |
-""", |
- |
- const [ |
- r""" |
- static int x; |
-""", |
- r""" |
- int x; |
-""", |
- ], |
- r""" |
-} |
- |
-var instance; |
- |
-main() { |
- if (instance == null) { |
- print('[instance] is null'); |
- instance = new C(); |
- C.x = 'v1'; |
- } else { |
- instance.x = 'v2'; |
- } |
- try { |
- print(C.x); |
- } catch (e) { |
- print('[C.x] threw'); |
- } |
- try { |
- print(instance.x); |
- } catch (e) { |
- print('[instance.x] threw'); |
- } |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['[instance] is null', 'v1', '[instance.x] threw']), |
- const ProgramExpectation( |
- const <String>['[C.x] threw', 'v2'], |
- // TODO(ahe): Shouldn't throw. |
- compileUpdatesShouldThrow: true), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test that instance field can be made static. |
- |
-class C { |
-""", |
- const [ |
- r""" |
- int x; |
-""", |
- r""" |
- static int x; |
-""", |
- ], |
- r""" |
-} |
- |
-var instance; |
- |
-main() { |
- if (instance == null) { |
- print('[instance] is null'); |
- instance = new C(); |
- instance.x = 'v1'; |
- } else { |
- C.x = 'v2'; |
- } |
- try { |
- print(C.x); |
- } catch (e) { |
- print('[C.x] threw'); |
- } |
- try { |
- print(instance.x); |
- } catch (e) { |
- print('[instance.x] threw'); |
- } |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['[instance] is null', '[C.x] threw', 'v1']), |
- const ProgramExpectation( |
- const <String>['v2', '[instance.x] threw'], |
- // TODO(ahe): Shouldn't throw. |
- compileUpdatesShouldThrow: true), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test compound constants. |
- |
-class A { |
- final value; |
- const A(this.value); |
- |
- toString() => 'A($value)'; |
-} |
- |
-class B { |
- final value; |
- const B(this.value); |
- |
- toString() => 'B($value)'; |
-} |
- |
-main() { |
-""", |
- const [ |
- r""" |
- print(const A('v1')); |
- print(const B('v1')); |
-""", |
- r""" |
- print(const B(const A('v2'))); |
- print(const A(const B('v2'))); |
-""", |
- ], |
- r""" |
-} |
-""", |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['A(v1)', 'B(v1)']), |
- const ProgramExpectation( |
- const <String>['B(A(v2))', 'A(B(v2))']), |
- ]), |
- |
- const EncodedResult( |
- const [ |
- r""" |
-// Test constants of new classes. |
- |
-class A { |
- final value; |
- const A(this.value); |
- |
- toString() => 'A($value)'; |
-} |
-""", |
- const [ |
- "", |
- r""" |
-class B { |
- final value; |
- const B(this.value); |
- |
- toString() => 'B($value)'; |
-} |
- |
-""", |
- ], |
- r""" |
-main() { |
-""", |
- |
- const [ |
- r""" |
- print(const A('v1')); |
-""", |
- r""" |
- print(const A('v2')); |
- print(const B('v2')); |
- print(const B(const A('v2'))); |
- print(const A(const B('v2'))); |
-""", |
- ], |
- r""" |
-} |
-""", |
- |
- ], |
- const <ProgramExpectation>[ |
- const ProgramExpectation( |
- const <String>['A(v1)']), |
- const ProgramExpectation( |
- const <String>['A(v2)', 'B(v2)', 'B(A(v2))', 'A(B(v2))']), |
- ]), |
- |
- const EncodedResult( |
- r""" |
-==> main.dart <== |
-// Test that a change in a part is handled. |
-library test.main; |
- |
-part 'part.dart'; |
- |
- |
-==> part.dart.patch <== |
-part of test.main; |
- |
-main() { |
-<<<<<<< |
- print('Hello, World!'); |
-======= |
- print('Hello, Brave New World!'); |
->>>>>>> |
-} |
-""", |
- const [ |
- 'Hello, World!', |
- 'Hello, Brave New World!', |
- ]), |
- |
- const EncodedResult( |
- r""" |
-==> main.dart.patch <== |
-// Test that a change in library name is handled. |
-<<<<<<< |
-library test.main1; |
-======= |
-library test.main2; |
->>>>>>> |
- |
-main() { |
- print('Hello, World!'); |
-} |
-""", |
- const [ |
- 'Hello, World!', |
- const ProgramExpectation( |
- const <String>['Hello, World!'], |
- // TODO(ahe): Shouldn't throw. |
- compileUpdatesShouldThrow: true), |
- ]), |
- |
- const EncodedResult( |
- r""" |
-==> main.dart.patch <== |
-// Test that adding an import is handled. |
-<<<<<<< |
-======= |
-import 'dart:core'; |
->>>>>>> |
- |
-main() { |
- print('Hello, World!'); |
-} |
-""", |
- const [ |
- 'Hello, World!', |
- const ProgramExpectation( |
- const <String>['Hello, World!'], |
- // TODO(ahe): Shouldn't throw. |
- compileUpdatesShouldThrow: true), |
- ]), |
- |
- const EncodedResult( |
- r""" |
-==> main.dart.patch <== |
-// Test that adding an export is handled. |
-<<<<<<< |
-======= |
-export 'dart:core'; |
->>>>>>> |
- |
-main() { |
- print('Hello, World!'); |
-} |
-""", |
- const [ |
- 'Hello, World!', |
- const ProgramExpectation( |
- const <String>['Hello, World!'], |
- // TODO(ahe): Shouldn't throw. |
- compileUpdatesShouldThrow: true), |
- ]), |
- |
- const EncodedResult( |
- r""" |
-==> main.dart.patch <== |
-// Test that adding a part is handled. |
-library test.main; |
- |
-<<<<<<< |
-======= |
-part 'part.dart'; |
->>>>>>> |
- |
-main() { |
- print('Hello, World!'); |
-} |
- |
- |
-==> part.dart <== |
-part of test.main |
-""", |
- const [ |
- 'Hello, World!', |
- const ProgramExpectation( |
- const <String>['Hello, World!'], |
- // TODO(ahe): Shouldn't throw. |
- compileUpdatesShouldThrow: true), |
- ]), |
- |
- const EncodedResult( |
- r""" |
-==> main.dart <== |
-// Test that changes in multiple libraries is handled. |
-import 'library1.dart' as lib1; |
-import 'library2.dart' as lib2; |
- |
-main() { |
- lib1.method(); |
- lib2.method(); |
-} |
- |
- |
-==> library1.dart.patch <== |
-library test.library1; |
- |
-method() { |
-<<<<<<< |
- print('lib1.v1'); |
-======= |
- print('lib1.v2'); |
-======= |
- print('lib1.v3'); |
->>>>>>> |
-} |
- |
- |
-==> library2.dart.patch <== |
-library test.library2; |
- |
-method() { |
-<<<<<<< |
- print('lib2.v1'); |
-======= |
- print('lib2.v2'); |
-======= |
- print('lib2.v3'); |
->>>>>>> |
-} |
-""", |
- const [ |
- const <String>['lib1.v1', 'lib2.v1'], |
- const <String>['lib1.v2', 'lib2.v2'], |
- const <String>['lib1.v3', 'lib2.v3'], |
- ]), |
-]; |
- |
-void main() { |
- listener.start(); |
- |
- document.head.append(lineNumberStyle()); |
- |
- summary = new SpanElement(); |
- document.body.append(new HeadingElement.h1() |
- ..appendText("Incremental compiler tests") |
- ..append(summary)); |
- |
- String query = window.location.search; |
- int skip = 0; |
- if (query != null && query.length > 1) { |
- query = query.substring(1); |
- String skipParameter = Uri.splitQueryString(window.location.search)['skip']; |
- if (skipParameter != null) { |
- skip = int.parse(skipParameter); |
- } |
- String verboseParameter = |
- Uri.splitQueryString(window.location.search)['verbose']; |
- verboseStatus = verboseParameter != null; |
- } |
- testCount += skip; |
- |
- return asyncTest(() => Future.forEach(tests.skip(skip), compileAndRun) |
- .then(updateSummary)); |
-} |
- |
-SpanElement summary; |
- |
-int testCount = 1; |
- |
-bool verboseStatus = false; |
- |
-void updateSummary(_) { |
- summary.text = " (${testCount - 1}/${tests.length})"; |
-} |
- |
-Future compileAndRun(EncodedResult encodedResult) { |
- updateSummary(null); |
- List<ProgramResult> programs = encodedResult.decode(); |
- var status = new DivElement(); |
- document.body.append(status); |
- |
- IFrameElement iframe = |
- appendIFrame( |
- '/root_dart/tests/try/web/incremental_compilation_update.html', |
- document.body) |
- ..style.width = '100%' |
- ..style.height = '600px'; |
- |
- return listener.expect('iframe-ready').then((_) { |
- ProgramResult program = programs.first; |
- |
- status.append( |
- new HeadingElement.h2() |
- ..appendText("Full program #${testCount++}:")); |
- status.append(numberedLines(program.code)); |
- |
- status.style.color = 'orange'; |
- WebCompilerTestCase test = new WebCompilerTestCase(program.code); |
- return test.run().then((String jsCode) { |
- status.style.color = 'red'; |
- var objectUrl = |
- Url.createObjectUrl(new Blob([jsCode], 'application/javascript')); |
- |
- iframe.contentWindow.postMessage(['add-script', objectUrl], '*'); |
- Future future = |
- listener.expect(program.messagesWith('iframe-dart-main-done')); |
- return future.then((_) { |
- int version = 2; |
- return Future.forEach(programs.skip(1), (ProgramResult program) { |
- |
- status.append(new HeadingElement.h2()..appendText("Update:")); |
- status.append(numberedLines(program.code)); |
- |
- WebInputProvider inputProvider = |
- test.incrementalCompiler.inputProvider; |
- Uri base = test.scriptUri; |
- Map<String, String> code = program.code is String |
- ? { 'main.dart': program.code } |
- : program.code; |
- Map<Uri, Uri> uriMap = <Uri, Uri>{}; |
- for (String name in code.keys) { |
- Uri uri = base.resolve('$name?v${version++}'); |
- inputProvider.cachedSources[uri] = new Future.value(code[name]); |
- uriMap[base.resolve(name)] = uri; |
- } |
- Future future = test.incrementalCompiler.compileUpdates( |
- uriMap, logVerbose: logger, logTime: logger); |
- bool compileUpdatesThrew = false; |
- future = future.catchError((error, trace) { |
- String statusMessage; |
- Future result; |
- compileUpdatesThrew = true; |
- if (program.compileUpdatesShouldThrow && |
- error is IncrementalCompilationFailed) { |
- statusMessage = "Expected error in compileUpdates."; |
- result = null; |
- } else { |
- statusMessage = "Unexpected error in compileUpdates."; |
- result = new Future.error(error, trace); |
- } |
- status.append(new HeadingElement.h3()..appendText(statusMessage)); |
- return result; |
- }); |
- return future.then((String update) { |
- if (program.compileUpdatesShouldThrow) { |
- Expect.isTrue( |
- compileUpdatesThrew, |
- "Expected an exception in compileUpdates"); |
- Expect.isNull( update, "Expected update == null"); |
- return null; |
- } |
- print({'update': update}); |
- iframe.contentWindow.postMessage(['apply-update', update], '*'); |
- |
- return listener.expect( |
- program.messagesWith('iframe-dart-updated-main-done')) |
- .then((_) { |
- // TODO(ahe): Enable SerializeScopeTestCase for multiple |
- // parts. |
- if (program.code is! String) return null; |
- return new SerializeScopeTestCase( |
- program.code, test.incrementalCompiler.mainApp, |
- test.incrementalCompiler.compiler).run(); |
- }); |
- }); |
- }); |
- }); |
- }); |
- }).then((_) { |
- status.style.color = 'limegreen'; |
- |
- // Remove the iframe and status to work around a bug in test.dart |
- // (https://code.google.com/p/dart/issues/detail?id=21691). |
- if (!verboseStatus) status.remove(); |
- iframe.remove(); |
- }); |
-} |
- |
-class SerializeScopeTestCase extends CompilerTestCase { |
- final String scopeInfo; |
- |
- SerializeScopeTestCase( |
- String source, |
- LibraryElement library, |
- Compiler compiler) |
- : scopeInfo = computeScopeInfo(compiler, library), |
- super(source, '${library.canonicalUri}'); |
- |
- Future run() => loadMainApp().then(checkScopes); |
- |
- void checkScopes(LibraryElement library) { |
- Expect.stringEquals(computeScopeInfo(compiler, library), scopeInfo); |
- } |
- |
- static String computeScopeInfo(Compiler compiler, LibraryElement library) { |
- ScopeInformationVisitor visitor = |
- new ScopeInformationVisitor(compiler, library, 0); |
- |
- visitor.ignoreImports = true; |
- visitor.sortMembers = true; |
- visitor.indented.write('[\n'); |
- visitor.indentationLevel++; |
- visitor.indented; |
- library.accept(visitor); |
- library.forEachLocalMember((Element member) { |
- if (member.isClass) { |
- visitor.buffer.write(',\n'); |
- visitor.indented; |
- member.accept(visitor); |
- } |
- }); |
- visitor.buffer.write('\n'); |
- visitor.indentationLevel--; |
- visitor.indented.write(']'); |
- return '${visitor.buffer}'; |
- } |
-} |
- |
-void logger(x) { |
- print(x); |
- bool isCheckedMode = false; |
- assert(isCheckedMode = true); |
- int timeout = isCheckedMode ? TIMEOUT * 2 : TIMEOUT; |
- if (listener.elapsed > timeout) { |
- throw 'Test timed out.'; |
- } |
-} |
- |
-DivElement numberedLines(code) { |
- if (code is! Map) { |
- code = {'main.dart': code}; |
- } |
- DivElement result = new DivElement(); |
- code.forEach((String fileName, String code) { |
- result.append(new HeadingElement.h4()..appendText(fileName)); |
- DivElement lines = new DivElement(); |
- result.append(lines); |
- lines.classes.add("output"); |
- |
- for (String text in splitLines(code)) { |
- PreElement line = new PreElement() |
- ..appendText(text.trimRight()) |
- ..classes.add("line"); |
- lines.append(line); |
- } |
- }); |
- return result; |
-} |
- |
-StyleElement lineNumberStyle() { |
- StyleElement style = new StyleElement()..appendText(''' |
-h2, h3, h4 { |
- color: black; |
-} |
- |
-.output { |
- padding: 0px; |
- counter-reset: line-number; |
- padding-bottom: 1em; |
-} |
- |
-.line { |
- white-space: pre-wrap; |
- padding-left: 3.5em; |
- margin-top: 0; |
- margin-bottom: 0; |
-} |
- |
-.line::before { |
- counter-increment: line-number; |
- content: counter(line-number) " "; |
- position: absolute; |
- left: 0px; |
- width: 3em; |
- text-align: right; |
- background-color: lightgoldenrodyellow; |
-} |
-'''); |
- style.type = 'text/css'; |
- return style; |
-} |