Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(505)

Unified Diff: tests/compiler/dart2js_native/subclassing_constructor_1_test.dart

Issue 25675002: Generative constructor factories for native objects (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tests/compiler/dart2js_native/subclassing_constructor_1_test.dart
diff --git a/tests/compiler/dart2js_native/subclassing_constructor_1_test.dart b/tests/compiler/dart2js_native/subclassing_constructor_1_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..21531957d1a7d989741977a9c9bf9377faf4ea89
--- /dev/null
+++ b/tests/compiler/dart2js_native/subclassing_constructor_1_test.dart
@@ -0,0 +1,123 @@
+// Copyright (c) 2013, 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.
+
+import "package:expect/expect.dart";
+import 'dart:_foreign_helper' show JS;
+import 'dart:_js_helper' show Creates, setNativeSubclassDispatchRecord;
+import 'dart:_interceptors' show
+ findInterceptorForType, findConstructorForWebComponentType;
+
+// Test that subclasses of native classes can be initialized by calling the
+// 'upgrade' constructor.
+
+var trace = [];
+
+var log;
+
+class A native "A" {
+ final a1 = log(101); // Only initialized IF named constructor called.
+ final a2; // Initialized by native constructor.
+ final a3; // Initialized only by A.two.
+ var a4 = log(104);
+
+ A.one();
+
+ A.two() : a3 = log(103) {
+ log('body(A.two)');
+ log(a4 += increment);
+ }
+
+ get increment => 10;
+}
+
+class B extends A {
+ final b1;
+ final b2 = log(202);
+ var b3;
+
+ B.one() : super.one();
+
+ B.two() : b1 = log(201), super.two(), b3 = log(203) {
+ log('body(B.two)');
+ }
+
+ get increment => 20;
+}
+
+
+makeB() native;
+
+@Creates('=Object')
+getBPrototype() native;
+
+void setup() native r"""
+function B() { this.a2 = 102; }
+
+makeB = function(){return new B;};
+
+getBPrototype = function(){return B.prototype;};
+""";
+
+
+test_one() {
+ trace = [];
+ var constructor = findConstructorForWebComponentType(B, 'one');
+ Expect.isNotNull(constructor);
+ Expect.isNull(findConstructorForWebComponentType(B, 'Missing'));
+
+ var b = makeB();
+ Expect.isTrue(b is B);
+ // Call constructor to initialize native object.
+ var b2 = JS('', '#(#)', constructor, b);
+ Expect.identical(b, b2);
+ Expect.isTrue(b is B);
+
+ Expect.equals(101, b.a1);
+ Expect.equals(102, b.a2);
+ Expect.equals(null, b.a3);
+ Expect.equals(104, b.a4);
+ Expect.equals(null, b.b1);
+ Expect.equals(202, b.b2);
+ Expect.equals(null, b.b3);
+
+ Expect.equals('[202, 101, 104]', '$trace');
+}
+
+test_two() {
+ trace = [];
+ var constructor = findConstructorForWebComponentType(B, 'two');
+ Expect.isNotNull(constructor);
+
+ var b = makeB();
+ Expect.isTrue(b is B);
+ // Call constructor to initialize native object.
+ JS('', '#(#)', constructor, b);
+ Expect.isTrue(b is B);
+
+ Expect.equals(101, b.a1);
+ Expect.equals(102, b.a2);
+ Expect.equals(103, b.a3);
+ Expect.equals(124, b.a4);
+ Expect.equals(201, b.b1);
+ Expect.equals(202, b.b2);
+ Expect.equals(203, b.b3);
+
+ Expect.equals(
+ '[202, 201, 101, 104, 103, 203, body(A.two), 124, body(B.two)]',
+ '$trace');
+}
+
+main() {
+ setup();
+
+ log = (message) {
+ trace.add('$message');
+ return message;
+ };
+
+ setNativeSubclassDispatchRecord(getBPrototype(), findInterceptorForType(B));
+
+ test_one();
+ test_two();
+}

Powered by Google App Engine
This is Rietveld 408576698