| Index: test/browser/runtime_tests.js
|
| diff --git a/test/browser/runtime_tests.js b/test/browser/runtime_tests.js
|
| index fc163fd3264bf2ac92a5bc9e41f1aa851082478f..1c595f95ca000b3e1ec310d1a1eca37f5ca750d1 100644
|
| --- a/test/browser/runtime_tests.js
|
| +++ b/test/browser/runtime_tests.js
|
| @@ -2,1183 +2,1185 @@
|
| // 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.
|
|
|
| -var assert = chai.assert;
|
| -var dart_sdk = dart_library.import('dart_sdk');
|
| -var core = dart_sdk.core;
|
| -var collection = dart_sdk.collection;
|
| -var dart = dart_sdk.dart;
|
| -var dartx = dart.dartx;
|
| +define(['dart_sdk'], function(dart_sdk) {
|
| + const assert = chai.assert;
|
| + const core = dart_sdk.core;
|
| + const collection = dart_sdk.collection;
|
| + const dart = dart_sdk.dart;
|
| + const dartx = dart.dartx;
|
|
|
| -suite('generic', () => {
|
| - "use strict";
|
|
|
| - let generic = dart.generic;
|
| + suite('generic', () => {
|
| + "use strict";
|
|
|
| - test('zero arguments is not allowed', () => {
|
| - assert.throws(() => { generic(function(){}); });
|
| - });
|
| -
|
| - test('dcall noSuchMethod has correct error target', () => {
|
| - assert.throws(() => dart.dcall(42),
|
| - new RegExp('NoSuchMethodError.*\nReceiver: 42', 'm'),
|
| - 'Calls with non-function receiver should throw a NoSuchMethodError' +
|
| - ' with correct target');
|
| -
|
| - // TODO(jmesserly): we should show the name "print" in there somewhere.
|
| - assert.throws(() => dart.dcall(core.print, 1, 2, 3),
|
| - new RegExp('NoSuchMethodError.*\n' +
|
| - "Receiver: Instance of '\\(Object\\) -> void'", 'm'),
|
| - 'Calls with incorrect argument types should throw a NoSuchMethodError' +
|
| - ' with correct target');
|
| - });
|
| + let generic = dart.generic;
|
|
|
| - test('can throw number', () => {
|
| - try {
|
| - dart.throw(42);
|
| - } catch (e) {
|
| - assert.equal(e, 42);
|
| - }
|
| - });
|
| + test('zero arguments is not allowed', () => {
|
| + assert.throws(() => { generic(function(){}); });
|
| + });
|
|
|
| - test('argument count cannot change', () => {
|
| - let SomeType = generic(function(x) { return {x: x}; });
|
| - assert.throws(() => { SomeType(1,2) });
|
| - let obj = {};
|
| - assert.equal(SomeType(obj).x, obj);
|
| - assert.equal(SomeType(obj).x, obj);
|
| - assert.equal(SomeType().x, dart.dynamic);
|
| - });
|
| + test('dcall noSuchMethod has correct error target', () => {
|
| + assert.throws(() => dart.dcall(42),
|
| + new RegExp('NoSuchMethodError.*\nReceiver: 42', 'm'),
|
| + 'Calls with non-function receiver should throw a NoSuchMethodError' +
|
| + ' with correct target');
|
| +
|
| + // TODO(jmesserly): we should show the name "print" in there somewhere.
|
| + assert.throws(() => dart.dcall(core.print, 1, 2, 3),
|
| + new RegExp('NoSuchMethodError.*\n' +
|
| + "Receiver: Instance of '\\(Object\\) -> void'", 'm'),
|
| + 'Calls with incorrect argument types should throw a NoSuchMethodError' +
|
| + ' with correct target');
|
| + });
|
|
|
| - test('undefined/null are not allowed', () => {
|
| - let SomeType = generic(function(x) {});
|
| - assert.throws(() => { SomeType(void 0) });
|
| - SomeType(1);
|
| - assert.throws(() => { SomeType(void 0) });
|
| - SomeType(1);
|
| - assert.throws(() => { SomeType(null) });
|
| - });
|
| + test('can throw number', () => {
|
| + try {
|
| + dart.throw(42);
|
| + } catch (e) {
|
| + assert.equal(e, 42);
|
| + }
|
| + });
|
|
|
| - test('result is memoized', () => {
|
| - let t1 = Object.create(null);
|
| - let t2 = Object.create(null);
|
| + test('argument count cannot change', () => {
|
| + let SomeType = generic(function(x) { return {x: x}; });
|
| + assert.throws(() => { SomeType(1,2) });
|
| + let obj = {};
|
| + assert.equal(SomeType(obj).x, obj);
|
| + assert.equal(SomeType(obj).x, obj);
|
| + assert.equal(SomeType().x, dart.dynamic);
|
| + });
|
|
|
| - let count = 0;
|
| - let SomeType = generic(function(x, y) {
|
| - count++;
|
| - return Object.create(null);
|
| + test('undefined/null are not allowed', () => {
|
| + let SomeType = generic(function(x) {});
|
| + assert.throws(() => { SomeType(void 0) });
|
| + SomeType(1);
|
| + assert.throws(() => { SomeType(void 0) });
|
| + SomeType(1);
|
| + assert.throws(() => { SomeType(null) });
|
| });
|
|
|
| - let x12 = SomeType(1, 2);
|
| - assert.strictEqual(SomeType(1, 2), x12);
|
| - assert.strictEqual(SomeType(1, 2), x12);
|
| - assert.strictEqual(count, 1);
|
| - let x11 = SomeType(1, 1);
|
| - assert.strictEqual(count, 2);
|
| - assert.strictEqual(SomeType(1, 1), x11);
|
| - assert.strictEqual(count, 2);
|
| - count = 0;
|
| -
|
| - let t1t2 = SomeType(t1, t2);
|
| - assert.strictEqual(count, 1);
|
| - let t2t1 = SomeType(t2, t1);
|
| - assert.strictEqual(count, 2);
|
| - assert.notStrictEqual(t1t2, t2t1);
|
| - assert.strictEqual(SomeType(t1, t2), t1t2);
|
| - assert.strictEqual(SomeType(t2, t1), t2t1);
|
| - assert.strictEqual(SomeType(t1, t2), t1t2);
|
| - count = 0;
|
| -
|
| - // Nothing has been stored on the object
|
| - assert.strictEqual(Object.keys(t1).length, 0);
|
| - assert.strictEqual(Object.keys(t2).length, 0);
|
| - });
|
| + test('result is memoized', () => {
|
| + let t1 = Object.create(null);
|
| + let t2 = Object.create(null);
|
| +
|
| + let count = 0;
|
| + let SomeType = generic(function(x, y) {
|
| + count++;
|
| + return Object.create(null);
|
| + });
|
| +
|
| + let x12 = SomeType(1, 2);
|
| + assert.strictEqual(SomeType(1, 2), x12);
|
| + assert.strictEqual(SomeType(1, 2), x12);
|
| + assert.strictEqual(count, 1);
|
| + let x11 = SomeType(1, 1);
|
| + assert.strictEqual(count, 2);
|
| + assert.strictEqual(SomeType(1, 1), x11);
|
| + assert.strictEqual(count, 2);
|
| + count = 0;
|
| +
|
| + let t1t2 = SomeType(t1, t2);
|
| + assert.strictEqual(count, 1);
|
| + let t2t1 = SomeType(t2, t1);
|
| + assert.strictEqual(count, 2);
|
| + assert.notStrictEqual(t1t2, t2t1);
|
| + assert.strictEqual(SomeType(t1, t2), t1t2);
|
| + assert.strictEqual(SomeType(t2, t1), t2t1);
|
| + assert.strictEqual(SomeType(t1, t2), t1t2);
|
| + count = 0;
|
| +
|
| + // Nothing has been stored on the object
|
| + assert.strictEqual(Object.keys(t1).length, 0);
|
| + assert.strictEqual(Object.keys(t2).length, 0);
|
| + });
|
|
|
| - test('type constructor is reflectable', () => {
|
| - let SomeType = generic(function(x, y) { return Object.create(null); });
|
| - let someValue = SomeType('hi', 123);
|
| - assert.equal(dart.getGenericClass(someValue), SomeType);
|
| - assert.deepEqual(dart.getGenericArgs(someValue), ['hi', 123]);
|
| - });
|
| + test('type constructor is reflectable', () => {
|
| + let SomeType = generic(function(x, y) { return Object.create(null); });
|
| + let someValue = SomeType('hi', 123);
|
| + assert.equal(dart.getGenericClass(someValue), SomeType);
|
| + assert.deepEqual(dart.getGenericArgs(someValue), ['hi', 123]);
|
| + });
|
|
|
| - test('proper type constructor is called', () => {
|
| - // This tests https://github.com/dart-lang/dev_compiler/issues/178
|
| - let l = dart.list([1, 2, 3], core.int);
|
| - let s = l[dartx.join]();
|
| - assert.equal(s, '123');
|
| + test('proper type constructor is called', () => {
|
| + // This tests https://github.com/dart-lang/dev_compiler/issues/178
|
| + let l = dart.list([1, 2, 3], core.int);
|
| + let s = l[dartx.join]();
|
| + assert.equal(s, '123');
|
| + });
|
| });
|
| -});
|
|
|
|
|
| -suite('instanceOf', () => {
|
| - "use strict";
|
| -
|
| - let expect = assert.equal;
|
| - let isGroundType = dart.isGroundType;
|
| - let generic = dart.generic;
|
| - let intIsNonNullable = false;
|
| - let cast = dart.as;
|
| - let instanceOf = dart.is;
|
| - let strongInstanceOf = dart.strongInstanceOf;
|
| - let getReifiedType = dart.getReifiedType;
|
| - let functionType = dart.functionType;
|
| - let typedef = dart.typedef;
|
| - let isSubtype = dart.isSubtype;
|
| -
|
| - let Object = core.Object;
|
| - let String = core.String;
|
| - let dynamic = dart.dynamic;
|
| - let List = core.List;
|
| - let Map = core.Map;
|
| - let Map$ = core.Map$;
|
| - let int = core.int;
|
| - let num = core.num;
|
| - let bool = core.bool;
|
| -
|
| - class A {}
|
| - class B extends A {}
|
| - class C extends B {}
|
| -
|
| - let AA$ = generic((T, U) => class AA extends core.Object {});
|
| - let AA = AA$();
|
| - let BB$ = generic((T, U) => class BB extends AA$(U, T) {});
|
| - let BB = BB$();
|
| - class CC extends BB$(String, List) {}
|
| -
|
| - let Func2 = typedef('Func2', () => functionType(dynamic, [dynamic, dynamic]));
|
| - let Foo = typedef('Foo', () => functionType(B, [B, String]));
|
| -
|
| - let FuncG$ = generic((T, U) => typedef('FuncG', () => functionType(T, [T, U])))
|
| - let FuncG = FuncG$();
|
| -
|
| - // TODO(vsm): Revisit when we encode types on functions properly.
|
| - // A bar1(C c, String s) => null;
|
| - function bar1(c, s) { return null; }
|
| - dart.fn(bar1, dart.definiteFunctionType(A, [C, String]));
|
| -
|
| - // bar2(B b, String s) => null;
|
| - function bar2(b, s) { return null; }
|
| - dart.fn(bar2, dart.definiteFunctionType(dynamic, [B, String]));
|
| -
|
| - // B bar3(B b, Object o) => null;
|
| - function bar3(b, o) { return null; }
|
| - dart.fn(bar3, dart.definiteFunctionType(B, [B, Object]));
|
| -
|
| - // B bar4(B b, o) => null;
|
| - function bar4(b, o) { return null; }
|
| - dart.fn(bar4, dart.definiteFunctionType(B, [B, dynamic]));
|
| -
|
| - // C bar5(A a, Object o) => null;
|
| - function bar5(a, o) { return null; }
|
| - dart.fn(bar5, dart.definiteFunctionType(C, [A, Object]));
|
| -
|
| - // B bar6(B b, String s, String o) => null;
|
| - function bar6(b, s, o) { return null; }
|
| - dart.fn(bar6, dart.definiteFunctionType(B, [B, String, String]));
|
| -
|
| - // B bar7(B b, String s, [Object o]) => null;
|
| - function bar7(b, s, o) { return null; }
|
| - dart.fn(bar7, dart.definiteFunctionType(B, [B, String], [Object]));
|
| -
|
| - // B bar8(B b, String s, {Object p}) => null;
|
| - function bar8(b, s, o) { return null; }
|
| - dart.fn(bar8, dart.definiteFunctionType(B, [B, String], {p: Object}));
|
| -
|
| - let cls1 = dart.fn((c, s) => { return null; },
|
| - dart.definiteFunctionType(A, [C, String]));
|
| -
|
| - let cls2 = dart.fn((b, s) => { return null; },
|
| - dart.definiteFunctionType(dynamic, [B, String]));
|
| -
|
| - let cls3 = dart.fn((b, o) => { return null; },
|
| - dart.definiteFunctionType(B, [B, Object]));
|
| -
|
| - let cls4 = dart.fn((b, o) => { return null; },
|
| - dart.definiteFunctionType(B, [B, dynamic]));
|
| -
|
| - let cls5 = dart.fn((a, o) => { return null; },
|
| - dart.definiteFunctionType(C, [A, Object]));
|
| -
|
| - let cls6 = dart.fn((b, s, o) => { return null; },
|
| - dart.definiteFunctionType(B, [B, String, String]));
|
| -
|
| - let cls7 = dart.fn((b, s, o) => { return null; },
|
| - dart.definiteFunctionType(B, [B, String], [Object]));
|
| -
|
| - let cls8 =
|
| - dart.fn((b, s, o) => { return null; },
|
| - dart.definiteFunctionType(B, [B, String], {p: Object}));
|
| -
|
| - function checkType(x, type, expectedTrue, strongOnly) {
|
| - if (expectedTrue === undefined) expectedTrue = true;
|
| - if (strongOnly == undefined) strongOnly = false;
|
| - if (!strongOnly) {
|
| - assert.doesNotThrow(() => instanceOf(x, type));
|
| - expect(instanceOf(x, type), expectedTrue);
|
| - } else {
|
| - assert.throws(() => instanceOf(x, type), dart.StrongModeError);
|
| - expect(expectedTrue, false);
|
| - expect(strongInstanceOf(x, type), null);
|
| + suite('instanceOf', () => {
|
| + "use strict";
|
| +
|
| + let expect = assert.equal;
|
| + let isGroundType = dart.isGroundType;
|
| + let generic = dart.generic;
|
| + let intIsNonNullable = false;
|
| + let cast = dart.as;
|
| + let instanceOf = dart.is;
|
| + let strongInstanceOf = dart.strongInstanceOf;
|
| + let getReifiedType = dart.getReifiedType;
|
| + let functionType = dart.functionType;
|
| + let typedef = dart.typedef;
|
| + let isSubtype = dart.isSubtype;
|
| +
|
| + let Object = core.Object;
|
| + let String = core.String;
|
| + let dynamic = dart.dynamic;
|
| + let List = core.List;
|
| + let Map = core.Map;
|
| + let Map$ = core.Map$;
|
| + let int = core.int;
|
| + let num = core.num;
|
| + let bool = core.bool;
|
| +
|
| + class A {}
|
| + class B extends A {}
|
| + class C extends B {}
|
| +
|
| + let AA$ = generic((T, U) => class AA extends core.Object {});
|
| + let AA = AA$();
|
| + let BB$ = generic((T, U) => class BB extends AA$(U, T) {});
|
| + let BB = BB$();
|
| + class CC extends BB$(String, List) {}
|
| +
|
| + let Func2 = typedef('Func2', () => functionType(dynamic, [dynamic, dynamic]));
|
| + let Foo = typedef('Foo', () => functionType(B, [B, String]));
|
| +
|
| + let FuncG$ = generic((T, U) => typedef('FuncG', () => functionType(T, [T, U])))
|
| + let FuncG = FuncG$();
|
| +
|
| + // TODO(vsm): Revisit when we encode types on functions properly.
|
| + // A bar1(C c, String s) => null;
|
| + function bar1(c, s) { return null; }
|
| + dart.fn(bar1, dart.definiteFunctionType(A, [C, String]));
|
| +
|
| + // bar2(B b, String s) => null;
|
| + function bar2(b, s) { return null; }
|
| + dart.fn(bar2, dart.definiteFunctionType(dynamic, [B, String]));
|
| +
|
| + // B bar3(B b, Object o) => null;
|
| + function bar3(b, o) { return null; }
|
| + dart.fn(bar3, dart.definiteFunctionType(B, [B, Object]));
|
| +
|
| + // B bar4(B b, o) => null;
|
| + function bar4(b, o) { return null; }
|
| + dart.fn(bar4, dart.definiteFunctionType(B, [B, dynamic]));
|
| +
|
| + // C bar5(A a, Object o) => null;
|
| + function bar5(a, o) { return null; }
|
| + dart.fn(bar5, dart.definiteFunctionType(C, [A, Object]));
|
| +
|
| + // B bar6(B b, String s, String o) => null;
|
| + function bar6(b, s, o) { return null; }
|
| + dart.fn(bar6, dart.definiteFunctionType(B, [B, String, String]));
|
| +
|
| + // B bar7(B b, String s, [Object o]) => null;
|
| + function bar7(b, s, o) { return null; }
|
| + dart.fn(bar7, dart.definiteFunctionType(B, [B, String], [Object]));
|
| +
|
| + // B bar8(B b, String s, {Object p}) => null;
|
| + function bar8(b, s, o) { return null; }
|
| + dart.fn(bar8, dart.definiteFunctionType(B, [B, String], {p: Object}));
|
| +
|
| + let cls1 = dart.fn((c, s) => { return null; },
|
| + dart.definiteFunctionType(A, [C, String]));
|
| +
|
| + let cls2 = dart.fn((b, s) => { return null; },
|
| + dart.definiteFunctionType(dynamic, [B, String]));
|
| +
|
| + let cls3 = dart.fn((b, o) => { return null; },
|
| + dart.definiteFunctionType(B, [B, Object]));
|
| +
|
| + let cls4 = dart.fn((b, o) => { return null; },
|
| + dart.definiteFunctionType(B, [B, dynamic]));
|
| +
|
| + let cls5 = dart.fn((a, o) => { return null; },
|
| + dart.definiteFunctionType(C, [A, Object]));
|
| +
|
| + let cls6 = dart.fn((b, s, o) => { return null; },
|
| + dart.definiteFunctionType(B, [B, String, String]));
|
| +
|
| + let cls7 = dart.fn((b, s, o) => { return null; },
|
| + dart.definiteFunctionType(B, [B, String], [Object]));
|
| +
|
| + let cls8 =
|
| + dart.fn((b, s, o) => { return null; },
|
| + dart.definiteFunctionType(B, [B, String], {p: Object}));
|
| +
|
| + function checkType(x, type, expectedTrue, strongOnly) {
|
| + if (expectedTrue === undefined) expectedTrue = true;
|
| + if (strongOnly == undefined) strongOnly = false;
|
| + if (!strongOnly) {
|
| + assert.doesNotThrow(() => instanceOf(x, type));
|
| + expect(instanceOf(x, type), expectedTrue);
|
| + } else {
|
| + assert.throws(() => instanceOf(x, type), dart.StrongModeError);
|
| + expect(expectedTrue, false);
|
| + expect(strongInstanceOf(x, type), null);
|
| + }
|
| }
|
| - }
|
| -
|
| - test('int', () => {
|
| - expect(isGroundType(int), true);
|
| - expect(isGroundType(getReifiedType(5)), true);
|
| -
|
| - checkType(5, int);
|
| - checkType(5, dynamic);
|
| - checkType(5, Object);
|
| - checkType(5, num);
|
|
|
| - checkType(5, bool, false);
|
| - checkType(5, String, false);
|
| + test('int', () => {
|
| + expect(isGroundType(int), true);
|
| + expect(isGroundType(getReifiedType(5)), true);
|
|
|
| - expect(cast(5, int), 5);
|
| - if (intIsNonNullable) {
|
| - expect(() => cast(null, int), throws);
|
| - } else {
|
| - expect(cast(null, int), null);
|
| - }
|
| - });
|
| + checkType(5, int);
|
| + checkType(5, dynamic);
|
| + checkType(5, Object);
|
| + checkType(5, num);
|
|
|
| - test('dynamic', () => {
|
| - expect(isGroundType(dynamic), true);
|
| - checkType(new Object(), dynamic);
|
| - checkType(null, dynamic);
|
| + checkType(5, bool, false);
|
| + checkType(5, String, false);
|
|
|
| - expect(cast(null, dynamic), null);
|
| - });
|
| + expect(cast(5, int), 5);
|
| + if (intIsNonNullable) {
|
| + expect(() => cast(null, int), throws);
|
| + } else {
|
| + expect(cast(null, int), null);
|
| + }
|
| + });
|
|
|
| - test('Object', () => {
|
| - expect(isGroundType(Object), true);
|
| - checkType(new Object(), dynamic);
|
| - checkType(null, Object);
|
| + test('dynamic', () => {
|
| + expect(isGroundType(dynamic), true);
|
| + checkType(new Object(), dynamic);
|
| + checkType(null, dynamic);
|
|
|
| - expect(cast(null, Object), null);
|
| - });
|
| + expect(cast(null, dynamic), null);
|
| + });
|
|
|
| - test('null', () => {
|
| - // Object, dynamic cases are already handled above.
|
| - checkType(null, core.Null);
|
| - checkType(null, core.String, false);
|
| - checkType(null, core.int, false);
|
| - checkType(null, Map, false);
|
| - checkType(void 0, core.Null);
|
| - checkType(void 0, core.Object);
|
| - checkType(void 0, dart.dynamic);
|
| - });
|
| + test('Object', () => {
|
| + expect(isGroundType(Object), true);
|
| + checkType(new Object(), dynamic);
|
| + checkType(null, Object);
|
|
|
| - test('String', () => {
|
| - expect(isGroundType(String), true);
|
| - expect(isGroundType(getReifiedType("foo")), true);
|
| - checkType("foo", String);
|
| - checkType("foo", Object);
|
| - checkType("foo", dynamic);
|
| + expect(cast(null, Object), null);
|
| + });
|
|
|
| - expect(cast(null, String), null);
|
| - });
|
| + test('null', () => {
|
| + // Object, dynamic cases are already handled above.
|
| + checkType(null, core.Null);
|
| + checkType(null, core.String, false);
|
| + checkType(null, core.int, false);
|
| + checkType(null, Map, false);
|
| + checkType(void 0, core.Null);
|
| + checkType(void 0, core.Object);
|
| + checkType(void 0, dart.dynamic);
|
| + });
|
|
|
| - test('Map', () => {
|
| - let m1 = new (Map$(String, String))();
|
| - let m2 = new (Map$(Object, Object))();
|
| - let m3 = new Map();
|
| - let m4 = new (collection.HashMap$(dart.dynamic, dart.dynamic))();
|
| - let m5 = new collection.LinkedHashMap();
|
| - let m6 = new (Map$(String, dart.dynamic))();
|
| -
|
| -
|
| - expect(isGroundType(Map), true);
|
| - expect(isGroundType(getReifiedType(m1)), false);
|
| - expect(isGroundType(Map$(String, String)), false);
|
| - expect(isGroundType(getReifiedType(m2)), true);
|
| - expect(isGroundType(Map$(Object, Object)), true);
|
| - expect(isGroundType(getReifiedType(m3)), true);
|
| - expect(isGroundType(Map), true);
|
| - expect(isGroundType(getReifiedType(m4)), true);
|
| - expect(isGroundType(collection.HashMap$(dynamic, dynamic)), true);
|
| - expect(isGroundType(getReifiedType(m5)), true);
|
| - expect(isGroundType(collection.LinkedHashMap), true);
|
| - expect(isGroundType(collection.LinkedHashMap), true);
|
| -
|
| - // Map<T1,T2> <: Map
|
| - checkType(m1, Map);
|
| - checkType(m1, Object);
|
| -
|
| - // Instance of self
|
| - checkType(m1, getReifiedType(m1));
|
| - checkType(m1, Map$(String, String));
|
| -
|
| - // Covariance on generics
|
| - checkType(m1, getReifiedType(m2));
|
| - checkType(m1, Map$(Object, Object));
|
| -
|
| - // No contravariance on generics.
|
| - checkType(m2, getReifiedType(m1), false);
|
| - checkType(m2, Map$(String, String), false);
|
| -
|
| - // null is! Map
|
| - checkType(null, Map, false);
|
| -
|
| - // Raw generic types
|
| - checkType(m5, Map);
|
| - checkType(m4, Map);
|
| -
|
| - // Is checks
|
| - assert.throws(() => dart.is(m3, Map$(String, String)),
|
| - dart.StrongModeError);
|
| - assert.throws(() => dart.is(m6, Map$(String, String)),
|
| - dart.StrongModeError);
|
| - assert.isTrue(dart.is(m1, Map$(String, String)));
|
| - assert.isFalse(dart.is(m2, Map$(String, String)));
|
| -
|
| - // As checks
|
| - // TODO(vsm): Enable these. We're currently only logging warnings on
|
| - // StrongModeErrors.
|
| - // assert.throws(() => dart.as(m3, Map$(String, String)),
|
| - // dart.StrongModeError);
|
| - // assert.throws(() => dart.as(m6, Map$(String, String)),
|
| - // dart.StrongModeError);
|
| - assert.equal(dart.as(m1, Map$(String, String)), m1);
|
| - // assert.throws(() => dart.as(m2, Map$(String, String)),
|
| - // dart.StrongModeError);
|
| - });
|
| + test('String', () => {
|
| + expect(isGroundType(String), true);
|
| + expect(isGroundType(getReifiedType("foo")), true);
|
| + checkType("foo", String);
|
| + checkType("foo", Object);
|
| + checkType("foo", dynamic);
|
|
|
| - test('constructors', () => {
|
| - class C extends core.Object {
|
| - C(x) {};
|
| - named(x, y) {};
|
| - }
|
| - dart.defineNamedConstructor(C, 'named');
|
| - dart.setSignature(C, {
|
| - constructors: () => ({
|
| - C: dart.definiteFunctionType(C, [core.int]),
|
| - named: dart.definiteFunctionType(C, [core.int, core.int])
|
| - })
|
| + expect(cast(null, String), null);
|
| });
|
| - let getType = dart.classGetConstructorType;
|
| - isSubtype(getType(C), dart.functionType(C, [core.int]));
|
| - isSubtype(getType(C), dart.functionType(C, [core.String]), false);
|
| - isSubtype(getType(C, 'C'), dart.functionType(C, [core.int]));
|
| - isSubtype(getType(C, 'C'), dart.functionType(C, [core.String]), false);
|
| - isSubtype(getType(C, 'named'), dart.functionType(C, [core.int, core.int]));
|
| - isSubtype(getType(C, 'named'),
|
| - dart.functionType(C, [core.int, core.String]), false);
|
| - });
|
|
|
| - test('generic and inheritance', () => {
|
| - let aaraw = new AA();
|
| - let aarawtype = getReifiedType(aaraw);
|
| - let aadynamic = new (AA$(dynamic, dynamic))();
|
| - let aadynamictype = getReifiedType(aadynamic);
|
| - let aa = new (AA$(String, List))();
|
| - let aatype = getReifiedType(aa);
|
| - let bb = new (BB$(String, List))();
|
| - let bbtype = getReifiedType(bb);
|
| - let cc = new CC();
|
| - let cctype = getReifiedType(cc);
|
| - // We don't allow constructing bad types.
|
| - // This was AA<String> in Dart (wrong number of type args).
|
| - let aabad = new (AA$(dart.dynamic, dart.dynamic))();
|
| - let aabadtype = getReifiedType(aabad);
|
| -
|
| - expect(isGroundType(aatype), false);
|
| - expect(isGroundType(AA$(String, List)), false);
|
| - expect(isGroundType(bbtype), false);
|
| - expect(isGroundType(BB$(String, List)), false);
|
| - expect(isGroundType(cctype), true);
|
| - expect(isGroundType(CC), true);
|
| - checkType(cc, aatype, false);
|
| - checkType(cc, AA$(String, List), false);
|
| - checkType(cc, bbtype);
|
| - checkType(cc, BB$(String, List));
|
| - checkType(aa, cctype, false);
|
| - checkType(aa, CC, false);
|
| - checkType(aa, bbtype, false);
|
| - checkType(aa, BB$(String, List), false);
|
| - checkType(bb, cctype, false);
|
| - checkType(bb, CC, false);
|
| - checkType(aa, aabadtype);
|
| - checkType(aa, dynamic);
|
| - checkType(aabad, aatype, false, true);
|
| - checkType(aabad, AA$(String, List), false, true);
|
| - checkType(aabad, aarawtype);
|
| - checkType(aabad, AA);
|
| - checkType(aaraw, aabadtype);
|
| - checkType(aaraw, AA$(dart.dynamic, dart.dynamic));
|
| - checkType(aaraw, aadynamictype);
|
| - checkType(aaraw, AA$(dynamic, dynamic));
|
| - checkType(aadynamic, aarawtype);
|
| - checkType(aadynamic, AA);
|
| - });
|
| + test('Map', () => {
|
| + let m1 = new (Map$(String, String))();
|
| + let m2 = new (Map$(Object, Object))();
|
| + let m3 = new Map();
|
| + let m4 = new (collection.HashMap$(dart.dynamic, dart.dynamic))();
|
| + let m5 = new collection.LinkedHashMap();
|
| + let m6 = new (Map$(String, dart.dynamic))();
|
| +
|
| +
|
| + expect(isGroundType(Map), true);
|
| + expect(isGroundType(getReifiedType(m1)), false);
|
| + expect(isGroundType(Map$(String, String)), false);
|
| + expect(isGroundType(getReifiedType(m2)), true);
|
| + expect(isGroundType(Map$(Object, Object)), true);
|
| + expect(isGroundType(getReifiedType(m3)), true);
|
| + expect(isGroundType(Map), true);
|
| + expect(isGroundType(getReifiedType(m4)), true);
|
| + expect(isGroundType(collection.HashMap$(dynamic, dynamic)), true);
|
| + expect(isGroundType(getReifiedType(m5)), true);
|
| + expect(isGroundType(collection.LinkedHashMap), true);
|
| + expect(isGroundType(collection.LinkedHashMap), true);
|
| +
|
| + // Map<T1,T2> <: Map
|
| + checkType(m1, Map);
|
| + checkType(m1, Object);
|
| +
|
| + // Instance of self
|
| + checkType(m1, getReifiedType(m1));
|
| + checkType(m1, Map$(String, String));
|
| +
|
| + // Covariance on generics
|
| + checkType(m1, getReifiedType(m2));
|
| + checkType(m1, Map$(Object, Object));
|
| +
|
| + // No contravariance on generics.
|
| + checkType(m2, getReifiedType(m1), false);
|
| + checkType(m2, Map$(String, String), false);
|
| +
|
| + // null is! Map
|
| + checkType(null, Map, false);
|
| +
|
| + // Raw generic types
|
| + checkType(m5, Map);
|
| + checkType(m4, Map);
|
| +
|
| + // Is checks
|
| + assert.throws(() => dart.is(m3, Map$(String, String)),
|
| + dart.StrongModeError);
|
| + assert.throws(() => dart.is(m6, Map$(String, String)),
|
| + dart.StrongModeError);
|
| + assert.isTrue(dart.is(m1, Map$(String, String)));
|
| + assert.isFalse(dart.is(m2, Map$(String, String)));
|
| +
|
| + // As checks
|
| + // TODO(vsm): Enable these. We're currently only logging warnings on
|
| + // StrongModeErrors.
|
| + // assert.throws(() => dart.as(m3, Map$(String, String)),
|
| + // dart.StrongModeError);
|
| + // assert.throws(() => dart.as(m6, Map$(String, String)),
|
| + // dart.StrongModeError);
|
| + assert.equal(dart.as(m1, Map$(String, String)), m1);
|
| + // assert.throws(() => dart.as(m2, Map$(String, String)),
|
| + // dart.StrongModeError);
|
| + });
|
|
|
| - test('void', () => {
|
| - //checkType((x) => x, type((void _(x)) {}));
|
| - });
|
| + test('constructors', () => {
|
| + class C extends core.Object {
|
| + C(x) {};
|
| + named(x, y) {};
|
| + }
|
| + dart.defineNamedConstructor(C, 'named');
|
| + dart.setSignature(C, {
|
| + constructors: () => ({
|
| + C: dart.definiteFunctionType(C, [core.int]),
|
| + named: dart.definiteFunctionType(C, [core.int, core.int])
|
| + })
|
| + });
|
| + let getType = dart.classGetConstructorType;
|
| + isSubtype(getType(C), dart.functionType(C, [core.int]));
|
| + isSubtype(getType(C), dart.functionType(C, [core.String]), false);
|
| + isSubtype(getType(C, 'C'), dart.functionType(C, [core.int]));
|
| + isSubtype(getType(C, 'C'), dart.functionType(C, [core.String]), false);
|
| + isSubtype(getType(C, 'named'), dart.functionType(C, [core.int, core.int]));
|
| + isSubtype(getType(C, 'named'),
|
| + dart.functionType(C, [core.int, core.String]), false);
|
| + });
|
|
|
| - test('mixins', () => {
|
| - let c = collection;
|
| - var s1 = new (c.SplayTreeSet$(String))();
|
| + test('generic and inheritance', () => {
|
| + let aaraw = new AA();
|
| + let aarawtype = getReifiedType(aaraw);
|
| + let aadynamic = new (AA$(dynamic, dynamic))();
|
| + let aadynamictype = getReifiedType(aadynamic);
|
| + let aa = new (AA$(String, List))();
|
| + let aatype = getReifiedType(aa);
|
| + let bb = new (BB$(String, List))();
|
| + let bbtype = getReifiedType(bb);
|
| + let cc = new CC();
|
| + let cctype = getReifiedType(cc);
|
| + // We don't allow constructing bad types.
|
| + // This was AA<String> in Dart (wrong number of type args).
|
| + let aabad = new (AA$(dart.dynamic, dart.dynamic))();
|
| + let aabadtype = getReifiedType(aabad);
|
| +
|
| + expect(isGroundType(aatype), false);
|
| + expect(isGroundType(AA$(String, List)), false);
|
| + expect(isGroundType(bbtype), false);
|
| + expect(isGroundType(BB$(String, List)), false);
|
| + expect(isGroundType(cctype), true);
|
| + expect(isGroundType(CC), true);
|
| + checkType(cc, aatype, false);
|
| + checkType(cc, AA$(String, List), false);
|
| + checkType(cc, bbtype);
|
| + checkType(cc, BB$(String, List));
|
| + checkType(aa, cctype, false);
|
| + checkType(aa, CC, false);
|
| + checkType(aa, bbtype, false);
|
| + checkType(aa, BB$(String, List), false);
|
| + checkType(bb, cctype, false);
|
| + checkType(bb, CC, false);
|
| + checkType(aa, aabadtype);
|
| + checkType(aa, dynamic);
|
| + checkType(aabad, aatype, false, true);
|
| + checkType(aabad, AA$(String, List), false, true);
|
| + checkType(aabad, aarawtype);
|
| + checkType(aabad, AA);
|
| + checkType(aaraw, aabadtype);
|
| + checkType(aaraw, AA$(dart.dynamic, dart.dynamic));
|
| + checkType(aaraw, aadynamictype);
|
| + checkType(aaraw, AA$(dynamic, dynamic));
|
| + checkType(aadynamic, aarawtype);
|
| + checkType(aadynamic, AA);
|
| + });
|
|
|
| - checkType(s1, c.IterableMixin);
|
| - checkType(s1, c.IterableMixin$(String));
|
| - checkType(s1, c.IterableMixin$(int), false);
|
| + test('void', () => {
|
| + //checkType((x) => x, type((void _(x)) {}));
|
| + });
|
|
|
| - checkType(s1, c.SetMixin);
|
| - checkType(s1, c.SetMixin$(String));
|
| - checkType(s1, c.SetMixin$(int), false);
|
| - });
|
| + test('mixins', () => {
|
| + let c = collection;
|
| + var s1 = new (c.SplayTreeSet$(String))();
|
|
|
| - test('Type', () => {
|
| - checkType(int, core.Type, true);
|
| - checkType(num, core.Type, true);
|
| - checkType(bool, core.Type, true);
|
| - checkType(String, core.Type, true);
|
| - checkType(dynamic, core.Type, true);
|
| - checkType(Object, core.Type, true);
|
| - checkType(List, core.Type, true);
|
| - checkType(Map, core.Type, true);
|
| - checkType(Map$(int, String), core.Type, true);
|
| - checkType(Func2, core.Type, true);
|
| - checkType(functionType(dynamic, [dynamic]), core.Type, true);
|
| - checkType(core.Type, core.Type, true);
|
| -
|
| - checkType(3, core.Type, false);
|
| - checkType("hello", core.Type, false);
|
| - })
|
| -
|
| - test('Functions', () => {
|
| - // - return type: Dart is bivariant. We're covariant.
|
| - // - param types: Dart is bivariant. We're contravariant.
|
| - expect(isGroundType(Func2), true);
|
| - expect(isGroundType(Foo), false);
|
| - expect(isGroundType(functionType(B, [B, String])), false);
|
| - checkType(bar1, Foo, false, true);
|
| - checkType(cls1, Foo, false, true);
|
| - checkType(bar1, functionType(B, [B, String]), false, true);
|
| - checkType(cls1, functionType(B, [B, String]), false, true);
|
| - checkType(bar2, Foo, false, true);
|
| - checkType(cls2, Foo, false, true);
|
| - checkType(bar2, functionType(B, [B, String]), false, true);
|
| - checkType(cls2, functionType(B, [B, String]), false, true);
|
| - checkType(bar3, Foo);
|
| - checkType(cls3, Foo);
|
| - checkType(bar3, functionType(B, [B, String]));
|
| - checkType(cls3, functionType(B, [B, String]));
|
| - checkType(bar4, Foo, true);
|
| - checkType(cls4, Foo, true);
|
| - checkType(bar4, functionType(B, [B, String]), true);
|
| - checkType(cls4, functionType(B, [B, String]), true);
|
| - checkType(bar5, Foo);
|
| - checkType(cls5, Foo);
|
| - checkType(bar5, functionType(B, [B, String]));
|
| - checkType(cls5, functionType(B, [B, String]));
|
| - checkType(bar6, Foo, false);
|
| - checkType(cls6, Foo, false);
|
| - checkType(bar6, functionType(B, [B, String]), false);
|
| - checkType(cls6, functionType(B, [B, String]), false);
|
| - checkType(bar7, Foo);
|
| - checkType(cls7, Foo);
|
| - checkType(bar7, functionType(B, [B, String]));
|
| - checkType(cls7, functionType(B, [B, String]));
|
| - checkType(bar7, getReifiedType(bar6));
|
| - checkType(cls7, getReifiedType(bar6));
|
| - checkType(bar8, Foo);
|
| - checkType(cls8, Foo);
|
| - checkType(bar8, functionType(B, [B, String]));
|
| - checkType(cls8, functionType(B, [B, String]));
|
| - checkType(bar8, getReifiedType(bar6), false);
|
| - checkType(cls8, getReifiedType(bar6), false);
|
| - checkType(bar7, getReifiedType(bar8), false);
|
| - checkType(cls7, getReifiedType(bar8), false);
|
| - checkType(bar8, getReifiedType(bar7), false);
|
| - checkType(cls8, getReifiedType(bar7), false);
|
| -
|
| - // Parameterized typedefs
|
| - expect(isGroundType(FuncG), true);
|
| - expect(isGroundType(FuncG$(B, String)), false);
|
| - checkType(bar1, FuncG$(B, String), false, true);
|
| - checkType(cls1, FuncG$(B, String), false, true);
|
| - checkType(bar3, FuncG$(B, String));
|
| - checkType(cls3, FuncG$(B, String));
|
| - });
|
| + checkType(s1, c.IterableMixin);
|
| + checkType(s1, c.IterableMixin$(String));
|
| + checkType(s1, c.IterableMixin$(int), false);
|
|
|
| - test('dcall', () => {
|
| - function dd2d(x, y) {return x};
|
| - dart.fn(dd2d);
|
| - function ii2i(x, y) {return x};
|
| - dart.fn(ii2i, dart.definiteFunctionType(core.int, [core.int, core.int]));
|
| - function ii_2i(x, y) {return x};
|
| - dart.fn(ii_2i, dart.definiteFunctionType(core.int, [core.int], [core.int]));
|
| - function i_i2i(x, opts) {return x};
|
| - dart.fn(i_i2i,
|
| - dart.definiteFunctionType(core.int, [core.int], {extra: core.int}));
|
| -
|
| - assert.equal(dart.dcall(dd2d, 0, 1), 0);
|
| - assert.equal(dart.dcall(dd2d, "hello", "world"), "hello");
|
| - assert.throws(() => dart.dcall(dd2d, 0));
|
| - assert.throws(() => dart.dcall(dd2d, 0, 1, 2));
|
| - assert.throws(() => dart.dcall(dd2d, 0, 1, {extra : 3}));
|
| - // This should throw but currently doesn't.
|
| - // assert.throws(() => dart.dcall(dd2d, 0, {extra:3}));
|
| -
|
| - assert.equal(dart.dcall(ii2i, 0, 1), 0);
|
| - assert.throws(() => dart.dcall(ii2i, "hello", "world"));
|
| - assert.throws(() => dart.dcall(ii2i, 0));
|
| - assert.throws(() => dart.dcall(ii2i, 0, 1, 2));
|
| -
|
| - assert.equal(dart.dcall(ii_2i, 0, 1), 0);
|
| - assert.throws(() => dart.dcall(ii_2i, "hello", "world"));
|
| - assert.equal(dart.dcall(ii_2i, 0), 0);
|
| - assert.throws(() => dart.dcall(ii_2i, 0, 1, 2));
|
| -
|
| - assert.throws(() => dart.dcall(i_i2i, 0, 1));
|
| - assert.throws(() => dart.dcall(i_i2i, "hello", "world"));
|
| - assert.equal(dart.dcall(i_i2i, 0), 0);
|
| - assert.throws(() => dart.dcall(i_i2i, 0, 1, 2));
|
| - assert.equal(dart.dcall(i_i2i, 0, {extra: 3}), 0);
|
| - });
|
| + checkType(s1, c.SetMixin);
|
| + checkType(s1, c.SetMixin$(String));
|
| + checkType(s1, c.SetMixin$(int), false);
|
| + });
|
|
|
| - test('dsend', () => {
|
| - class Tester extends core.Object {
|
| - new() {
|
| - this.f = dart.fn(x => x,
|
| - dart.definiteFunctionType(core.int, [core.int]));
|
| - this.me = this;
|
| - }
|
| - m(x, y) {return x;}
|
| - call(x) {return x;}
|
| - static s(x, y) { return x;}
|
| - }
|
| - dart.setSignature(Tester, {
|
| - methods: () => ({
|
| - m: dart.definiteFunctionType(core.int, [core.int, core.int]),
|
| - call: dart.definiteFunctionType(core.int, [core.int])
|
| - }),
|
| - statics: () => ({
|
| - s: dart.definiteFunctionType(core.String, [core.String])
|
| - }),
|
| - names: ['s']
|
| + test('Type', () => {
|
| + checkType(int, core.Type, true);
|
| + checkType(num, core.Type, true);
|
| + checkType(bool, core.Type, true);
|
| + checkType(String, core.Type, true);
|
| + checkType(dynamic, core.Type, true);
|
| + checkType(Object, core.Type, true);
|
| + checkType(List, core.Type, true);
|
| + checkType(Map, core.Type, true);
|
| + checkType(Map$(int, String), core.Type, true);
|
| + checkType(Func2, core.Type, true);
|
| + checkType(functionType(dynamic, [dynamic]), core.Type, true);
|
| + checkType(core.Type, core.Type, true);
|
| +
|
| + checkType(3, core.Type, false);
|
| + checkType("hello", core.Type, false);
|
| })
|
| - let o = new Tester();
|
| -
|
| - // Method send
|
| - assert.equal(dart.dsend(o, 'm', 3, 4), 3);
|
| - assert.equal(dart.dsend(o, 'm', null, 4), null);
|
| - assert.throws(() => dart.dsend(o, 'm', 3));
|
| - assert.throws(() => dart.dsend(o, 'm', "hello", "world"));
|
| - assert.throws(() => dart.dsend(o, 'q', 3));
|
| -
|
| - // Method send through a field
|
| - assert.equal(dart.dsend(o, 'f', 3), 3);
|
| - assert.equal(dart.dsend(o, 'f', null), null);
|
| - assert.throws(() => dart.dsend(o, 'f', "hello"));
|
| - assert.throws(() => dart.dsend(o, 'f', 3, 4));
|
| -
|
| - // Static method call
|
| - assert.equal(dart.dcall(Tester.s, "hello"), "hello");
|
| - assert.equal(dart.dcall(Tester.s, null), null);
|
| - assert.throws(() => dart.dcall(Tester.s, "hello", "world"));
|
| - assert.throws(() => dart.dcall(Tester.s, 0, 1));
|
| -
|
| - // Calling an object with a call method
|
| - assert.equal(dart.dcall(o, 3), 3);
|
| - assert.equal(dart.dcall(o, null), null);
|
| - assert.throws(() => dart.dcall(o, "hello"));
|
| - assert.throws(() => dart.dcall(o, 3, 4));
|
| -
|
| - // Calling through a field containing an object with a call method
|
| - assert.equal(dart.dsend(o, 'me', 3), 3);
|
| - assert.equal(dart.dsend(o, 'me', null), null);
|
| - assert.throws(() => dart.dsend(o, 'me', "hello"));
|
| - assert.throws(() => dart.dsend(o, 'me', 3, 4));
|
| - });
|
|
|
| - test('Types on top level functions', () => {
|
| - // Test some generated code
|
| - // Test the lazy path
|
| - checkType(core.identityHashCode,
|
| - dart.functionType(core.int, [core.Object]));
|
| - // Test the normal path
|
| - checkType(core.identical,
|
| - dart.functionType(core.bool,
|
| - [core.Object, core.Object]));
|
| -
|
| - // Hand crafted tests
|
| - // All dynamic
|
| - function dd2d(x, y) {return x};
|
| - dart.fn(dd2d);
|
| - checkType(dd2d, dart.functionType(dart.dynamic,
|
| - [dart.dynamic, dart.dynamic]));
|
| -
|
| - // Set the type eagerly
|
| - function ii2i(x, y) {return x};
|
| - dart.fn(ii2i, dart.definiteFunctionType(core.int, [core.int, core.int]));
|
| - checkType(ii2i, dart.functionType(core.int,
|
| - [core.int, core.int]));
|
| -
|
| - // Set the type lazily
|
| - function ss2s(x, y) {return x};
|
| - var coreString;
|
| - dart.lazyFn(ss2s,
|
| - () => dart.definiteFunctionType(coreString,
|
| - [coreString, coreString]));
|
| - coreString = core.String;
|
| - checkType(ss2s, dart.functionType(core.String,
|
| - [core.String, core.String]));
|
| -
|
| - // Optional types
|
| - function ii_2i(x, y) {return x};
|
| - dart.fn(ii_2i, dart.definiteFunctionType(core.int, [core.int], [core.int]));
|
| - checkType(ii_2i, dart.functionType(core.int, [core.int],
|
| - [core.int]));
|
| - checkType(ii_2i, dart.functionType(core.int, [core.int,
|
| - core.int]));
|
| - checkType(ii_2i, dart.functionType(core.int, [], [core.int,
|
| - core.int]),
|
| - false);
|
| - checkType(ii_2i, dart.functionType(core.int, [core.int],
|
| - {extra: core.int}), false);
|
| -
|
| - // Named types
|
| - function i_i2i(x, opts) {return x};
|
| - dart.fn(i_i2i, dart.definiteFunctionType(core.int, [core.int],
|
| - {extra: core.int}));
|
| - checkType(i_i2i, dart.functionType(core.int, [core.int],
|
| - {extra: core.int}));
|
| - checkType(i_i2i, dart.functionType(core.int,
|
| - [core.int, core.int]), false);
|
| - checkType(i_i2i, dart.functionType(core.int, [core.int], {}));
|
| - checkType(i_i2i,
|
| - dart.functionType(core.int, [], {extra: core.int,
|
| - also: core.int}), false);
|
| - checkType(i_i2i,
|
| - dart.functionType(core.int, [core.int], [core.int]), false);
|
| - });
|
| + test('Functions', () => {
|
| + // - return type: Dart is bivariant. We're covariant.
|
| + // - param types: Dart is bivariant. We're contravariant.
|
| + expect(isGroundType(Func2), true);
|
| + expect(isGroundType(Foo), false);
|
| + expect(isGroundType(functionType(B, [B, String])), false);
|
| + checkType(bar1, Foo, false, true);
|
| + checkType(cls1, Foo, false, true);
|
| + checkType(bar1, functionType(B, [B, String]), false, true);
|
| + checkType(cls1, functionType(B, [B, String]), false, true);
|
| + checkType(bar2, Foo, false, true);
|
| + checkType(cls2, Foo, false, true);
|
| + checkType(bar2, functionType(B, [B, String]), false, true);
|
| + checkType(cls2, functionType(B, [B, String]), false, true);
|
| + checkType(bar3, Foo);
|
| + checkType(cls3, Foo);
|
| + checkType(bar3, functionType(B, [B, String]));
|
| + checkType(cls3, functionType(B, [B, String]));
|
| + checkType(bar4, Foo, true);
|
| + checkType(cls4, Foo, true);
|
| + checkType(bar4, functionType(B, [B, String]), true);
|
| + checkType(cls4, functionType(B, [B, String]), true);
|
| + checkType(bar5, Foo);
|
| + checkType(cls5, Foo);
|
| + checkType(bar5, functionType(B, [B, String]));
|
| + checkType(cls5, functionType(B, [B, String]));
|
| + checkType(bar6, Foo, false);
|
| + checkType(cls6, Foo, false);
|
| + checkType(bar6, functionType(B, [B, String]), false);
|
| + checkType(cls6, functionType(B, [B, String]), false);
|
| + checkType(bar7, Foo);
|
| + checkType(cls7, Foo);
|
| + checkType(bar7, functionType(B, [B, String]));
|
| + checkType(cls7, functionType(B, [B, String]));
|
| + checkType(bar7, getReifiedType(bar6));
|
| + checkType(cls7, getReifiedType(bar6));
|
| + checkType(bar8, Foo);
|
| + checkType(cls8, Foo);
|
| + checkType(bar8, functionType(B, [B, String]));
|
| + checkType(cls8, functionType(B, [B, String]));
|
| + checkType(bar8, getReifiedType(bar6), false);
|
| + checkType(cls8, getReifiedType(bar6), false);
|
| + checkType(bar7, getReifiedType(bar8), false);
|
| + checkType(cls7, getReifiedType(bar8), false);
|
| + checkType(bar8, getReifiedType(bar7), false);
|
| + checkType(cls8, getReifiedType(bar7), false);
|
| +
|
| + // Parameterized typedefs
|
| + expect(isGroundType(FuncG), true);
|
| + expect(isGroundType(FuncG$(B, String)), false);
|
| + checkType(bar1, FuncG$(B, String), false, true);
|
| + checkType(cls1, FuncG$(B, String), false, true);
|
| + checkType(bar3, FuncG$(B, String));
|
| + checkType(cls3, FuncG$(B, String));
|
| + });
|
|
|
| - test('Method tearoffs', () => {
|
| - let c = collection;
|
| - // Tear off of an inherited method
|
| - let map = new (Map$(core.int, core.String))();
|
| - checkType(dart.bind(map, 'toString'),
|
| - dart.functionType(String, []));
|
| - checkType(dart.bind(map, 'toString'),
|
| - dart.functionType(int, []), false, true);
|
| -
|
| - // Tear off of a method directly on the object
|
| - let smap = new (c.SplayTreeMap$(core.int, core.String))();
|
| - checkType(dart.bind(smap, 'forEach'),
|
| - dart.functionType(dart.void,
|
| - [dart.functionType(dart.void, [core.int, core.String])]));
|
| - checkType(dart.bind(smap, 'forEach'),
|
| - dart.functionType(dart.void,
|
| - [dart.functionType(dart.void,
|
| - [core.String, core.String])]), false, true);
|
| -
|
| - // Tear off of a mixed in method
|
| - let mapB = new (c.MapBase$(core.int, core.int))();
|
| - checkType(dart.bind(mapB, 'forEach'),
|
| - dart.functionType(dart.void, [
|
| - dart.functionType(dart.void, [core.int, core.int])]));
|
| - checkType(dart.bind(mapB, 'forEach'),
|
| - dart.functionType(dart.void, [
|
| - dart.functionType(dart.void, [core.int, core.String])]),
|
| - false, true);
|
| -
|
| - // Tear off of a method with a symbol name
|
| - let listB = new (c.ListBase$(core.int))();
|
| - checkType(dart.bind(listB, dartx.add),
|
| - dart.functionType(dart.void, [core.int]));
|
| - checkType(dart.bind(listB, dartx.add),
|
| - dart.functionType(dart.void, [core.String]), false, true);
|
| -
|
| - // Tear off of a static method
|
| - checkType(c.ListBase.listToString,
|
| - dart.functionType(core.String, [core.List]));
|
| - checkType(c.ListBase.listToString,
|
| - dart.functionType(core.String, [core.String]), false, true);
|
| -
|
| - // Tear-off of extension methods on primitives
|
| - checkType(dart.bind(3.0, dartx.floor),
|
| - dart.functionType(core.int, []));
|
| - checkType(dart.bind(3.0, dartx.floor),
|
| - dart.functionType(core.String, []), false, true);
|
| - checkType(dart.bind("", dartx.endsWith),
|
| - dart.functionType(core.bool, [core.String]));
|
| - checkType(dart.bind("", dartx.endsWith),
|
| - dart.functionType(core.bool, [core.int]), false, true);
|
| -
|
| - // Tear off a mixin method
|
| - class Base {
|
| - m(x) {return x;}
|
| - };
|
| - dart.setSignature(Base, {
|
| - methods: () => ({
|
| - m: dart.definiteFunctionType(core.int, [core.int]),
|
| - })
|
| + test('dcall', () => {
|
| + function dd2d(x, y) {return x};
|
| + dart.fn(dd2d);
|
| + function ii2i(x, y) {return x};
|
| + dart.fn(ii2i, dart.definiteFunctionType(core.int, [core.int, core.int]));
|
| + function ii_2i(x, y) {return x};
|
| + dart.fn(ii_2i, dart.definiteFunctionType(core.int, [core.int], [core.int]));
|
| + function i_i2i(x, opts) {return x};
|
| + dart.fn(i_i2i,
|
| + dart.definiteFunctionType(core.int, [core.int], {extra: core.int}));
|
| +
|
| + assert.equal(dart.dcall(dd2d, 0, 1), 0);
|
| + assert.equal(dart.dcall(dd2d, "hello", "world"), "hello");
|
| + assert.throws(() => dart.dcall(dd2d, 0));
|
| + assert.throws(() => dart.dcall(dd2d, 0, 1, 2));
|
| + assert.throws(() => dart.dcall(dd2d, 0, 1, {extra : 3}));
|
| + // This should throw but currently doesn't.
|
| + // assert.throws(() => dart.dcall(dd2d, 0, {extra:3}));
|
| +
|
| + assert.equal(dart.dcall(ii2i, 0, 1), 0);
|
| + assert.throws(() => dart.dcall(ii2i, "hello", "world"));
|
| + assert.throws(() => dart.dcall(ii2i, 0));
|
| + assert.throws(() => dart.dcall(ii2i, 0, 1, 2));
|
| +
|
| + assert.equal(dart.dcall(ii_2i, 0, 1), 0);
|
| + assert.throws(() => dart.dcall(ii_2i, "hello", "world"));
|
| + assert.equal(dart.dcall(ii_2i, 0), 0);
|
| + assert.throws(() => dart.dcall(ii_2i, 0, 1, 2));
|
| +
|
| + assert.throws(() => dart.dcall(i_i2i, 0, 1));
|
| + assert.throws(() => dart.dcall(i_i2i, "hello", "world"));
|
| + assert.equal(dart.dcall(i_i2i, 0), 0);
|
| + assert.throws(() => dart.dcall(i_i2i, 0, 1, 2));
|
| + assert.equal(dart.dcall(i_i2i, 0, {extra: 3}), 0);
|
| });
|
|
|
| - class M1 {
|
| - m(x) {return x;}
|
| - };
|
| - dart.setSignature(M1, {
|
| - methods: () => ({
|
| - m: dart.definiteFunctionType(core.num, [core.int]),
|
| + test('dsend', () => {
|
| + class Tester extends core.Object {
|
| + new() {
|
| + this.f = dart.fn(x => x,
|
| + dart.definiteFunctionType(core.int, [core.int]));
|
| + this.me = this;
|
| + }
|
| + m(x, y) {return x;}
|
| + call(x) {return x;}
|
| + static s(x, y) { return x;}
|
| + }
|
| + dart.setSignature(Tester, {
|
| + methods: () => ({
|
| + m: dart.definiteFunctionType(core.int, [core.int, core.int]),
|
| + call: dart.definiteFunctionType(core.int, [core.int])
|
| + }),
|
| + statics: () => ({
|
| + s: dart.definiteFunctionType(core.String, [core.String])
|
| + }),
|
| + names: ['s']
|
| })
|
| + let o = new Tester();
|
| +
|
| + // Method send
|
| + assert.equal(dart.dsend(o, 'm', 3, 4), 3);
|
| + assert.equal(dart.dsend(o, 'm', null, 4), null);
|
| + assert.throws(() => dart.dsend(o, 'm', 3));
|
| + assert.throws(() => dart.dsend(o, 'm', "hello", "world"));
|
| + assert.throws(() => dart.dsend(o, 'q', 3));
|
| +
|
| + // Method send through a field
|
| + assert.equal(dart.dsend(o, 'f', 3), 3);
|
| + assert.equal(dart.dsend(o, 'f', null), null);
|
| + assert.throws(() => dart.dsend(o, 'f', "hello"));
|
| + assert.throws(() => dart.dsend(o, 'f', 3, 4));
|
| +
|
| + // Static method call
|
| + assert.equal(dart.dcall(Tester.s, "hello"), "hello");
|
| + assert.equal(dart.dcall(Tester.s, null), null);
|
| + assert.throws(() => dart.dcall(Tester.s, "hello", "world"));
|
| + assert.throws(() => dart.dcall(Tester.s, 0, 1));
|
| +
|
| + // Calling an object with a call method
|
| + assert.equal(dart.dcall(o, 3), 3);
|
| + assert.equal(dart.dcall(o, null), null);
|
| + assert.throws(() => dart.dcall(o, "hello"));
|
| + assert.throws(() => dart.dcall(o, 3, 4));
|
| +
|
| + // Calling through a field containing an object with a call method
|
| + assert.equal(dart.dsend(o, 'me', 3), 3);
|
| + assert.equal(dart.dsend(o, 'me', null), null);
|
| + assert.throws(() => dart.dsend(o, 'me', "hello"));
|
| + assert.throws(() => dart.dsend(o, 'me', 3, 4));
|
| });
|
|
|
| - class M2 {
|
| - m(x) {return x;}
|
| - };
|
| - dart.setSignature(M2, {
|
| - methods: () => ({
|
| - m: dart.definiteFunctionType(core.Object, [core.int]),
|
| - })
|
| + test('Types on top level functions', () => {
|
| + // Test some generated code
|
| + // Test the lazy path
|
| + checkType(core.identityHashCode,
|
| + dart.functionType(core.int, [core.Object]));
|
| + // Test the normal path
|
| + checkType(core.identical,
|
| + dart.functionType(core.bool,
|
| + [core.Object, core.Object]));
|
| +
|
| + // Hand crafted tests
|
| + // All dynamic
|
| + function dd2d(x, y) {return x};
|
| + dart.fn(dd2d);
|
| + checkType(dd2d, dart.functionType(dart.dynamic,
|
| + [dart.dynamic, dart.dynamic]));
|
| +
|
| + // Set the type eagerly
|
| + function ii2i(x, y) {return x};
|
| + dart.fn(ii2i, dart.definiteFunctionType(core.int, [core.int, core.int]));
|
| + checkType(ii2i, dart.functionType(core.int,
|
| + [core.int, core.int]));
|
| +
|
| + // Set the type lazily
|
| + function ss2s(x, y) {return x};
|
| + var coreString;
|
| + dart.lazyFn(ss2s,
|
| + () => dart.definiteFunctionType(coreString,
|
| + [coreString, coreString]));
|
| + coreString = core.String;
|
| + checkType(ss2s, dart.functionType(core.String,
|
| + [core.String, core.String]));
|
| +
|
| + // Optional types
|
| + function ii_2i(x, y) {return x};
|
| + dart.fn(ii_2i, dart.definiteFunctionType(core.int, [core.int], [core.int]));
|
| + checkType(ii_2i, dart.functionType(core.int, [core.int],
|
| + [core.int]));
|
| + checkType(ii_2i, dart.functionType(core.int, [core.int,
|
| + core.int]));
|
| + checkType(ii_2i, dart.functionType(core.int, [], [core.int,
|
| + core.int]),
|
| + false);
|
| + checkType(ii_2i, dart.functionType(core.int, [core.int],
|
| + {extra: core.int}), false);
|
| +
|
| + // Named types
|
| + function i_i2i(x, opts) {return x};
|
| + dart.fn(i_i2i, dart.definiteFunctionType(core.int, [core.int],
|
| + {extra: core.int}));
|
| + checkType(i_i2i, dart.functionType(core.int, [core.int],
|
| + {extra: core.int}));
|
| + checkType(i_i2i, dart.functionType(core.int,
|
| + [core.int, core.int]), false);
|
| + checkType(i_i2i, dart.functionType(core.int, [core.int], {}));
|
| + checkType(i_i2i,
|
| + dart.functionType(core.int, [], {extra: core.int,
|
| + also: core.int}), false);
|
| + checkType(i_i2i,
|
| + dart.functionType(core.int, [core.int], [core.int]), false);
|
| });
|
|
|
| - class O extends dart.mixin(Base, M1, M2) {
|
| - O() {};
|
| - };
|
| - dart.setSignature(O, {});
|
| - var obj = new O();
|
| - var m = dart.bind(obj, 'm');
|
| - checkType(m, dart.functionType(core.Object, [core.int]));
|
| - checkType(m, dart.functionType(core.int, [core.int]), false, true);
|
| -
|
| - // Test inherited signatures
|
| - class P extends O {
|
| - P() {};
|
| - m(x) {return x;};
|
| - };
|
| - dart.setSignature(P, {});
|
| - var obj = new P();
|
| - var m = dart.bind(obj, 'm');
|
| - checkType(m, dart.functionType(core.Object, [core.int]));
|
| - checkType(m, dart.functionType(core.int, [core.int]), false, true);
|
| - });
|
| + test('Method tearoffs', () => {
|
| + let c = collection;
|
| + // Tear off of an inherited method
|
| + let map = new (Map$(core.int, core.String))();
|
| + checkType(dart.bind(map, 'toString'),
|
| + dart.functionType(String, []));
|
| + checkType(dart.bind(map, 'toString'),
|
| + dart.functionType(int, []), false, true);
|
| +
|
| + // Tear off of a method directly on the object
|
| + let smap = new (c.SplayTreeMap$(core.int, core.String))();
|
| + checkType(dart.bind(smap, 'forEach'),
|
| + dart.functionType(dart.void,
|
| + [dart.functionType(dart.void, [core.int, core.String])]));
|
| + checkType(dart.bind(smap, 'forEach'),
|
| + dart.functionType(dart.void,
|
| + [dart.functionType(dart.void,
|
| + [core.String, core.String])]), false, true);
|
| +
|
| + // Tear off of a mixed in method
|
| + let mapB = new (c.MapBase$(core.int, core.int))();
|
| + checkType(dart.bind(mapB, 'forEach'),
|
| + dart.functionType(dart.void, [
|
| + dart.functionType(dart.void, [core.int, core.int])]));
|
| + checkType(dart.bind(mapB, 'forEach'),
|
| + dart.functionType(dart.void, [
|
| + dart.functionType(dart.void, [core.int, core.String])]),
|
| + false, true);
|
| +
|
| + // Tear off of a method with a symbol name
|
| + let listB = new (c.ListBase$(core.int))();
|
| + checkType(dart.bind(listB, dartx.add),
|
| + dart.functionType(dart.void, [core.int]));
|
| + checkType(dart.bind(listB, dartx.add),
|
| + dart.functionType(dart.void, [core.String]), false, true);
|
| +
|
| + // Tear off of a static method
|
| + checkType(c.ListBase.listToString,
|
| + dart.functionType(core.String, [core.List]));
|
| + checkType(c.ListBase.listToString,
|
| + dart.functionType(core.String, [core.String]), false, true);
|
| +
|
| + // Tear-off of extension methods on primitives
|
| + checkType(dart.bind(3.0, dartx.floor),
|
| + dart.functionType(core.int, []));
|
| + checkType(dart.bind(3.0, dartx.floor),
|
| + dart.functionType(core.String, []), false, true);
|
| + checkType(dart.bind("", dartx.endsWith),
|
| + dart.functionType(core.bool, [core.String]));
|
| + checkType(dart.bind("", dartx.endsWith),
|
| + dart.functionType(core.bool, [core.int]), false, true);
|
| +
|
| + // Tear off a mixin method
|
| + class Base {
|
| + m(x) {return x;}
|
| + };
|
| + dart.setSignature(Base, {
|
| + methods: () => ({
|
| + m: dart.definiteFunctionType(core.int, [core.int]),
|
| + })
|
| + });
|
| +
|
| + class M1 {
|
| + m(x) {return x;}
|
| + };
|
| + dart.setSignature(M1, {
|
| + methods: () => ({
|
| + m: dart.definiteFunctionType(core.num, [core.int]),
|
| + })
|
| + });
|
| +
|
| + class M2 {
|
| + m(x) {return x;}
|
| + };
|
| + dart.setSignature(M2, {
|
| + methods: () => ({
|
| + m: dart.definiteFunctionType(core.Object, [core.int]),
|
| + })
|
| + });
|
| +
|
| + class O extends dart.mixin(Base, M1, M2) {
|
| + O() {};
|
| + };
|
| + dart.setSignature(O, {});
|
| + var obj = new O();
|
| + var m = dart.bind(obj, 'm');
|
| + checkType(m, dart.functionType(core.Object, [core.int]));
|
| + checkType(m, dart.functionType(core.int, [core.int]), false, true);
|
| +
|
| + // Test inherited signatures
|
| + class P extends O {
|
| + P() {};
|
| + m(x) {return x;};
|
| + };
|
| + dart.setSignature(P, {});
|
| + var obj = new P();
|
| + var m = dart.bind(obj, 'm');
|
| + checkType(m, dart.functionType(core.Object, [core.int]));
|
| + checkType(m, dart.functionType(core.int, [core.int]), false, true);
|
| + });
|
|
|
| - test('Object members', () => {
|
| - let nullHash = dart.hashCode(null);
|
| - assert.equal(nullHash, 0);
|
| - let nullString = dart.toString(null);
|
| - assert.equal(nullString, 'null');
|
| + test('Object members', () => {
|
| + let nullHash = dart.hashCode(null);
|
| + assert.equal(nullHash, 0);
|
| + let nullString = dart.toString(null);
|
| + assert.equal(nullString, 'null');
|
|
|
| - let map = new Map();
|
| - let mapHash = dart.hashCode(map);
|
| - checkType(mapHash, core.int);
|
| - assert.equal(mapHash, map.hashCode);
|
| + let map = new Map();
|
| + let mapHash = dart.hashCode(map);
|
| + checkType(mapHash, core.int);
|
| + assert.equal(mapHash, map.hashCode);
|
|
|
| - let mapString = dart.toString(map);
|
| - assert.equal(mapString, map.toString());
|
| - checkType(mapString, core.String);
|
| + let mapString = dart.toString(map);
|
| + assert.equal(mapString, map.toString());
|
| + checkType(mapString, core.String);
|
|
|
| - let str = "A string";
|
| - let strHash = dart.hashCode(str);
|
| - checkType(strHash, core.int);
|
| + let str = "A string";
|
| + let strHash = dart.hashCode(str);
|
| + checkType(strHash, core.int);
|
|
|
| - let strString = dart.toString(str);
|
| - checkType(strString, core.String);
|
| - assert.equal(str, strString);
|
| + let strString = dart.toString(str);
|
| + checkType(strString, core.String);
|
| + assert.equal(str, strString);
|
|
|
| - let n = 42;
|
| - let intHash = dart.hashCode(n);
|
| - checkType(intHash, core.int);
|
| + let n = 42;
|
| + let intHash = dart.hashCode(n);
|
| + checkType(intHash, core.int);
|
|
|
| - let intString = dart.toString(n);
|
| - assert.equal(intString, '42');
|
| + let intString = dart.toString(n);
|
| + assert.equal(intString, '42');
|
| + });
|
| });
|
| -});
|
|
|
| -suite('subtyping', function() {
|
| - 'use strict';
|
| -
|
| - let functionType = dart.functionType;
|
| - let definiteFunctionType = dart.definiteFunctionType;
|
| - let typedef = dart.typedef;
|
| - let isSubtype = dart.isSubtype;
|
| - let int = core.int;
|
| - let num = core.num;
|
| - let dyn = dart.dynamic;
|
| -
|
| - function always(t1, t2) {
|
| - assert.equal(isSubtype(t1, t2), true);
|
| - }
|
| - function never(t1, t2) {
|
| - assert.equal(isSubtype(t1, t2), false);
|
| - }
|
| - function maybe(t1, t2) {
|
| - assert.equal(isSubtype(t1, t2), null);
|
| - }
|
| -
|
| - function always2(t1, t2) {
|
| - assert.equal(isSubtype(t1, t2), true);
|
| - always(functionType(t1, [t2]), functionType(t2, [t1]));
|
| - }
|
| - function never2(t1, t2) {
|
| - assert.equal(isSubtype(t1, t2), false);
|
| - maybe(functionType(t1, [t2]), functionType(t2, [t1]));
|
| - }
|
| - function maybe2(t1, t2) {
|
| - assert.equal(isSubtype(t1, t2), null);
|
| - maybe(functionType(t1, [t2]), functionType(t2, [t1]));
|
| - }
|
| -
|
| - function run_test(func1, func2, func2opt, func1extra, func2extra) {
|
| - always2(func2(int, int), func2(int, int));
|
| - always2(func2(int, num), func2(int, int));
|
| - always2(func2(int, int), func2(num, int));
|
| -
|
| - always2(func2opt(int, int), func2opt(int, int));
|
| - always2(func2opt(int, num), func2opt(int, int));
|
| - always2(func2opt(int, int), func2opt(num, int));
|
| -
|
| - always2(func2opt(int, int), func2(int, int));
|
| - always2(func2opt(int, num), func2(int, int));
|
| - always2(func2opt(int, int), func2(num, int));
|
| -
|
| - always2(func2opt(int, int), func1(int));
|
| - always2(func2opt(int, num), func1(int));
|
| - always2(func2opt(int, int), func1(num));
|
| -
|
| - always2(func2extra(int, int), func2(int, int));
|
| - always2(func2extra(int, num), func2(int, int));
|
| - always2(func2extra(int, int), func2(num, int));
|
| -
|
| - maybe2(func2(int, int), func2(int, num));
|
| - maybe2(func2(num, int), func2(int, int));
|
| -
|
| - maybe2(func2opt(num, num), func1(int));
|
| -
|
| - maybe2(func2opt(int, int), func2opt(int, num));
|
| - maybe2(func2opt(num, int), func2opt(int, int));
|
| -
|
| - maybe2(func2opt(int, int), func2(int, num));
|
| - maybe2(func2opt(num, int), func2(int, int));
|
| -
|
| - maybe2(func2extra(int, int), func2(int, num));
|
| - maybe2(func2extra(num, int), func2(int, int));
|
| -
|
| - never2(func1(int), func2(int, num));
|
| - never2(func1(num), func2(int, int));
|
| - never2(func1(num), func2(num, num));
|
| -
|
| - never2(func2(int, int), func1(int));
|
| - never2(func2(num, int), func1(int));
|
| - never2(func2(num, num), func1(num));
|
| -
|
| - never2(func1(int), func2opt(int, num));
|
| - never2(func1(num), func2opt(int, int));
|
| - never2(func1(num), func2opt(num, num));
|
| -
|
| - never2(func2(int, int), func2opt(int, num));
|
| - never2(func2(num, int), func2opt(int, int));
|
| - never2(func2(num, num), func2opt(num, num));
|
| -
|
| - never2(func1extra(int), func2(int, num));
|
| - never2(func1extra(num), func2(int, int));
|
| - never2(func1extra(num), func2(num, num));
|
| -
|
| - never2(func1extra(int), func2opt(int, num));
|
| - never2(func1extra(num), func2opt(int, int));
|
| - never2(func1extra(num), func2opt(num, num));
|
| -
|
| - never2(func1(int), func1extra(int));
|
| - never2(func1(num), func1extra(int));
|
| - never2(func1(num), func1extra(num));
|
| -
|
| - never2(func2(int, int), func1extra(int));
|
| - never2(func2(num, int), func1extra(int));
|
| - never2(func2(num, num), func1extra(num));
|
| -
|
| - never2(func2(int, int), func2extra(int, int));
|
| - never2(func2(num, int), func2extra(int, int));
|
| - never2(func2(num, num), func2extra(num, num));
|
| - };
|
| -
|
| - test('basic function types', () => {
|
| - function func1(S) {
|
| - return functionType(S, []);
|
| - }
|
| + suite('subtyping', function() {
|
| + 'use strict';
|
|
|
| - function func2(S, T) {
|
| - return functionType(S, [T]);
|
| - }
|
| + let functionType = dart.functionType;
|
| + let definiteFunctionType = dart.definiteFunctionType;
|
| + let typedef = dart.typedef;
|
| + let isSubtype = dart.isSubtype;
|
| + let int = core.int;
|
| + let num = core.num;
|
| + let dyn = dart.dynamic;
|
|
|
| - function func2opt(S, T) {
|
| - return functionType(S, [], [T]);
|
| + function always(t1, t2) {
|
| + assert.equal(isSubtype(t1, t2), true);
|
| }
|
| -
|
| - function func1extra(S) {
|
| - return functionType(S, [], {extra: int});
|
| + function never(t1, t2) {
|
| + assert.equal(isSubtype(t1, t2), false);
|
| + }
|
| + function maybe(t1, t2) {
|
| + assert.equal(isSubtype(t1, t2), null);
|
| }
|
|
|
| - function func2extra(S, T) {
|
| - return functionType(S, [T], {extra: int});
|
| + function always2(t1, t2) {
|
| + assert.equal(isSubtype(t1, t2), true);
|
| + always(functionType(t1, [t2]), functionType(t2, [t1]));
|
| + }
|
| + function never2(t1, t2) {
|
| + assert.equal(isSubtype(t1, t2), false);
|
| + maybe(functionType(t1, [t2]), functionType(t2, [t1]));
|
| + }
|
| + function maybe2(t1, t2) {
|
| + assert.equal(isSubtype(t1, t2), null);
|
| + maybe(functionType(t1, [t2]), functionType(t2, [t1]));
|
| }
|
|
|
| - run_test(func1, func2, func2opt, func1extra, func2extra);
|
| - });
|
| + function run_test(func1, func2, func2opt, func1extra, func2extra) {
|
| + always2(func2(int, int), func2(int, int));
|
| + always2(func2(int, num), func2(int, int));
|
| + always2(func2(int, int), func2(num, int));
|
|
|
| - test('basic typedefs', () => {
|
| - function func1(S) {
|
| - return dart.typedef('Func1', () => functionType(S, []))
|
| - }
|
| + always2(func2opt(int, int), func2opt(int, int));
|
| + always2(func2opt(int, num), func2opt(int, int));
|
| + always2(func2opt(int, int), func2opt(num, int));
|
|
|
| - function func2(S, T) {
|
| - return dart.typedef('Func2', () => functionType(S, [T]))
|
| - }
|
| + always2(func2opt(int, int), func2(int, int));
|
| + always2(func2opt(int, num), func2(int, int));
|
| + always2(func2opt(int, int), func2(num, int));
|
|
|
| - function func2opt(S, T) {
|
| - return dart.typedef('Func2', () => functionType(S, [], [T]))
|
| - }
|
| + always2(func2opt(int, int), func1(int));
|
| + always2(func2opt(int, num), func1(int));
|
| + always2(func2opt(int, int), func1(num));
|
|
|
| - function func1extra(S) {
|
| - return dart.typedef('Func1', () => functionType(S, [], {extra: int}))
|
| - }
|
| + always2(func2extra(int, int), func2(int, int));
|
| + always2(func2extra(int, num), func2(int, int));
|
| + always2(func2extra(int, int), func2(num, int));
|
|
|
| - function func2extra(S, T) {
|
| - return dart.typedef('Func2', () => functionType(S, [T], {extra: int}))
|
| - }
|
| + maybe2(func2(int, int), func2(int, num));
|
| + maybe2(func2(num, int), func2(int, int));
|
|
|
| - run_test(func1, func2, func2opt, func1extra, func2extra);
|
| - });
|
| + maybe2(func2opt(num, num), func1(int));
|
|
|
| - test('basic generic typedefs', () => {
|
| - let func1 = dart.generic(
|
| - (S) => dart.typedef('Func1', () => functionType(S, [])));
|
| + maybe2(func2opt(int, int), func2opt(int, num));
|
| + maybe2(func2opt(num, int), func2opt(int, int));
|
|
|
| - let func2 = dart.generic(
|
| - (S, T) => dart.typedef('Func2', () => functionType(S, [T])));
|
| + maybe2(func2opt(int, int), func2(int, num));
|
| + maybe2(func2opt(num, int), func2(int, int));
|
|
|
| - let func2opt = dart.generic(
|
| - (S, T) => dart.typedef('Func2', () => functionType(S, [], [T])));
|
| + maybe2(func2extra(int, int), func2(int, num));
|
| + maybe2(func2extra(num, int), func2(int, int));
|
|
|
| - let func1extra = dart.generic(
|
| - (S) => dart.typedef('Func1', () => functionType(S, [], {extra: int})));
|
| + never2(func1(int), func2(int, num));
|
| + never2(func1(num), func2(int, int));
|
| + never2(func1(num), func2(num, num));
|
|
|
| - let func2extra = dart.generic(
|
| - (S, T) => dart.typedef('Func2',
|
| - () => functionType(S, [T], {extra: int})));
|
| + never2(func2(int, int), func1(int));
|
| + never2(func2(num, int), func1(int));
|
| + never2(func2(num, num), func1(num));
|
|
|
| - run_test(func1, func2, func2opt, func1extra, func2extra);
|
| - });
|
| + never2(func1(int), func2opt(int, num));
|
| + never2(func1(num), func2opt(int, int));
|
| + never2(func1(num), func2opt(num, num));
|
|
|
| - test('fuzzy function types', () => {
|
| - always(functionType(int, [int]), functionType(dyn, [dyn]));
|
| - always(functionType(int, [], [int]), functionType(dyn, [], [dyn]));
|
| - always(functionType(int, [], [int]), functionType(dyn, [dyn]));
|
| - always(functionType(int, [], [int]), functionType(dyn, []));
|
| - always(functionType(int, [int], {extra: int}), functionType(dyn, [dyn]));
|
| + never2(func2(int, int), func2opt(int, num));
|
| + never2(func2(num, int), func2opt(int, int));
|
| + never2(func2(num, num), func2opt(num, num));
|
|
|
| - always(functionType(dyn, [dyn]), functionType(dyn, [dyn]));
|
| - always(functionType(dyn, [], [dyn]), functionType(dyn, [], [dyn]));
|
| - always(functionType(dyn, [], [dyn]), functionType(dyn, [dyn]));
|
| - always(functionType(dyn, [], [dyn]), functionType(dyn, []));
|
| - always(functionType(dyn, [dyn], {extra: dyn}), functionType(dyn, [dyn]));
|
| + never2(func1extra(int), func2(int, num));
|
| + never2(func1extra(num), func2(int, int));
|
| + never2(func1extra(num), func2(num, num));
|
|
|
| - });
|
| + never2(func1extra(int), func2opt(int, num));
|
| + never2(func1extra(num), func2opt(int, int));
|
| + never2(func1extra(num), func2opt(num, num));
|
|
|
| - test('void function types', () => {
|
| - always(functionType(int, [int]), functionType(dart.void, [dyn]));
|
| - always(functionType(int, [], [int]), functionType(dart.void, [], [dyn]));
|
| - always(functionType(int, [], [int]), functionType(dart.void, [dyn]));
|
| - always(functionType(int, [], [int]), functionType(dart.void, []));
|
| - always(functionType(int, [int], {extra: int}), functionType(dart.void, [dyn]));
|
| -
|
| - always(functionType(dart.void, [int]), functionType(dart.void, [dyn]));
|
| - always(functionType(dart.void, [], [int]), functionType(dart.void, [], [dyn]));
|
| - always(functionType(dart.void, [], [int]), functionType(dart.void, [dyn]));
|
| - always(functionType(dart.void, [], [int]), functionType(dart.void, []));
|
| - always(functionType(dart.void, [int], {extra: int}), functionType(dart.void, [dyn]));
|
| -
|
| - always(functionType(dyn, [dyn]), functionType(dart.void, [dyn]));
|
| - always(functionType(dyn, [], [dyn]), functionType(dart.void, [], [dyn]));
|
| - always(functionType(dyn, [], [dyn]), functionType(dart.void, [dyn]));
|
| - always(functionType(dyn, [], [dyn]), functionType(dart.void, []));
|
| - always(functionType(dyn, [dyn], {extra: dyn}), functionType(dart.void, [dyn]));
|
| -
|
| - always(functionType(dart.void, [dyn]), functionType(dart.void, [dyn]));
|
| - always(functionType(dart.void, [], [dyn]), functionType(dart.void, [], [dyn]));
|
| - always(functionType(dart.void, [], [dyn]), functionType(dart.void, [dyn]));
|
| - always(functionType(dart.void, [], [dyn]), functionType(dart.void, []));
|
| - always(functionType(dart.void, [dyn], {extra: dyn}), functionType(dart.void, [dyn]));
|
| -
|
| - always(functionType(dart.void, [int]), functionType(dyn, [dyn]));
|
| - always(functionType(dart.void, [], [int]), functionType(dyn, [], [dyn]));
|
| - always(functionType(dart.void, [], [int]), functionType(dyn, [dyn]));
|
| - always(functionType(dart.void, [], [int]), functionType(dyn, []));
|
| - always(functionType(dart.void, [int], {extra: int}), functionType(dyn, [dyn]));
|
| -
|
| - never(functionType(dart.void, [int]), functionType(int, [dyn]));
|
| - never(functionType(dart.void, [], [int]), functionType(int, [], [dyn]));
|
| - never(functionType(dart.void, [], [int]), functionType(int, [dyn]));
|
| - never(functionType(dart.void, [], [int]), functionType(int, []));
|
| - never(functionType(dart.void, [int], {extra: int}), functionType(int, [dyn]));
|
| -
|
| - never(functionType(dart.void, [int]), functionType(int, [int]));
|
| - never(functionType(dart.void, [], [int]), functionType(int, [], [int]));
|
| - never(functionType(dart.void, [], [int]), functionType(int, [int]));
|
| - never(functionType(dart.void, [], [int]), functionType(int, []));
|
| - never(functionType(dart.void, [int], {extra: int}), functionType(int, [int]));
|
| + never2(func1(int), func1extra(int));
|
| + never2(func1(num), func1extra(int));
|
| + never2(func1(num), func1extra(num));
|
|
|
| - });
|
| + never2(func2(int, int), func1extra(int));
|
| + never2(func2(num, int), func1extra(int));
|
| + never2(func2(num, num), func1extra(num));
|
|
|
| - test('higher-order typedef', () => {
|
| - let Func$ = dart.generic((S, T) =>
|
| - dart.typedef('Func', () =>
|
| - functionType(T, [S])));
|
| - let Func2$ = dart.generic((R, S, T) =>
|
| - dart.typedef('Func2', () =>
|
| - functionType(T, [Func$(R, S)])));
|
| -
|
| - maybe(functionType(int, [functionType(int, [num])]),
|
| - functionType(num, [functionType(int, [int])]));
|
| - maybe(functionType(int, [Func$(num, int)]),
|
| - functionType(num, [Func$(int, int)]));
|
| - maybe(Func2$(num, int, int), Func2$(int, int, num));
|
| - });
|
| + never2(func2(int, int), func2extra(int, int));
|
| + never2(func2(num, int), func2extra(int, int));
|
| + never2(func2(num, num), func2extra(num, num));
|
| + };
|
| +
|
| + test('basic function types', () => {
|
| + function func1(S) {
|
| + return functionType(S, []);
|
| + }
|
| +
|
| + function func2(S, T) {
|
| + return functionType(S, [T]);
|
| + }
|
|
|
| - test('mixed types', () => {
|
| - let AA$ = dart.generic((T) => class AA extends core.Object {});
|
| + function func2opt(S, T) {
|
| + return functionType(S, [], [T]);
|
| + }
|
|
|
| - always(int, dyn);
|
| - maybe(dyn, int);
|
| + function func1extra(S) {
|
| + return functionType(S, [], {extra: int});
|
| + }
|
|
|
| - never(functionType(int, [int]), int);
|
| + function func2extra(S, T) {
|
| + return functionType(S, [T], {extra: int});
|
| + }
|
|
|
| - never(int, functionType(int, [int]));
|
| + run_test(func1, func2, func2opt, func1extra, func2extra);
|
| + });
|
|
|
| - always(AA$(int), AA$(dyn));
|
| - maybe(AA$(dyn), AA$(int));
|
| - never(AA$(core.Object), AA$(int));
|
| + test('basic typedefs', () => {
|
| + function func1(S) {
|
| + return dart.typedef('Func1', () => functionType(S, []))
|
| + }
|
|
|
| - always(AA$(functionType(int, [int])), AA$(dyn));
|
| - maybe(AA$(dyn), AA$(functionType(int, [int])));
|
| - never(AA$(core.Object), AA$(functionType(int, [int])));
|
| + function func2(S, T) {
|
| + return dart.typedef('Func2', () => functionType(S, [T]))
|
| + }
|
|
|
| - always(AA$(functionType(int, [int])), AA$(functionType(dyn, [dyn])));
|
| - maybe(AA$(functionType(dyn, [dyn])), AA$(functionType(int, [int])));
|
| - maybe(AA$(functionType(core.Object, [core.Object])),
|
| - AA$(functionType(int, [int])));
|
| + function func2opt(S, T) {
|
| + return dart.typedef('Func2', () => functionType(S, [], [T]))
|
| + }
|
|
|
| + function func1extra(S) {
|
| + return dart.typedef('Func1', () => functionType(S, [], {extra: int}))
|
| + }
|
|
|
| - });
|
| + function func2extra(S, T) {
|
| + return dart.typedef('Func2', () => functionType(S, [T], {extra: int}))
|
| + }
|
|
|
| -});
|
| + run_test(func1, func2, func2opt, func1extra, func2extra);
|
| + });
|
|
|
| -suite('canonicalization', function() {
|
| - 'use strict';
|
| - let functionType = dart.functionType;
|
| - let definiteFunctionType = dart.definiteFunctionType;
|
| - let typedef = dart.typedef;
|
| - let generic = dart.generic;
|
| + test('basic generic typedefs', () => {
|
| + let func1 = dart.generic(
|
| + (S) => dart.typedef('Func1', () => functionType(S, [])));
|
|
|
| - let Object = core.Object;
|
| - let String = core.String;
|
| - let int = core.int;
|
| - let dynamic = dart.dynamic;
|
| - let bottom = dart.bottom;
|
| - let Map = core.Map;
|
| - let Map$ = core.Map$;
|
| + let func2 = dart.generic(
|
| + (S, T) => dart.typedef('Func2', () => functionType(S, [T])));
|
|
|
| - class A {}
|
| + let func2opt = dart.generic(
|
| + (S, T) => dart.typedef('Func2', () => functionType(S, [], [T])));
|
|
|
| - let AA$ = generic((T, U) => class AA extends core.Object {});
|
| - let AA = AA$();
|
| + let func1extra = dart.generic(
|
| + (S) => dart.typedef('Func1', () => functionType(S, [], {extra: int})));
|
|
|
| - let Func2 = typedef('Func2', () => functionType(dynamic, [dynamic, dynamic]));
|
| + let func2extra = dart.generic(
|
| + (S, T) => dart.typedef('Func2',
|
| + () => functionType(S, [T], {extra: int})));
|
|
|
| - let FuncG$ = generic((T, U) => typedef('FuncG', () => functionType(T, [T, U])))
|
| - let FuncG = FuncG$();
|
| + run_test(func1, func2, func2opt, func1extra, func2extra);
|
| + });
|
|
|
| - test('base types', () => {
|
| - assert.equal(Object, Object);
|
| - assert.equal(String, String);
|
| - assert.equal(dynamic, dynamic);
|
| - });
|
| + test('fuzzy function types', () => {
|
| + always(functionType(int, [int]), functionType(dyn, [dyn]));
|
| + always(functionType(int, [], [int]), functionType(dyn, [], [dyn]));
|
| + always(functionType(int, [], [int]), functionType(dyn, [dyn]));
|
| + always(functionType(int, [], [int]), functionType(dyn, []));
|
| + always(functionType(int, [int], {extra: int}), functionType(dyn, [dyn]));
|
|
|
| - test('class types', () => {
|
| - assert.equal(A, A);
|
| - });
|
| + always(functionType(dyn, [dyn]), functionType(dyn, [dyn]));
|
| + always(functionType(dyn, [], [dyn]), functionType(dyn, [], [dyn]));
|
| + always(functionType(dyn, [], [dyn]), functionType(dyn, [dyn]));
|
| + always(functionType(dyn, [], [dyn]), functionType(dyn, []));
|
| + always(functionType(dyn, [dyn], {extra: dyn}), functionType(dyn, [dyn]));
|
|
|
| - test('generic class types', () => {
|
| - assert.equal(AA, AA);
|
| - assert.equal(AA, AA$(dynamic, dynamic));
|
| - assert.equal(AA$(dynamic, dynamic), AA$(dynamic, dynamic));
|
| - assert.equal(AA$(AA, Object), AA$(AA, Object));
|
| - assert.equal(Map, Map);
|
| - assert.equal(Map$(dynamic, dynamic), Map);
|
| - assert.equal(Map$(int, Map$(int, int)), Map$(int, Map$(int, int)));
|
| - });
|
| + });
|
| +
|
| + test('void function types', () => {
|
| + always(functionType(int, [int]), functionType(dart.void, [dyn]));
|
| + always(functionType(int, [], [int]), functionType(dart.void, [], [dyn]));
|
| + always(functionType(int, [], [int]), functionType(dart.void, [dyn]));
|
| + always(functionType(int, [], [int]), functionType(dart.void, []));
|
| + always(functionType(int, [int], {extra: int}), functionType(dart.void, [dyn]));
|
| +
|
| + always(functionType(dart.void, [int]), functionType(dart.void, [dyn]));
|
| + always(functionType(dart.void, [], [int]), functionType(dart.void, [], [dyn]));
|
| + always(functionType(dart.void, [], [int]), functionType(dart.void, [dyn]));
|
| + always(functionType(dart.void, [], [int]), functionType(dart.void, []));
|
| + always(functionType(dart.void, [int], {extra: int}), functionType(dart.void, [dyn]));
|
| +
|
| + always(functionType(dyn, [dyn]), functionType(dart.void, [dyn]));
|
| + always(functionType(dyn, [], [dyn]), functionType(dart.void, [], [dyn]));
|
| + always(functionType(dyn, [], [dyn]), functionType(dart.void, [dyn]));
|
| + always(functionType(dyn, [], [dyn]), functionType(dart.void, []));
|
| + always(functionType(dyn, [dyn], {extra: dyn}), functionType(dart.void, [dyn]));
|
| +
|
| + always(functionType(dart.void, [dyn]), functionType(dart.void, [dyn]));
|
| + always(functionType(dart.void, [], [dyn]), functionType(dart.void, [], [dyn]));
|
| + always(functionType(dart.void, [], [dyn]), functionType(dart.void, [dyn]));
|
| + always(functionType(dart.void, [], [dyn]), functionType(dart.void, []));
|
| + always(functionType(dart.void, [dyn], {extra: dyn}), functionType(dart.void, [dyn]));
|
| +
|
| + always(functionType(dart.void, [int]), functionType(dyn, [dyn]));
|
| + always(functionType(dart.void, [], [int]), functionType(dyn, [], [dyn]));
|
| + always(functionType(dart.void, [], [int]), functionType(dyn, [dyn]));
|
| + always(functionType(dart.void, [], [int]), functionType(dyn, []));
|
| + always(functionType(dart.void, [int], {extra: int}), functionType(dyn, [dyn]));
|
| +
|
| + never(functionType(dart.void, [int]), functionType(int, [dyn]));
|
| + never(functionType(dart.void, [], [int]), functionType(int, [], [dyn]));
|
| + never(functionType(dart.void, [], [int]), functionType(int, [dyn]));
|
| + never(functionType(dart.void, [], [int]), functionType(int, []));
|
| + never(functionType(dart.void, [int], {extra: int}), functionType(int, [dyn]));
|
| +
|
| + never(functionType(dart.void, [int]), functionType(int, [int]));
|
| + never(functionType(dart.void, [], [int]), functionType(int, [], [int]));
|
| + never(functionType(dart.void, [], [int]), functionType(int, [int]));
|
| + never(functionType(dart.void, [], [int]), functionType(int, []));
|
| + never(functionType(dart.void, [int], {extra: int}), functionType(int, [int]));
|
| +
|
| + });
|
| +
|
| + test('higher-order typedef', () => {
|
| + let Func$ = dart.generic((S, T) =>
|
| + dart.typedef('Func', () =>
|
| + functionType(T, [S])));
|
| + let Func2$ = dart.generic((R, S, T) =>
|
| + dart.typedef('Func2', () =>
|
| + functionType(T, [Func$(R, S)])));
|
| +
|
| + maybe(functionType(int, [functionType(int, [num])]),
|
| + functionType(num, [functionType(int, [int])]));
|
| + maybe(functionType(int, [Func$(num, int)]),
|
| + functionType(num, [Func$(int, int)]));
|
| + maybe(Func2$(num, int, int), Func2$(int, int, num));
|
| + });
|
| +
|
| + test('mixed types', () => {
|
| + let AA$ = dart.generic((T) => class AA extends core.Object {});
|
| +
|
| + always(int, dyn);
|
| + maybe(dyn, int);
|
| +
|
| + never(functionType(int, [int]), int);
|
| +
|
| + never(int, functionType(int, [int]));
|
| +
|
| + always(AA$(int), AA$(dyn));
|
| + maybe(AA$(dyn), AA$(int));
|
| + never(AA$(core.Object), AA$(int));
|
| +
|
| + always(AA$(functionType(int, [int])), AA$(dyn));
|
| + maybe(AA$(dyn), AA$(functionType(int, [int])));
|
| + never(AA$(core.Object), AA$(functionType(int, [int])));
|
| +
|
| + always(AA$(functionType(int, [int])), AA$(functionType(dyn, [dyn])));
|
| + maybe(AA$(functionType(dyn, [dyn])), AA$(functionType(int, [int])));
|
| + maybe(AA$(functionType(core.Object, [core.Object])),
|
| + AA$(functionType(int, [int])));
|
| +
|
| +
|
| + });
|
|
|
| - test('typedefs', () => {
|
| - assert.equal(Func2, Func2);
|
| - assert.equal(FuncG, FuncG$(dynamic, dynamic));
|
| - assert.equal(FuncG$(dynamic, dynamic), FuncG$(dynamic, dynamic));
|
| - assert.equal(FuncG$(String, Func2), FuncG$(String, Func2));
|
| });
|
|
|
| - test('function types', () => {
|
| - assert.equal(functionType(dynamic, [dynamic, dynamic]),
|
| - functionType(dynamic, [dynamic, dynamic]))
|
| + suite('canonicalization', function() {
|
| + 'use strict';
|
| + let functionType = dart.functionType;
|
| + let definiteFunctionType = dart.definiteFunctionType;
|
| + let typedef = dart.typedef;
|
| + let generic = dart.generic;
|
| +
|
| + let Object = core.Object;
|
| + let String = core.String;
|
| + let int = core.int;
|
| + let dynamic = dart.dynamic;
|
| + let bottom = dart.bottom;
|
| + let Map = core.Map;
|
| + let Map$ = core.Map$;
|
| +
|
| + class A {}
|
|
|
| - assert.notEqual(definiteFunctionType(dynamic, [dynamic, dynamic]),
|
| - functionType(dynamic, [dynamic, dynamic]))
|
| + let AA$ = generic((T, U) => class AA extends core.Object {});
|
| + let AA = AA$();
|
|
|
| - assert.equal(functionType(dynamic, [dynamic, dynamic]),
|
| - functionType(dynamic, [bottom, bottom]))
|
| + let Func2 = typedef('Func2', () => functionType(dynamic, [dynamic, dynamic]));
|
|
|
| - assert.equal(functionType(dynamic, [], [dynamic, dynamic]),
|
| - functionType(dynamic, [], [dynamic, dynamic]))
|
| + let FuncG$ = generic((T, U) => typedef('FuncG', () => functionType(T, [T, U])))
|
| + let FuncG = FuncG$();
|
|
|
| - assert.notEqual(definiteFunctionType(dynamic, [], [dynamic, dynamic]),
|
| - functionType(dynamic, [], [dynamic, dynamic]))
|
| + test('base types', () => {
|
| + assert.equal(Object, Object);
|
| + assert.equal(String, String);
|
| + assert.equal(dynamic, dynamic);
|
| + });
|
|
|
| - assert.equal(functionType(dynamic, [], [dynamic, dynamic]),
|
| - functionType(dynamic, [], [bottom, bottom]))
|
| + test('class types', () => {
|
| + assert.equal(A, A);
|
| + });
|
|
|
| - assert.equal(functionType(dynamic, [], {extra: dynamic}),
|
| - functionType(dynamic, [], {extra: dynamic}))
|
| + test('generic class types', () => {
|
| + assert.equal(AA, AA);
|
| + assert.equal(AA, AA$(dynamic, dynamic));
|
| + assert.equal(AA$(dynamic, dynamic), AA$(dynamic, dynamic));
|
| + assert.equal(AA$(AA, Object), AA$(AA, Object));
|
| + assert.equal(Map, Map);
|
| + assert.equal(Map$(dynamic, dynamic), Map);
|
| + assert.equal(Map$(int, Map$(int, int)), Map$(int, Map$(int, int)));
|
| + });
|
|
|
| - assert.notEqual(definiteFunctionType(dynamic, [], {extra: dynamic}),
|
| - functionType(dynamic, [], {extra: dynamic}))
|
| + test('typedefs', () => {
|
| + assert.equal(Func2, Func2);
|
| + assert.equal(FuncG, FuncG$(dynamic, dynamic));
|
| + assert.equal(FuncG$(dynamic, dynamic), FuncG$(dynamic, dynamic));
|
| + assert.equal(FuncG$(String, Func2), FuncG$(String, Func2));
|
| + });
|
|
|
| - assert.equal(functionType(dynamic, [], {extra: dynamic}),
|
| - functionType(dynamic, [], {extra: bottom}))
|
| + test('function types', () => {
|
| + assert.equal(functionType(dynamic, [dynamic, dynamic]),
|
| + functionType(dynamic, [dynamic, dynamic]))
|
|
|
| - assert.equal(functionType(int, [int, int]),
|
| - functionType(int, [int, int]))
|
| + assert.notEqual(definiteFunctionType(dynamic, [dynamic, dynamic]),
|
| + functionType(dynamic, [dynamic, dynamic]))
|
|
|
| - assert.equal(functionType(int, [], [int, int]),
|
| - functionType(int, [], [int, int]))
|
| + assert.equal(functionType(dynamic, [dynamic, dynamic]),
|
| + functionType(dynamic, [bottom, bottom]))
|
|
|
| - assert.equal(functionType(int, [int, int], {extra: int}),
|
| - functionType(int, [int, int], {extra: int}))
|
| + assert.equal(functionType(dynamic, [], [dynamic, dynamic]),
|
| + functionType(dynamic, [], [dynamic, dynamic]))
|
|
|
| - assert.equal(functionType(int, [int, int, int, int, int]),
|
| - functionType(int, [int, int, int, int, int]))
|
| + assert.notEqual(definiteFunctionType(dynamic, [], [dynamic, dynamic]),
|
| + functionType(dynamic, [], [dynamic, dynamic]))
|
|
|
| - assert.notEqual(functionType(int, [int, int, int, int, int]),
|
| - functionType(int, [int, int, int], [int, int]))
|
| + assert.equal(functionType(dynamic, [], [dynamic, dynamic]),
|
| + functionType(dynamic, [], [bottom, bottom]))
|
|
|
| - assert.notEqual(functionType(String, [int, int, int, int, int]),
|
| - functionType(int, [int, int, int, int, int]))
|
| + assert.equal(functionType(dynamic, [], {extra: dynamic}),
|
| + functionType(dynamic, [], {extra: dynamic}))
|
|
|
| - assert.notEqual(functionType(String, []),
|
| - functionType(int, []))
|
| - });
|
| -});
|
| + assert.notEqual(definiteFunctionType(dynamic, [], {extra: dynamic}),
|
| + functionType(dynamic, [], {extra: dynamic}))
|
| +
|
| + assert.equal(functionType(dynamic, [], {extra: dynamic}),
|
| + functionType(dynamic, [], {extra: bottom}))
|
| +
|
| + assert.equal(functionType(int, [int, int]),
|
| + functionType(int, [int, int]))
|
| +
|
| + assert.equal(functionType(int, [], [int, int]),
|
| + functionType(int, [], [int, int]))
|
|
|
| -suite('primitives', function() {
|
| - 'use strict';
|
| + assert.equal(functionType(int, [int, int], {extra: int}),
|
| + functionType(int, [int, int], {extra: int}))
|
|
|
| - test('fixed length list', () => {
|
| - let list = new core.List(10);
|
| - list[0] = 42;
|
| - assert.throws(() => list.add(42));
|
| + assert.equal(functionType(int, [int, int, int, int, int]),
|
| + functionType(int, [int, int, int, int, int]))
|
| +
|
| + assert.notEqual(functionType(int, [int, int, int, int, int]),
|
| + functionType(int, [int, int, int], [int, int]))
|
| +
|
| + assert.notEqual(functionType(String, [int, int, int, int, int]),
|
| + functionType(int, [int, int, int, int, int]))
|
| +
|
| + assert.notEqual(functionType(String, []),
|
| + functionType(int, []))
|
| + });
|
| });
|
|
|
| - test('toString on ES Symbol', () => {
|
| - let sym = Symbol('_foobar');
|
| - assert.equal(dart.toString(sym), 'Symbol(_foobar)');
|
| + suite('primitives', function() {
|
| + 'use strict';
|
| +
|
| + test('fixed length list', () => {
|
| + let list = new core.List(10);
|
| + list[0] = 42;
|
| + assert.throws(() => list.add(42));
|
| + });
|
| +
|
| + test('toString on ES Symbol', () => {
|
| + let sym = Symbol('_foobar');
|
| + assert.equal(dart.toString(sym), 'Symbol(_foobar)');
|
| + });
|
| });
|
| });
|
|
|