| 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);
|
| + });
|
| + });
|
| +}
|
|
|