Index: tests/compiler/dart2js/jsinterop/world_test.dart |
diff --git a/tests/compiler/dart2js/jsinterop/world_test.dart b/tests/compiler/dart2js/jsinterop/world_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f196b8e8520f9a0fb573a56f0448f5b0948b0aef |
--- /dev/null |
+++ b/tests/compiler/dart2js/jsinterop/world_test.dart |
@@ -0,0 +1,161 @@ |
+// Copyright (c) 2016, 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 jsinterop.world_test; |
+ |
+import 'package:expect/expect.dart'; |
+import 'package:async_helper/async_helper.dart'; |
+import 'package:compiler/src/common.dart'; |
+import 'package:compiler/src/elements/elements.dart' |
+ show Element, ClassElement; |
+import 'package:compiler/src/js_backend/js_backend.dart'; |
+import 'package:compiler/src/world.dart'; |
+import '../type_test_helper.dart'; |
+ |
+void main() { |
+ asyncTest(() async { |
+ await testClasses(); |
+ }); |
+} |
+ |
+testClasses() async { |
+ test(String mainSource, |
+ {List<String> directlyInstantiated: const <String>[], |
+ List<String> indirectlyInstantiated: const <String>[]}) async { |
+ TypeEnvironment env = await TypeEnvironment.create(r""" |
+@JS() |
+class A { |
+ get foo; |
+ |
+ external A(var foo); |
+} |
+ |
+@JS() |
+class B { |
+ get foo; |
+ |
+ external B(var foo); |
+} |
+ |
+@JS() |
+@anonymous |
+class C { |
+ final foo; |
+ |
+ external factory C({foo}); |
+} |
+ |
+@JS() |
+@anonymous |
+class D { |
+ final foo; |
+ |
+ external factory D({foo}); |
+} |
+ |
+class E { |
+ final foo; |
+ |
+ E(this.foo); |
+} |
+ |
+class F { |
+ final foo; |
+ |
+ F(this.foo); |
+} |
+ |
+newA() => new A(0); |
+newB() => new B(1); |
+newC() => new C(foo: 2); |
+newD() => new D(foo: 3); |
+newE() => new E(4); |
+newF() => new F(5); |
+""", mainSource: """ |
+import 'package:js/js.dart'; |
+ |
+$mainSource |
+""", useMockCompiler: false); |
+ Map<String, ClassElement> classEnvironment = <String, ClassElement>{}; |
+ |
+ ClassElement registerClass(ClassElement cls) { |
+ classEnvironment[cls.name] = cls; |
+ return cls; |
+ } |
+ |
+ ClassWorld world = env.compiler.world; |
+ JavaScriptBackend backend = env.compiler.backend; |
+ ClassElement Object_ = registerClass(env.compiler.coreClasses.objectClass); |
+ ClassElement Interceptor = |
+ registerClass(backend.helpers.jsInterceptorClass); |
+ ClassElement JavaScriptObject = |
+ registerClass(backend.helpers.jsJavaScriptObjectClass); |
+ ClassElement A = registerClass(env.getElement('A')); |
+ ClassElement B = registerClass(env.getElement('B')); |
+ ClassElement C = registerClass(env.getElement('C')); |
+ ClassElement D = registerClass(env.getElement('D')); |
+ ClassElement E = registerClass(env.getElement('E')); |
+ ClassElement F = registerClass(env.getElement('F')); |
+ |
+ Expect.equals(Interceptor.superclass, Object_); |
+ Expect.equals(JavaScriptObject.superclass, Interceptor); |
+ |
+ Expect.equals(A.superclass, JavaScriptObject); |
+ Expect.equals(B.superclass, JavaScriptObject); |
+ Expect.equals(C.superclass, JavaScriptObject); |
+ Expect.equals(D.superclass, JavaScriptObject); |
+ Expect.equals(E.superclass, Object_); |
+ Expect.equals(F.superclass, Object_); |
+ |
+ for (String name in classEnvironment.keys) { |
+ ClassElement cls = classEnvironment[name]; |
+ bool isInstantiated = false; |
+ if (directlyInstantiated.contains(name)) { |
+ isInstantiated = true; |
+ Expect.isTrue(world.isDirectlyInstantiated(cls), |
+ "Expected $name to be directly instantiated in `${mainSource}`:" |
+ "\n${world.dump(cls)}"); |
+ } |
+ if (indirectlyInstantiated.contains(name)) { |
+ isInstantiated = true; |
+ Expect.isTrue(world.isIndirectlyInstantiated(cls), |
+ "Expected $name to be indirectly instantiated in `${mainSource}`:" |
+ "\n${world.dump(cls)}"); |
+ } |
+ if (!isInstantiated && (name != 'Object' && name != 'Interceptor')) { |
+ Expect.isFalse(world.isInstantiated(cls), |
+ "Expected $name to be uninstantiated in `${mainSource}`:" |
+ "\n${world.dump(cls)}"); |
+ } |
+ } |
+ } |
+ |
+ await test('main() {}'); |
+ |
+ await test('main() => newA();', |
+ directlyInstantiated: ['A', 'B', 'C', 'D'], |
+ indirectlyInstantiated: ['Object', 'Interceptor', 'JavaScriptObject']); |
+ |
+ await test('main() => newB();', |
+ directlyInstantiated: ['A', 'B', 'C', 'D'], |
+ indirectlyInstantiated: ['Object', 'Interceptor', 'JavaScriptObject']); |
+ |
+ await test('main() => newC();', |
+ directlyInstantiated: ['A', 'B', 'C', 'D'], |
+ indirectlyInstantiated: ['Object', 'Interceptor', 'JavaScriptObject']); |
+ |
+ await test('main() => newD();', |
+ directlyInstantiated: ['A', 'B', 'C', 'D'], |
+ indirectlyInstantiated: ['Object', 'Interceptor', 'JavaScriptObject']); |
+ |
+ await test('main() => newE();', |
+ directlyInstantiated: ['E']); |
+ |
+ await test('main() => newF();', |
+ directlyInstantiated: ['F']); |
+ |
+ await test('main() => [newD(), newE()];', |
+ directlyInstantiated: ['A', 'B', 'C', 'D', 'E'], |
+ indirectlyInstantiated: ['Object', 'Interceptor', 'JavaScriptObject']); |
+} |