| Index: test/browser/runtime_tests.js
|
| diff --git a/test/browser/runtime_tests.js b/test/browser/runtime_tests.js
|
| index c320ca1d9817a5a01994305435634bd38408b5aa..63f9e67ff24adc9e3ed908c70375583b444d206b 100644
|
| --- a/test/browser/runtime_tests.js
|
| +++ b/test/browser/runtime_tests.js
|
| @@ -109,6 +109,7 @@ suite('instanceOf', () => {
|
| let intIsNonNullable = false;
|
| let cast = dart.as;
|
| let instanceOf = dart.is;
|
| + let strongInstanceOf = dart.strongInstanceOf;
|
| let runtimeType = dart.realRuntimeType;
|
| let functionType = dart.functionType;
|
| let typedef = dart.typedef;
|
| @@ -190,9 +191,15 @@ suite('instanceOf', () => {
|
| let cls8 =
|
| dart.fn((b, s, o) => { return null; }, B, [B, String], {p: Object});
|
|
|
| - function checkType(x, type, expectedTrue) {
|
| + function checkType(x, type, expectedTrue, strongOnly) {
|
| if (expectedTrue === undefined) expectedTrue = true;
|
| - expect(instanceOf(x, type), expectedTrue);
|
| + if (strongOnly == undefined) strongOnly = false;
|
| + if (!strongOnly) {
|
| + expect(instanceOf(x, type), expectedTrue);
|
| + } else {
|
| + assert.throws(() => instanceOf(x, type), dart_utils.StrongModeError);
|
| + expect(strongInstanceOf(x, type), expectedTrue);
|
| + }
|
| }
|
|
|
| test('int', () => {
|
| @@ -258,6 +265,8 @@ suite('instanceOf', () => {
|
| 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(runtimeType(m1)), false);
|
| @@ -285,8 +294,8 @@ suite('instanceOf', () => {
|
| checkType(m1, Map$(Object, Object));
|
|
|
| // No contravariance on generics.
|
| - checkType(m2, runtimeType(m1), false);
|
| - checkType(m2, Map$(String, String), false);
|
| + checkType(m2, runtimeType(m1), false, true);
|
| + checkType(m2, Map$(String, String), false, true);
|
|
|
| // null is! Map
|
| checkType(null, Map, false);
|
| @@ -294,6 +303,26 @@ suite('instanceOf', () => {
|
| // Raw generic types
|
| checkType(m5, Map);
|
| checkType(m4, Map);
|
| +
|
| + // Is checks
|
| + assert.throws(() => dart.is(m3, Map$(String, String)),
|
| + dart_utils.StrongModeError);
|
| + assert.throws(() => dart.is(m6, Map$(String, String)),
|
| + dart_utils.StrongModeError);
|
| + assert.isTrue(dart.is(m1, Map$(String, String)));
|
| + assert.throws(() => dart.is(m2, Map$(String, String)),
|
| + dart_utils.StrongModeError);
|
| +
|
| + // As checks
|
| + // TODO(vsm): Enable these. We're currently only logging warnings on
|
| + // StrongModeErrors.
|
| + // assert.throws(() => dart.as(m3, Map$(String, String)),
|
| + // dart_utils.StrongModeError);
|
| + // assert.throws(() => dart.as(m6, Map$(String, String)),
|
| + // dart_utils.StrongModeError);
|
| + assert.equal(dart.as(m1, Map$(String, String)), m1);
|
| + // assert.throws(() => dart.as(m2, Map$(String, String)),
|
| + // dart_utils.StrongModeError);
|
| });
|
|
|
| test('constructors', () => {
|
| @@ -340,20 +369,20 @@ suite('instanceOf', () => {
|
| 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, aatype, false, true);
|
| + checkType(cc, AA$(String, List), false, true);
|
| 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(aa, bbtype, false, true);
|
| + checkType(aa, BB$(String, List), false, true);
|
| checkType(bb, cctype, false);
|
| checkType(bb, CC, false);
|
| checkType(aa, aabadtype);
|
| checkType(aa, dynamic);
|
| - checkType(aabad, aatype, false);
|
| - checkType(aabad, AA$(String, List), false);
|
| + checkType(aabad, aatype, false, true);
|
| + checkType(aabad, AA$(String, List), false, true);
|
| checkType(aabad, aarawtype);
|
| checkType(aabad, AA);
|
| checkType(aaraw, aabadtype);
|
| @@ -374,11 +403,11 @@ suite('instanceOf', () => {
|
|
|
| checkType(s1, c.IterableMixin);
|
| checkType(s1, c.IterableMixin$(String));
|
| - checkType(s1, c.IterableMixin$(int), false);
|
| + checkType(s1, c.IterableMixin$(int), false, true);
|
|
|
| checkType(s1, c.SetMixin);
|
| checkType(s1, c.SetMixin$(String));
|
| - checkType(s1, c.SetMixin$(int), false);
|
| + checkType(s1, c.SetMixin$(int), false, true);
|
| });
|
|
|
| test('Type', () => {
|
| @@ -405,14 +434,14 @@ suite('instanceOf', () => {
|
| expect(isGroundType(Func2), true);
|
| expect(isGroundType(Foo), false);
|
| expect(isGroundType(functionType(B, [B, String])), false);
|
| - checkType(bar1, Foo, false);
|
| - checkType(cls1, Foo, false);
|
| - checkType(bar1, functionType(B, [B, String]), false);
|
| - checkType(cls1, functionType(B, [B, String]), false);
|
| - checkType(bar2, Foo, false);
|
| - checkType(cls2, Foo, false);
|
| - checkType(bar2, functionType(B, [B, String]), false);
|
| - checkType(cls2, 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]));
|
| @@ -425,10 +454,10 @@ suite('instanceOf', () => {
|
| 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(bar6, Foo, false, true);
|
| + checkType(cls6, Foo, false, true);
|
| + checkType(bar6, functionType(B, [B, String]), false, true);
|
| + checkType(cls6, functionType(B, [B, String]), false, true);
|
| checkType(bar7, Foo);
|
| checkType(cls7, Foo);
|
| checkType(bar7, functionType(B, [B, String]));
|
| @@ -439,18 +468,18 @@ suite('instanceOf', () => {
|
| checkType(cls8, Foo);
|
| checkType(bar8, functionType(B, [B, String]));
|
| checkType(cls8, functionType(B, [B, String]));
|
| - checkType(bar8, runtimeType(bar6), false);
|
| - checkType(cls8, runtimeType(bar6), false);
|
| - checkType(bar7, runtimeType(bar8), false);
|
| - checkType(cls7, runtimeType(bar8), false);
|
| - checkType(bar8, runtimeType(bar7), false);
|
| - checkType(cls8, runtimeType(bar7), false);
|
| + checkType(bar8, runtimeType(bar6), false, true);
|
| + checkType(cls8, runtimeType(bar6), false, true);
|
| + checkType(bar7, runtimeType(bar8), false, true);
|
| + checkType(cls7, runtimeType(bar8), false, true);
|
| + checkType(bar8, runtimeType(bar7), false, true);
|
| + checkType(cls8, runtimeType(bar7), false, true);
|
|
|
| // Parameterized typedefs
|
| expect(isGroundType(FuncG), true);
|
| expect(isGroundType(FuncG$(B, String)), false);
|
| - checkType(bar1, FuncG$(B, String), false);
|
| - checkType(cls1, 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));
|
| });
|
| @@ -585,9 +614,9 @@ suite('instanceOf', () => {
|
| core.int]));
|
| checkType(ii_2i, dart.functionType(core.int, [], [core.int,
|
| core.int]),
|
| - false);
|
| + false, true);
|
| checkType(ii_2i, dart.functionType(core.int, [core.int],
|
| - {extra: core.int}), false);
|
| + {extra: core.int}), false, true);
|
|
|
| // Named types
|
| function i_i2i(x, opts) {return x};
|
| @@ -595,13 +624,13 @@ suite('instanceOf', () => {
|
| checkType(i_i2i, dart.functionType(core.int, [core.int],
|
| {extra: core.int}));
|
| checkType(i_i2i, dart.functionType(core.int,
|
| - [core.int, core.int]), false);
|
| + [core.int, core.int]), false, true);
|
| checkType(i_i2i, dart.functionType(core.int, [core.int], {}));
|
| checkType(i_i2i,
|
| dart.functionType(core.int, [], {extra: core.int,
|
| - also: core.int}), false);
|
| + also: core.int}), false, true);
|
| checkType(i_i2i,
|
| - dart.functionType(core.int, [core.int], [core.int]), false);
|
| + dart.functionType(core.int, [core.int], [core.int]), false, true);
|
| });
|
|
|
| test('Method tearoffs', () => {
|
| @@ -611,7 +640,7 @@ suite('instanceOf', () => {
|
| checkType(dart.bind(map, 'toString'),
|
| dart.functionType(String, []));
|
| checkType(dart.bind(map, 'toString'),
|
| - dart.functionType(int, []), false);
|
| + dart.functionType(int, []), false, true);
|
|
|
| // Tear off of a method directly on the object
|
| let smap = new (c.SplayTreeMap$(core.int, core.String))();
|
| @@ -621,7 +650,7 @@ suite('instanceOf', () => {
|
| checkType(dart.bind(smap, 'forEach'),
|
| dart.functionType(dart.void,
|
| [dart.functionType(dart.void,
|
| - [core.String, core.String])]), false);
|
| + [core.String, core.String])]), false, true);
|
|
|
| // Tear off of a mixed in method
|
| let mapB = new (c.MapBase$(core.int, core.int))();
|
| @@ -631,20 +660,20 @@ suite('instanceOf', () => {
|
| checkType(dart.bind(mapB, 'forEach'),
|
| dart.functionType(dart.void, [
|
| dart.functionType(dart.void, [core.int, core.String])]),
|
| - false);
|
| + 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);
|
| + 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);
|
| + dart.functionType(core.String, [core.String]), false, true);
|
|
|
| // Tear off a mixin method
|
| class Base {
|
| @@ -681,7 +710,7 @@ suite('instanceOf', () => {
|
| 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);
|
| + checkType(m, dart.functionType(core.int, [core.int]), false, true);
|
|
|
| // Test inherited signatures
|
| class P extends O {
|
| @@ -692,7 +721,7 @@ suite('instanceOf', () => {
|
| 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);
|
| + checkType(m, dart.functionType(core.int, [core.int]), false, true);
|
| });
|
|
|
| test('Object members', () => {
|
|
|