Index: test/browser/runtime_tests.js |
diff --git a/test/browser/runtime_tests.js b/test/browser/runtime_tests.js |
index b5b99d8489c0bccf312738f18d074e50a7add772..354139e24ab6dd9257bf297ea1a2a5686c443115 100644 |
--- a/test/browser/runtime_tests.js |
+++ b/test/browser/runtime_tests.js |
@@ -204,10 +204,12 @@ suite('instanceOf', () => { |
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(strongInstanceOf(x, type), expectedTrue); |
+ expect(expectedTrue, false); |
+ expect(strongInstanceOf(x, type), null); |
} |
} |
@@ -303,8 +305,8 @@ suite('instanceOf', () => { |
checkType(m1, Map$(Object, Object)); |
// No contravariance on generics. |
- checkType(m2, getReifiedType(m1), false, true); |
- checkType(m2, Map$(String, String), false, true); |
+ checkType(m2, getReifiedType(m1), false); |
+ checkType(m2, Map$(String, String), false); |
// null is! Map |
checkType(null, Map, false); |
@@ -319,8 +321,7 @@ suite('instanceOf', () => { |
assert.throws(() => dart.is(m6, Map$(String, String)), |
dart.StrongModeError); |
assert.isTrue(dart.is(m1, Map$(String, String))); |
- assert.throws(() => dart.is(m2, Map$(String, String)), |
- dart.StrongModeError); |
+ assert.isFalse(dart.is(m2, Map$(String, String))); |
// As checks |
// TODO(vsm): Enable these. We're currently only logging warnings on |
@@ -378,14 +379,14 @@ suite('instanceOf', () => { |
expect(isGroundType(BB$(String, List)), false); |
expect(isGroundType(cctype), true); |
expect(isGroundType(CC), true); |
- checkType(cc, aatype, false, true); |
- checkType(cc, AA$(String, List), false, 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, true); |
- checkType(aa, BB$(String, List), false, true); |
+ checkType(aa, bbtype, false); |
+ checkType(aa, BB$(String, List), false); |
checkType(bb, cctype, false); |
checkType(bb, CC, false); |
checkType(aa, aabadtype); |
@@ -412,11 +413,11 @@ suite('instanceOf', () => { |
checkType(s1, c.IterableMixin); |
checkType(s1, c.IterableMixin$(String)); |
- checkType(s1, c.IterableMixin$(int), false, true); |
+ checkType(s1, c.IterableMixin$(int), false); |
checkType(s1, c.SetMixin); |
checkType(s1, c.SetMixin$(String)); |
- checkType(s1, c.SetMixin$(int), false, true); |
+ checkType(s1, c.SetMixin$(int), false); |
}); |
test('Type', () => { |
@@ -463,10 +464,10 @@ suite('instanceOf', () => { |
checkType(cls5, Foo); |
checkType(bar5, functionType(B, [B, String])); |
checkType(cls5, functionType(B, [B, String])); |
- 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(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])); |
@@ -477,12 +478,12 @@ suite('instanceOf', () => { |
checkType(cls8, Foo); |
checkType(bar8, functionType(B, [B, String])); |
checkType(cls8, functionType(B, [B, String])); |
- checkType(bar8, getReifiedType(bar6), false, true); |
- checkType(cls8, getReifiedType(bar6), false, true); |
- checkType(bar7, getReifiedType(bar8), false, true); |
- checkType(cls7, getReifiedType(bar8), false, true); |
- checkType(bar8, getReifiedType(bar7), false, true); |
- checkType(cls8, getReifiedType(bar7), false, true); |
+ 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); |
@@ -622,9 +623,9 @@ suite('instanceOf', () => { |
core.int])); |
checkType(ii_2i, dart.functionType(core.int, [], [core.int, |
core.int]), |
- false, true); |
+ false); |
checkType(ii_2i, dart.functionType(core.int, [core.int], |
- {extra: core.int}), false, true); |
+ {extra: core.int}), false); |
// Named types |
function i_i2i(x, opts) {return x}; |
@@ -632,13 +633,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, true); |
+ [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, true); |
+ also: core.int}), false); |
checkType(i_i2i, |
- dart.functionType(core.int, [core.int], [core.int]), false, true); |
+ dart.functionType(core.int, [core.int], [core.int]), false); |
}); |
test('Method tearoffs', () => { |
@@ -648,13 +649,13 @@ suite('instanceOf', () => { |
checkType(dart.bind(map, 'toString'), |
dart.functionType(String, [])); |
checkType(dart.bind(map, 'toString'), |
- dart.functionType(int, []), false, true); |
+ 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])])); |
+ [dart.functionType(dart.void, [core.int, core.String])])); |
checkType(dart.bind(smap, 'forEach'), |
dart.functionType(dart.void, |
[dart.functionType(dart.void, |
@@ -774,6 +775,153 @@ suite('instanceOf', () => { |
}); |
}); |
+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])); |
+ } |
+ |
+ test('basic function types', () => { |
+ always2(functionType(int, [int]), functionType(int, [int])); |
+ always2(functionType(int, [num]), functionType(int, [int])); |
+ always2(functionType(int, [int]), functionType(num, [int])); |
+ |
+ always2(functionType(int, [], [int]), functionType(int, [], [int])); |
+ always2(functionType(int, [], [num]), functionType(int, [], [int])); |
+ always2(functionType(int, [], [int]), functionType(num, [], [int])); |
+ |
+ always2(functionType(int, [], [int]), functionType(int, [int])); |
+ always2(functionType(int, [], [num]), functionType(int, [int])); |
+ always2(functionType(int, [], [int]), functionType(num, [int])); |
+ |
+ always2(functionType(int, [], [int]), functionType(int, [])); |
+ always2(functionType(int, [], [num]), functionType(int, [])); |
+ always2(functionType(int, [], [int]), functionType(num, [])); |
+ |
+ always2(functionType(int, [int], {extra: int}), functionType(int, [int])); |
+ always2(functionType(int, [num], {extra: int}), functionType(int, [int])); |
+ always2(functionType(int, [int], {extra: int}), functionType(num, [int])); |
+ |
+ maybe2(functionType(int, [int]), functionType(int, [num])); |
+ maybe2(functionType(num, [int]), functionType(int, [int])); |
+ |
+ maybe2(functionType(num, [], [num]), functionType(int, [])); |
+ |
+ maybe2(functionType(int, [], [int]), functionType(int, [], [num])); |
+ maybe2(functionType(num, [], [int]), functionType(int, [], [int])); |
+ |
+ maybe2(functionType(int, [], [int]), functionType(int, [num])); |
+ maybe2(functionType(num, [], [int]), functionType(int, [int])); |
+ |
+ maybe2(functionType(int, [int], {extra: int}), functionType(int, [num])); |
+ maybe2(functionType(num, [int], {extra: int}), functionType(int, [int])); |
+ |
+ never2(functionType(int, []), functionType(int, [num])); |
+ never2(functionType(num, []), functionType(int, [int])); |
+ never2(functionType(num, []), functionType(num, [num])); |
+ |
+ never2(functionType(int, [int]), functionType(int, [])); |
+ never2(functionType(num, [int]), functionType(int, [])); |
+ never2(functionType(num, [num]), functionType(num, [])); |
+ |
+ never2(functionType(int, []), functionType(int, [], [num])); |
+ never2(functionType(num, []), functionType(int, [], [int])); |
+ never2(functionType(num, []), functionType(num, [], [num])); |
+ |
+ never2(functionType(int, [int]), functionType(int, [], [num])); |
+ never2(functionType(num, [int]), functionType(int, [], [int])); |
+ never2(functionType(num, [num]), functionType(num, [], [num])); |
+ |
+ never2(functionType(int, [], {extra: int}), functionType(int, [num])); |
+ never2(functionType(num, [], {extra: int}), functionType(int, [int])); |
+ never2(functionType(num, [], {extra: int}), functionType(num, [num])); |
+ |
+ never2(functionType(int, [], {extra: int}), functionType(int, [], [num])); |
+ never2(functionType(num, [], {extra: int}), functionType(int, [], [int])); |
+ never2(functionType(num, [], {extra: int}), functionType(num, [], [num])); |
+ |
+ never2(functionType(int, []), functionType(int, [], {extra: int})); |
+ never2(functionType(num, []), functionType(int, [], {extra: int})); |
+ never2(functionType(num, []), functionType(num, [], {extra: int})); |
+ |
+ never2(functionType(int, [int]), functionType(int, [], {extra: int})); |
+ never2(functionType(num, [int]), functionType(int, [], {extra: int})); |
+ never2(functionType(num, [num]), functionType(num, [], {extra: int})); |
+ |
+ never2(functionType(int, [int]), functionType(int, [int], {extra: int})); |
+ never2(functionType(num, [int]), functionType(int, [int], {extra: int})); |
+ never2(functionType(num, [num]), functionType(num, [num], {extra: int})); |
+ }); |
+ |
+ 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('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]))); |
+ |
+ |
+ }); |
+ |
+}); |
+ |
suite('primitives', function() { |
'use strict'; |