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

Unified Diff: pkg/dev_compiler/test/codegen/lib/html/js_typed_interop_lazy_test.dart

Issue 2515353003: Support lazy JS types. (Closed)
Patch Set: Support lazy JS types. Created 4 years, 1 month 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: pkg/dev_compiler/test/codegen/lib/html/js_typed_interop_lazy_test.dart
diff --git a/pkg/dev_compiler/test/codegen/lib/html/js_typed_interop_lazy_test.dart b/pkg/dev_compiler/test/codegen/lib/html/js_typed_interop_lazy_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..97af07fcf14ce6b32334aa48f8a8100280b722bb
--- /dev/null
+++ b/pkg/dev_compiler/test/codegen/lib/html/js_typed_interop_lazy_test.dart
@@ -0,0 +1,114 @@
+// 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.
+
+@JS()
+library js_typed_interop_lazy_test;
+
+import 'dart:html';
+
+import 'package:js/js.dart';
+import 'package:js/js_util.dart' as js_util;
+import 'package:expect/minitest.dart';
+
+@JS('someProperty')
+external get foo;
+
+@JS('baz.bar')
+external get bar;
+
+@JS('baz.LazyClass')
+class LazyClass {
+ external factory LazyClass(a);
+ external get a;
+}
+
+@anonymous
+@JS('some.bogus.ignored.js.path')
+class AnonClass {
+ external factory AnonClass({a});
+ external get a;
+}
+
+@anonymous
+@JS()
+class AnonClass2 {
+ external factory AnonClass2({b});
+ external get b;
+}
+
+abstract class Foo<T> {
+ T get obj;
+}
+
+// This class would cause compile time issues if JS classes are not properly lazy.
+class FooImpl extends Foo<LazyClass> {
+ LazyClass get obj => new LazyClass(100);
+}
+
+main() {
+ group('lazy property', () {
+ test('simple', () {
+ expect(foo, isNull);
+ js_util.setProperty(window, 'someProperty', 42);
+ expect(foo, equals(42));
+ });
+
+ test('nested', () {
+ js_util.setProperty(window, 'baz', js_util.newObject());
+ expect(bar, isNull);
+ js_util.setProperty(window, 'baz', js_util.jsify({'bar': 100}));
+ expect(bar, equals(100));
+ });
+ });
+
+ group('lazy class', () {
+ test('type literal', () {
+ // Fine because we can determine the class literals are equal without
+ // having to determine what (non-existant) JS type they correspond to.
+ var x = LazyClass;
+ var y = LazyClass;
+ expect(x == y, isTrue);
+ });
+
+ test('reference in type parameter', () {
+ var o = new FooImpl();
+ expect(o is Foo<LazyClass>, isTrue);
+ });
+
+ test('create instance', () {
+ document.body.append(new ScriptElement()
+ ..type = 'text/javascript'
+ ..innerHtml = r"""
+window.baz = {};
+
+baz.LazyClass = function LazyClass(a) {
+ this.a = a;
+};
+""");
+ var l = new LazyClass(42);
+ expect(l.a, equals(42));
+ expect(l is LazyClass, isTrue);
+ expect(l is AnonClass, isTrue);
+ expect((l as AnonClass) == l, isTrue);
+ expect((l as AnonClass2) == l, isTrue);
+ var anon = new AnonClass(a: 42);
+ expect(anon is! LazyClass, isTrue);
+ expect(anon is AnonClass, isTrue);
+ expect(anon is AnonClass2, isTrue);
+
+ // Sanity check that is and as are not broken.
+ expect(new Object() is! LazyClass, isTrue);
+ expect(new Object() is! AnonClass, isTrue);
+ expect(new Object() is! AnonClass2, isTrue);
+
+ expect(<AnonClass>[] is List<AnonClass>, isTrue);
+ // TODO(jacobr): why doesn't this test pass?
+ // expect(<AnonClass>[] is List<AnonClass2>, isTrue);
+ expect(<int>[] is! List<AnonClass>, isTrue);
+ expect(<AnonClass>[] is! List<LazyClass>, isTrue);
+ expect(<int>[] is! List<LazyClass>, isTrue);
+ expect(<LazyClass>[] is List<LazyClass>, isTrue);
+ });
+ });
+}

Powered by Google App Engine
This is Rietveld 408576698