OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 define(['dart_sdk'], function(dart_sdk) { | 5 define(['dart_sdk'], function(dart_sdk) { |
6 const assert = chai.assert; | 6 const assert = chai.assert; |
7 const async = dart_sdk.async; | 7 const async = dart_sdk.async; |
8 const core = dart_sdk.core; | 8 const core = dart_sdk.core; |
9 const collection = dart_sdk.collection; | 9 const collection = dart_sdk.collection; |
10 const dart = dart_sdk.dart; | 10 const dart = dart_sdk.dart; |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 }); | 152 }); |
153 | 153 |
154 let expect = assert.equal; | 154 let expect = assert.equal; |
155 let isGroundType = dart.isGroundType; | 155 let isGroundType = dart.isGroundType; |
156 let generic = dart.generic; | 156 let generic = dart.generic; |
157 let intIsNonNullable = false; | 157 let intIsNonNullable = false; |
158 let cast = dart.as; | 158 let cast = dart.as; |
159 let instanceOf = dart.is; | 159 let instanceOf = dart.is; |
160 let strongInstanceOf = dart.strongInstanceOf; | 160 let strongInstanceOf = dart.strongInstanceOf; |
161 let getReifiedType = dart.getReifiedType; | 161 let getReifiedType = dart.getReifiedType; |
162 let functionType = dart.functionType; | 162 let fnTypeFuzzy = dart.fnTypeFuzzy; |
163 let typedef = dart.typedef; | 163 let typedef = dart.typedef; |
164 let isSubtype = dart.isSubtype; | 164 let isSubtype = dart.isSubtype; |
165 | 165 |
166 let Object = core.Object; | 166 let Object = core.Object; |
167 let String = core.String; | 167 let String = core.String; |
168 let dynamic = dart.dynamic; | 168 let dynamic = dart.dynamic; |
169 let List = core.List; | 169 let List = core.List; |
170 let Map = core.Map; | 170 let Map = core.Map; |
171 let Map$ = core.Map$; | 171 let Map$ = core.Map$; |
172 let double = core.double; | 172 let double = core.double; |
173 let int = core.int; | 173 let int = core.int; |
174 let num = core.num; | 174 let num = core.num; |
175 let bool = core.bool; | 175 let bool = core.bool; |
176 | 176 |
177 class A {} | 177 class A {} |
178 class B extends A {} | 178 class B extends A {} |
179 class C extends B {} | 179 class C extends B {} |
180 | 180 |
181 let AA$ = generic((T, U) => class AA extends core.Object {}); | 181 let AA$ = generic((T, U) => class AA extends core.Object {}); |
182 let AA = AA$(); | 182 let AA = AA$(); |
183 let BB$ = generic((T, U) => class BB extends AA$(U, T) {}); | 183 let BB$ = generic((T, U) => class BB extends AA$(U, T) {}); |
184 let BB = BB$(); | 184 let BB = BB$(); |
185 class CC extends BB$(String, List) {} | 185 class CC extends BB$(String, List) {} |
186 | 186 |
187 let Func2 = typedef('Func2', () => functionType(dynamic, [dynamic, dynamic])
); | 187 let Func2 = typedef('Func2', () => fnTypeFuzzy(dynamic, [dynamic, dynamic]))
; |
188 let Foo = typedef('Foo', () => functionType(B, [B, String])); | 188 let Foo = typedef('Foo', () => fnTypeFuzzy(B, [B, String])); |
189 | 189 |
190 let FuncG$ = generic((T, U) => typedef('FuncG', () => functionType(T, [T, U]
))) | 190 let FuncG$ = generic((T, U) => typedef('FuncG', () => fnTypeFuzzy(T, [T, U])
)) |
191 let FuncG = FuncG$(); | 191 let FuncG = FuncG$(); |
192 | 192 |
193 // TODO(vsm): Revisit when we encode types on functions properly. | 193 // TODO(vsm): Revisit when we encode types on functions properly. |
194 // A bar1(C c, String s) => null; | 194 // A bar1(C c, String s) => null; |
195 function bar1(c, s) { return null; } | 195 function bar1(c, s) { return null; } |
196 dart.fn(bar1, dart.definiteFunctionType(A, [C, String])); | 196 dart.fn(bar1, dart.fnType(A, [C, String])); |
197 | 197 |
198 // bar2(B b, String s) => null; | 198 // bar2(B b, String s) => null; |
199 function bar2(b, s) { return null; } | 199 function bar2(b, s) { return null; } |
200 dart.fn(bar2, dart.definiteFunctionType(dynamic, [B, String])); | 200 dart.fn(bar2, dart.fnType(dynamic, [B, String])); |
201 | 201 |
202 // B bar3(B b, Object o) => null; | 202 // B bar3(B b, Object o) => null; |
203 function bar3(b, o) { return null; } | 203 function bar3(b, o) { return null; } |
204 dart.fn(bar3, dart.definiteFunctionType(B, [B, Object])); | 204 dart.fn(bar3, dart.fnType(B, [B, Object])); |
205 | 205 |
206 // B bar4(B b, o) => null; | 206 // B bar4(B b, o) => null; |
207 function bar4(b, o) { return null; } | 207 function bar4(b, o) { return null; } |
208 dart.fn(bar4, dart.definiteFunctionType(B, [B, dynamic])); | 208 dart.fn(bar4, dart.fnType(B, [B, dynamic])); |
209 | 209 |
210 // C bar5(A a, Object o) => null; | 210 // C bar5(A a, Object o) => null; |
211 function bar5(a, o) { return null; } | 211 function bar5(a, o) { return null; } |
212 dart.fn(bar5, dart.definiteFunctionType(C, [A, Object])); | 212 dart.fn(bar5, dart.fnType(C, [A, Object])); |
213 | 213 |
214 // B bar6(B b, String s, String o) => null; | 214 // B bar6(B b, String s, String o) => null; |
215 function bar6(b, s, o) { return null; } | 215 function bar6(b, s, o) { return null; } |
216 dart.fn(bar6, dart.definiteFunctionType(B, [B, String, String])); | 216 dart.fn(bar6, dart.fnType(B, [B, String, String])); |
217 | 217 |
218 // B bar7(B b, String s, [Object o]) => null; | 218 // B bar7(B b, String s, [Object o]) => null; |
219 function bar7(b, s, o) { return null; } | 219 function bar7(b, s, o) { return null; } |
220 dart.fn(bar7, dart.definiteFunctionType(B, [B, String], [Object])); | 220 dart.fn(bar7, dart.fnType(B, [B, String], [Object])); |
221 | 221 |
222 // B bar8(B b, String s, {Object p}) => null; | 222 // B bar8(B b, String s, {Object p}) => null; |
223 function bar8(b, s, o) { return null; } | 223 function bar8(b, s, o) { return null; } |
224 dart.fn(bar8, dart.definiteFunctionType(B, [B, String], {p: Object})); | 224 dart.fn(bar8, dart.fnType(B, [B, String], {p: Object})); |
225 | 225 |
226 let cls1 = dart.fn((c, s) => { return null; }, | 226 let cls1 = dart.fn((c, s) => { return null; }, |
227 dart.definiteFunctionType(A, [C, String])); | 227 dart.fnType(A, [C, String])); |
228 | 228 |
229 let cls2 = dart.fn((b, s) => { return null; }, | 229 let cls2 = dart.fn((b, s) => { return null; }, |
230 dart.definiteFunctionType(dynamic, [B, String])); | 230 dart.fnType(dynamic, [B, String])); |
231 | 231 |
232 let cls3 = dart.fn((b, o) => { return null; }, | 232 let cls3 = dart.fn((b, o) => { return null; }, |
233 dart.definiteFunctionType(B, [B, Object])); | 233 dart.fnType(B, [B, Object])); |
234 | 234 |
235 let cls4 = dart.fn((b, o) => { return null; }, | 235 let cls4 = dart.fn((b, o) => { return null; }, |
236 dart.definiteFunctionType(B, [B, dynamic])); | 236 dart.fnType(B, [B, dynamic])); |
237 | 237 |
238 let cls5 = dart.fn((a, o) => { return null; }, | 238 let cls5 = dart.fn((a, o) => { return null; }, |
239 dart.definiteFunctionType(C, [A, Object])); | 239 dart.fnType(C, [A, Object])); |
240 | 240 |
241 let cls6 = dart.fn((b, s, o) => { return null; }, | 241 let cls6 = dart.fn((b, s, o) => { return null; }, |
242 dart.definiteFunctionType(B, [B, String, String])); | 242 dart.fnType(B, [B, String, String])); |
243 | 243 |
244 let cls7 = dart.fn((b, s, o) => { return null; }, | 244 let cls7 = dart.fn((b, s, o) => { return null; }, |
245 dart.definiteFunctionType(B, [B, String], [Object])); | 245 dart.fnType(B, [B, String], [Object])); |
246 | 246 |
247 let cls8 = | 247 let cls8 = |
248 dart.fn((b, s, o) => { return null; }, | 248 dart.fn((b, s, o) => { return null; }, |
249 dart.definiteFunctionType(B, [B, String], {p: Object})); | 249 dart.fnType(B, [B, String], {p: Object})); |
250 | 250 |
251 function checkType(x, type, expectedTrue, strongOnly) { | 251 function checkType(x, type, expectedTrue, strongOnly) { |
252 if (expectedTrue === undefined) expectedTrue = true; | 252 if (expectedTrue === undefined) expectedTrue = true; |
253 if (strongOnly === undefined) strongOnly = false; | 253 if (strongOnly === undefined) strongOnly = false; |
254 if (!strongOnly) { | 254 if (!strongOnly) { |
255 assert.doesNotThrow(() => instanceOf(x, type)); | 255 assert.doesNotThrow(() => instanceOf(x, type)); |
256 expect(instanceOf(x, type), expectedTrue, | 256 expect(instanceOf(x, type), expectedTrue, |
257 '"' + x + '" ' + | 257 '"' + x + '" ' + |
258 (expectedTrue ? 'should' : 'should not') + | 258 (expectedTrue ? 'should' : 'should not') + |
259 ' be an instance of "' + dart.typeName(type) + '"'); | 259 ' be an instance of "' + dart.typeName(type) + '"'); |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
404 }); | 404 }); |
405 | 405 |
406 test('constructors', () => { | 406 test('constructors', () => { |
407 class C extends core.Object { | 407 class C extends core.Object { |
408 new(x) {}; | 408 new(x) {}; |
409 named(x, y) {}; | 409 named(x, y) {}; |
410 } | 410 } |
411 dart.defineNamedConstructor(C, 'named'); | 411 dart.defineNamedConstructor(C, 'named'); |
412 dart.setSignature(C, { | 412 dart.setSignature(C, { |
413 constructors: () => ({ | 413 constructors: () => ({ |
414 new: dart.definiteFunctionType(C, [core.int]), | 414 new: dart.fnType(C, [core.int]), |
415 named: dart.definiteFunctionType(C, [core.int, core.int]) | 415 named: dart.fnType(C, [core.int, core.int]) |
416 }) | 416 }) |
417 }); | 417 }); |
418 let getType = dart.classGetConstructorType; | 418 let getType = dart.classGetConstructorType; |
419 isSubtype(getType(C), dart.functionType(C, [core.int])); | 419 isSubtype(getType(C), dart.fnTypeFuzzy(C, [core.int])); |
420 isSubtype(getType(C), dart.functionType(C, [core.String]), false); | 420 isSubtype(getType(C), dart.fnTypeFuzzy(C, [core.String]), false); |
421 isSubtype(getType(C, 'new'), dart.functionType(C, [core.int])); | 421 isSubtype(getType(C, 'new'), dart.fnTypeFuzzy(C, [core.int])); |
422 isSubtype(getType(C, 'new'), dart.functionType(C, [core.String]), false); | 422 isSubtype(getType(C, 'new'), dart.fnTypeFuzzy(C, [core.String]), false); |
423 isSubtype(getType(C, 'named'), dart.functionType(C, [core.int, core.int]))
; | 423 isSubtype(getType(C, 'named'), dart.fnTypeFuzzy(C, [core.int, core.int])); |
424 isSubtype(getType(C, 'named'), | 424 isSubtype(getType(C, 'named'), |
425 dart.functionType(C, [core.int, core.String]), false); | 425 dart.fnTypeFuzzy(C, [core.int, core.String]), false); |
426 }); | 426 }); |
427 | 427 |
428 test('generic and inheritance', () => { | 428 test('generic and inheritance', () => { |
429 let aaraw = new AA(); | 429 let aaraw = new AA(); |
430 let aarawtype = getReifiedType(aaraw); | 430 let aarawtype = getReifiedType(aaraw); |
431 let aadynamic = new (AA$(dynamic, dynamic))(); | 431 let aadynamic = new (AA$(dynamic, dynamic))(); |
432 let aadynamictype = getReifiedType(aadynamic); | 432 let aadynamictype = getReifiedType(aadynamic); |
433 let aa = new (AA$(String, List))(); | 433 let aa = new (AA$(String, List))(); |
434 let aatype = getReifiedType(aa); | 434 let aatype = getReifiedType(aa); |
435 let bb = new (BB$(String, List))(); | 435 let bb = new (BB$(String, List))(); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 checkType(int, core.Type, true); | 492 checkType(int, core.Type, true); |
493 checkType(num, core.Type, true); | 493 checkType(num, core.Type, true); |
494 checkType(bool, core.Type, true); | 494 checkType(bool, core.Type, true); |
495 checkType(String, core.Type, true); | 495 checkType(String, core.Type, true); |
496 checkType(dynamic, core.Type, true); | 496 checkType(dynamic, core.Type, true); |
497 checkType(Object, core.Type, true); | 497 checkType(Object, core.Type, true); |
498 checkType(List, core.Type, true); | 498 checkType(List, core.Type, true); |
499 checkType(Map, core.Type, true); | 499 checkType(Map, core.Type, true); |
500 checkType(Map$(int, String), core.Type, true); | 500 checkType(Map$(int, String), core.Type, true); |
501 checkType(Func2, core.Type, true); | 501 checkType(Func2, core.Type, true); |
502 checkType(functionType(dynamic, [dynamic]), core.Type, true); | 502 checkType(fnTypeFuzzy(dynamic, [dynamic]), core.Type, true); |
503 checkType(core.Type, core.Type, true); | 503 checkType(core.Type, core.Type, true); |
504 | 504 |
505 checkType(3, core.Type, false); | 505 checkType(3, core.Type, false); |
506 checkType("hello", core.Type, false); | 506 checkType("hello", core.Type, false); |
507 }) | 507 }) |
508 | 508 |
509 test('Functions', () => { | 509 test('Functions', () => { |
510 // - return type: Dart is bivariant. We're covariant. | 510 // - return type: Dart is bivariant. We're covariant. |
511 // - param types: Dart is bivariant. We're contravariant. | 511 // - param types: Dart is bivariant. We're contravariant. |
512 expect(isGroundType(Func2), true); | 512 expect(isGroundType(Func2), true); |
513 expect(isGroundType(Foo), false); | 513 expect(isGroundType(Foo), false); |
514 expect(isGroundType(functionType(B, [B, String])), false); | 514 expect(isGroundType(fnTypeFuzzy(B, [B, String])), false); |
515 checkType(bar1, Foo, false, true); | 515 checkType(bar1, Foo, false, true); |
516 checkType(cls1, Foo, false, true); | 516 checkType(cls1, Foo, false, true); |
517 checkType(bar1, functionType(B, [B, String]), false, true); | 517 checkType(bar1, fnTypeFuzzy(B, [B, String]), false, true); |
518 checkType(cls1, functionType(B, [B, String]), false, true); | 518 checkType(cls1, fnTypeFuzzy(B, [B, String]), false, true); |
519 checkType(bar2, Foo, false, true); | 519 checkType(bar2, Foo, false, true); |
520 checkType(cls2, Foo, false, true); | 520 checkType(cls2, Foo, false, true); |
521 checkType(bar2, functionType(B, [B, String]), false, true); | 521 checkType(bar2, fnTypeFuzzy(B, [B, String]), false, true); |
522 checkType(cls2, functionType(B, [B, String]), false, true); | 522 checkType(cls2, fnTypeFuzzy(B, [B, String]), false, true); |
523 checkType(bar3, Foo); | 523 checkType(bar3, Foo); |
524 checkType(cls3, Foo); | 524 checkType(cls3, Foo); |
525 checkType(bar3, functionType(B, [B, String])); | 525 checkType(bar3, fnTypeFuzzy(B, [B, String])); |
526 checkType(cls3, functionType(B, [B, String])); | 526 checkType(cls3, fnTypeFuzzy(B, [B, String])); |
527 checkType(bar4, Foo, true); | 527 checkType(bar4, Foo, true); |
528 checkType(cls4, Foo, true); | 528 checkType(cls4, Foo, true); |
529 checkType(bar4, functionType(B, [B, String]), true); | 529 checkType(bar4, fnTypeFuzzy(B, [B, String]), true); |
530 checkType(cls4, functionType(B, [B, String]), true); | 530 checkType(cls4, fnTypeFuzzy(B, [B, String]), true); |
531 checkType(bar5, Foo); | 531 checkType(bar5, Foo); |
532 checkType(cls5, Foo); | 532 checkType(cls5, Foo); |
533 checkType(bar5, functionType(B, [B, String])); | 533 checkType(bar5, fnTypeFuzzy(B, [B, String])); |
534 checkType(cls5, functionType(B, [B, String])); | 534 checkType(cls5, fnTypeFuzzy(B, [B, String])); |
535 checkType(bar6, Foo, false); | 535 checkType(bar6, Foo, false); |
536 checkType(cls6, Foo, false); | 536 checkType(cls6, Foo, false); |
537 checkType(bar6, functionType(B, [B, String]), false); | 537 checkType(bar6, fnTypeFuzzy(B, [B, String]), false); |
538 checkType(cls6, functionType(B, [B, String]), false); | 538 checkType(cls6, fnTypeFuzzy(B, [B, String]), false); |
539 checkType(bar7, Foo); | 539 checkType(bar7, Foo); |
540 checkType(cls7, Foo); | 540 checkType(cls7, Foo); |
541 checkType(bar7, functionType(B, [B, String])); | 541 checkType(bar7, fnTypeFuzzy(B, [B, String])); |
542 checkType(cls7, functionType(B, [B, String])); | 542 checkType(cls7, fnTypeFuzzy(B, [B, String])); |
543 checkType(bar7, getReifiedType(bar6)); | 543 checkType(bar7, getReifiedType(bar6)); |
544 checkType(cls7, getReifiedType(bar6)); | 544 checkType(cls7, getReifiedType(bar6)); |
545 checkType(bar8, Foo); | 545 checkType(bar8, Foo); |
546 checkType(cls8, Foo); | 546 checkType(cls8, Foo); |
547 checkType(bar8, functionType(B, [B, String])); | 547 checkType(bar8, fnTypeFuzzy(B, [B, String])); |
548 checkType(cls8, functionType(B, [B, String])); | 548 checkType(cls8, fnTypeFuzzy(B, [B, String])); |
549 checkType(bar8, getReifiedType(bar6), false); | 549 checkType(bar8, getReifiedType(bar6), false); |
550 checkType(cls8, getReifiedType(bar6), false); | 550 checkType(cls8, getReifiedType(bar6), false); |
551 checkType(bar7, getReifiedType(bar8), false); | 551 checkType(bar7, getReifiedType(bar8), false); |
552 checkType(cls7, getReifiedType(bar8), false); | 552 checkType(cls7, getReifiedType(bar8), false); |
553 checkType(bar8, getReifiedType(bar7), false); | 553 checkType(bar8, getReifiedType(bar7), false); |
554 checkType(cls8, getReifiedType(bar7), false); | 554 checkType(cls8, getReifiedType(bar7), false); |
555 | 555 |
556 // Parameterized typedefs | 556 // Parameterized typedefs |
557 expect(isGroundType(FuncG), true); | 557 expect(isGroundType(FuncG), true); |
558 expect(isGroundType(FuncG$(B, String)), false); | 558 expect(isGroundType(FuncG$(B, String)), false); |
559 checkType(bar1, FuncG$(B, String), false, true); | 559 checkType(bar1, FuncG$(B, String), false, true); |
560 checkType(cls1, FuncG$(B, String), false, true); | 560 checkType(cls1, FuncG$(B, String), false, true); |
561 checkType(bar3, FuncG$(B, String)); | 561 checkType(bar3, FuncG$(B, String)); |
562 checkType(cls3, FuncG$(B, String)); | 562 checkType(cls3, FuncG$(B, String)); |
563 }); | 563 }); |
564 | 564 |
565 test('dcall', () => { | 565 test('dcall', () => { |
566 function dd2d(x, y) {return x}; | 566 function dd2d(x, y) {return x}; |
567 dart.fn(dd2d); | 567 dart.fn(dd2d); |
568 function ii2i(x, y) {return x}; | 568 function ii2i(x, y) {return x}; |
569 dart.fn(ii2i, dart.definiteFunctionType(core.int, [core.int, core.int])); | 569 dart.fn(ii2i, dart.fnType(core.int, [core.int, core.int])); |
570 function ii_2i(x, y) {return x}; | 570 function ii_2i(x, y) {return x}; |
571 dart.fn(ii_2i, dart.definiteFunctionType(core.int, [core.int], [core.int])
); | 571 dart.fn(ii_2i, dart.fnType(core.int, [core.int], [core.int])); |
572 function i_i2i(x, opts) {return x}; | 572 function i_i2i(x, opts) {return x}; |
573 dart.fn(i_i2i, | 573 dart.fn(i_i2i, |
574 dart.definiteFunctionType(core.int, [core.int], {extra: core.int})
); | 574 dart.fnType(core.int, [core.int], {extra: core.int})); |
575 | 575 |
576 assert.equal(dart.dcall(dd2d, 0, 1), 0); | 576 assert.equal(dart.dcall(dd2d, 0, 1), 0); |
577 assert.equal(dart.dcall(dd2d, "hello", "world"), "hello"); | 577 assert.equal(dart.dcall(dd2d, "hello", "world"), "hello"); |
578 assert.throws(() => dart.dcall(dd2d, 0)); | 578 assert.throws(() => dart.dcall(dd2d, 0)); |
579 assert.throws(() => dart.dcall(dd2d, 0, 1, 2)); | 579 assert.throws(() => dart.dcall(dd2d, 0, 1, 2)); |
580 assert.throws(() => dart.dcall(dd2d, 0, 1, {extra : 3})); | 580 assert.throws(() => dart.dcall(dd2d, 0, 1, {extra : 3})); |
581 // This should throw but currently doesn't. | 581 // This should throw but currently doesn't. |
582 // assert.throws(() => dart.dcall(dd2d, 0, {extra:3})); | 582 // assert.throws(() => dart.dcall(dd2d, 0, {extra:3})); |
583 | 583 |
584 assert.equal(dart.dcall(ii2i, 0, 1), 0); | 584 assert.equal(dart.dcall(ii2i, 0, 1), 0); |
(...skipping 10 matching lines...) Expand all Loading... |
595 assert.throws(() => dart.dcall(i_i2i, "hello", "world")); | 595 assert.throws(() => dart.dcall(i_i2i, "hello", "world")); |
596 assert.equal(dart.dcall(i_i2i, 0), 0); | 596 assert.equal(dart.dcall(i_i2i, 0), 0); |
597 assert.throws(() => dart.dcall(i_i2i, 0, 1, 2)); | 597 assert.throws(() => dart.dcall(i_i2i, 0, 1, 2)); |
598 assert.equal(dart.dcall(i_i2i, 0, {extra: 3}), 0); | 598 assert.equal(dart.dcall(i_i2i, 0, {extra: 3}), 0); |
599 }); | 599 }); |
600 | 600 |
601 test('dsend', () => { | 601 test('dsend', () => { |
602 class Tester extends core.Object { | 602 class Tester extends core.Object { |
603 new() { | 603 new() { |
604 this.f = dart.fn(x => x, | 604 this.f = dart.fn(x => x, |
605 dart.definiteFunctionType(core.int, [core.int])); | 605 dart.fnType(core.int, [core.int])); |
606 this.me = this; | 606 this.me = this; |
607 } | 607 } |
608 m(x, y) {return x;} | 608 m(x, y) {return x;} |
609 call(x) {return x;} | 609 call(x) {return x;} |
610 static s(x, y) { return x;} | 610 static s(x, y) { return x;} |
611 } | 611 } |
612 dart.setSignature(Tester, { | 612 dart.setSignature(Tester, { |
613 methods: () => ({ | 613 methods: () => ({ |
614 m: dart.definiteFunctionType(core.int, [core.int, core.int]), | 614 m: dart.fnType(core.int, [core.int, core.int]), |
615 call: dart.definiteFunctionType(core.int, [core.int]) | 615 call: dart.fnType(core.int, [core.int]) |
616 }), | 616 }), |
617 statics: () => ({ | 617 statics: () => ({ |
618 s: dart.definiteFunctionType(core.String, [core.String]) | 618 s: dart.fnType(core.String, [core.String]) |
619 }), | 619 }), |
620 names: ['s'] | 620 names: ['s'] |
621 }) | 621 }) |
622 let o = new Tester(); | 622 let o = new Tester(); |
623 | 623 |
624 // Method send | 624 // Method send |
625 assert.equal(dart.dsend(o, 'm', 3, 4), 3); | 625 assert.equal(dart.dsend(o, 'm', 3, 4), 3); |
626 assert.equal(dart.dsend(o, 'm', null, 4), null); | 626 assert.equal(dart.dsend(o, 'm', null, 4), null); |
627 assert.throws(() => dart.dsend(o, 'm', 3)); | 627 assert.throws(() => dart.dsend(o, 'm', 3)); |
628 assert.throws(() => dart.dsend(o, 'm', "hello", "world")); | 628 assert.throws(() => dart.dsend(o, 'm', "hello", "world")); |
(...skipping 21 matching lines...) Expand all Loading... |
650 assert.equal(dart.dsend(o, 'me', 3), 3); | 650 assert.equal(dart.dsend(o, 'me', 3), 3); |
651 assert.equal(dart.dsend(o, 'me', null), null); | 651 assert.equal(dart.dsend(o, 'me', null), null); |
652 assert.throws(() => dart.dsend(o, 'me', "hello")); | 652 assert.throws(() => dart.dsend(o, 'me', "hello")); |
653 assert.throws(() => dart.dsend(o, 'me', 3, 4)); | 653 assert.throws(() => dart.dsend(o, 'me', 3, 4)); |
654 }); | 654 }); |
655 | 655 |
656 test('Types on top level functions', () => { | 656 test('Types on top level functions', () => { |
657 // Test some generated code | 657 // Test some generated code |
658 // Test the lazy path | 658 // Test the lazy path |
659 checkType(core.identityHashCode, | 659 checkType(core.identityHashCode, |
660 dart.functionType(core.int, [core.Object])); | 660 dart.fnTypeFuzzy(core.int, [core.Object])); |
661 // Test the normal path | 661 // Test the normal path |
662 checkType(core.identical, | 662 checkType(core.identical, |
663 dart.functionType(core.bool, | 663 dart.fnTypeFuzzy(core.bool, |
664 [core.Object, core.Object])); | 664 [core.Object, core.Object])); |
665 | 665 |
666 // Hand crafted tests | 666 // Hand crafted tests |
667 // All dynamic | 667 // All dynamic |
668 function dd2d(x, y) {return x}; | 668 function dd2d(x, y) {return x}; |
669 dart.fn(dd2d); | 669 dart.fn(dd2d); |
670 checkType(dd2d, dart.functionType(dart.dynamic, | 670 checkType(dd2d, dart.fnTypeFuzzy(dart.dynamic, |
671 [dart.dynamic, dart.dynamic])); | 671 [dart.dynamic, dart.dynamic])); |
672 | 672 |
673 // Set the type eagerly | 673 // Set the type eagerly |
674 function ii2i(x, y) {return x}; | 674 function ii2i(x, y) {return x}; |
675 dart.fn(ii2i, dart.definiteFunctionType(core.int, [core.int, core.int])); | 675 dart.fn(ii2i, dart.fnType(core.int, [core.int, core.int])); |
676 checkType(ii2i, dart.functionType(core.int, | 676 checkType(ii2i, dart.fnTypeFuzzy(core.int, |
677 [core.int, core.int])); | 677 [core.int, core.int])); |
678 | 678 |
679 // Set the type lazily | 679 // Set the type lazily |
680 function ss2s(x, y) {return x}; | 680 function ss2s(x, y) {return x}; |
681 var coreString; | 681 var coreString; |
682 dart.lazyFn(ss2s, | 682 dart.lazyFn(ss2s, |
683 () => dart.definiteFunctionType(coreString, | 683 () => dart.fnType(coreString, |
684 [coreString, coreString])); | 684 [coreString, coreString])); |
685 coreString = core.String; | 685 coreString = core.String; |
686 checkType(ss2s, dart.functionType(core.String, | 686 checkType(ss2s, dart.fnTypeFuzzy(core.String, |
687 [core.String, core.String])); | 687 [core.String, core.String])); |
688 | 688 |
689 // Optional types | 689 // Optional types |
690 function ii_2i(x, y) {return x}; | 690 function ii_2i(x, y) {return x}; |
691 dart.fn(ii_2i, dart.definiteFunctionType(core.int, [core.int], [core.int])
); | 691 dart.fn(ii_2i, dart.fnType(core.int, [core.int], [core.int])); |
692 checkType(ii_2i, dart.functionType(core.int, [core.int], | 692 checkType(ii_2i, dart.fnTypeFuzzy(core.int, [core.int], |
693 [core.int])); | 693 [core.int])); |
694 checkType(ii_2i, dart.functionType(core.int, [core.int, | 694 checkType(ii_2i, dart.fnTypeFuzzy(core.int, [core.int, |
695 core.int])); | 695 core.int])); |
696 checkType(ii_2i, dart.functionType(core.int, [], [core.int, | 696 checkType(ii_2i, dart.fnTypeFuzzy(core.int, [], [core.int, |
697 core.int]), | 697 core.int]), |
698 false); | 698 false); |
699 checkType(ii_2i, dart.functionType(core.int, [core.int], | 699 checkType(ii_2i, dart.fnTypeFuzzy(core.int, [core.int], |
700 {extra: core.int}), false); | 700 {extra: core.int}), false); |
701 | 701 |
702 // Named types | 702 // Named types |
703 function i_i2i(x, opts) {return x}; | 703 function i_i2i(x, opts) {return x}; |
704 dart.fn(i_i2i, dart.definiteFunctionType(core.int, [core.int], | 704 dart.fn(i_i2i, dart.fnType(core.int, [core.int], |
705 {extra: core.int})); | 705 {extra: core.int})); |
706 checkType(i_i2i, dart.functionType(core.int, [core.int], | 706 checkType(i_i2i, dart.fnTypeFuzzy(core.int, [core.int], |
707 {extra: core.int})); | 707 {extra: core.int})); |
708 checkType(i_i2i, dart.functionType(core.int, | 708 checkType(i_i2i, dart.fnTypeFuzzy(core.int, |
709 [core.int, core.int]), false); | 709 [core.int, core.int]), false); |
710 checkType(i_i2i, dart.functionType(core.int, [core.int], {})); | 710 checkType(i_i2i, dart.fnTypeFuzzy(core.int, [core.int], {})); |
711 checkType(i_i2i, | 711 checkType(i_i2i, |
712 dart.functionType(core.int, [], {extra: core.int, | 712 dart.fnTypeFuzzy(core.int, [], {extra: core.int, |
713 also: core.int}), false); | 713 also: core.int}), false); |
714 checkType(i_i2i, | 714 checkType(i_i2i, |
715 dart.functionType(core.int, [core.int], [core.int]), false); | 715 dart.fnTypeFuzzy(core.int, [core.int], [core.int]), false); |
716 }); | 716 }); |
717 | 717 |
718 test('Method tearoffs', () => { | 718 test('Method tearoffs', () => { |
719 let c = collection; | 719 let c = collection; |
720 // Tear off of an inherited method | 720 // Tear off of an inherited method |
721 let map = new (Map$(core.int, core.String))(); | 721 let map = new (Map$(core.int, core.String))(); |
722 checkType(dart.bind(map, 'toString'), | 722 checkType(dart.bind(map, 'toString'), |
723 dart.functionType(String, [])); | 723 dart.fnTypeFuzzy(String, [])); |
724 checkType(dart.bind(map, 'toString'), | 724 checkType(dart.bind(map, 'toString'), |
725 dart.functionType(int, []), false, true); | 725 dart.fnTypeFuzzy(int, []), false, true); |
726 | 726 |
727 // Tear off of a method directly on the object | 727 // Tear off of a method directly on the object |
728 let smap = new (c.SplayTreeMap$(core.int, core.String))(); | 728 let smap = new (c.SplayTreeMap$(core.int, core.String))(); |
729 checkType(dart.bind(smap, 'forEach'), | 729 checkType(dart.bind(smap, 'forEach'), |
730 dart.functionType(dart.void, | 730 dart.fnTypeFuzzy(dart.void, |
731 [dart.functionType(dart.void, [core.int, core.String
])])); | 731 [dart.fnTypeFuzzy(dart.void, [core.int, core.String]
)])); |
732 checkType(dart.bind(smap, 'forEach'), | 732 checkType(dart.bind(smap, 'forEach'), |
733 dart.functionType(dart.void, | 733 dart.fnTypeFuzzy(dart.void, |
734 [dart.functionType(dart.void, | 734 [dart.fnTypeFuzzy(dart.void, |
735 [core.String, core.String])]), false, true); | 735 [core.String, core.String])]), false, true); |
736 | 736 |
737 // Tear off of a mixed in method | 737 // Tear off of a mixed in method |
738 let mapB = new (c.MapBase$(core.int, core.int))(); | 738 let mapB = new (c.MapBase$(core.int, core.int))(); |
739 checkType(dart.bind(mapB, 'forEach'), | 739 checkType(dart.bind(mapB, 'forEach'), |
740 dart.functionType(dart.void, [ | 740 dart.fnTypeFuzzy(dart.void, [ |
741 dart.functionType(dart.void, [core.int, core.int])])); | 741 dart.fnTypeFuzzy(dart.void, [core.int, core.int])])); |
742 checkType(dart.bind(mapB, 'forEach'), | 742 checkType(dart.bind(mapB, 'forEach'), |
743 dart.functionType(dart.void, [ | 743 dart.fnTypeFuzzy(dart.void, [ |
744 dart.functionType(dart.void, [core.int, core.String])]), | 744 dart.fnTypeFuzzy(dart.void, [core.int, core.String])]), |
745 false, true); | 745 false, true); |
746 | 746 |
747 // Tear off of a method with a symbol name | 747 // Tear off of a method with a symbol name |
748 let listB = new (c.ListBase$(core.int))(); | 748 let listB = new (c.ListBase$(core.int))(); |
749 checkType(dart.bind(listB, dartx.add), | 749 checkType(dart.bind(listB, dartx.add), |
750 dart.functionType(dart.void, [core.int])); | 750 dart.fnTypeFuzzy(dart.void, [core.int])); |
751 checkType(dart.bind(listB, dartx.add), | 751 checkType(dart.bind(listB, dartx.add), |
752 dart.functionType(dart.void, [core.String]), false, true); | 752 dart.fnTypeFuzzy(dart.void, [core.String]), false, true); |
753 | 753 |
754 // Tear off of a static method | 754 // Tear off of a static method |
755 checkType(c.ListBase.listToString, | 755 checkType(c.ListBase.listToString, |
756 dart.functionType(core.String, [core.List])); | 756 dart.fnTypeFuzzy(core.String, [core.List])); |
757 checkType(c.ListBase.listToString, | 757 checkType(c.ListBase.listToString, |
758 dart.functionType(core.String, [core.String]), false, true); | 758 dart.fnTypeFuzzy(core.String, [core.String]), false, true); |
759 | 759 |
760 // Tear-off of extension methods on primitives | 760 // Tear-off of extension methods on primitives |
761 checkType(dart.bind(3.0, dartx.floor), | 761 checkType(dart.bind(3.0, dartx.floor), |
762 dart.functionType(core.int, [])); | 762 dart.fnTypeFuzzy(core.int, [])); |
763 checkType(dart.bind(3.0, dartx.floor), | 763 checkType(dart.bind(3.0, dartx.floor), |
764 dart.functionType(core.String, []), false, true); | 764 dart.fnTypeFuzzy(core.String, []), false, true); |
765 checkType(dart.bind("", dartx.endsWith), | 765 checkType(dart.bind("", dartx.endsWith), |
766 dart.functionType(core.bool, [core.String])); | 766 dart.fnTypeFuzzy(core.bool, [core.String])); |
767 checkType(dart.bind("", dartx.endsWith), | 767 checkType(dart.bind("", dartx.endsWith), |
768 dart.functionType(core.bool, [core.int]), false, true); | 768 dart.fnTypeFuzzy(core.bool, [core.int]), false, true); |
769 | 769 |
770 // Tear off a mixin method | 770 // Tear off a mixin method |
771 class Base { | 771 class Base { |
772 m(x) {return x;} | 772 m(x) {return x;} |
773 }; | 773 }; |
774 dart.setSignature(Base, { | 774 dart.setSignature(Base, { |
775 methods: () => ({ | 775 methods: () => ({ |
776 m: dart.definiteFunctionType(core.int, [core.int]), | 776 m: dart.fnType(core.int, [core.int]), |
777 }) | 777 }) |
778 }); | 778 }); |
779 | 779 |
780 class M1 { | 780 class M1 { |
781 m(x) {return x;} | 781 m(x) {return x;} |
782 }; | 782 }; |
783 dart.setSignature(M1, { | 783 dart.setSignature(M1, { |
784 methods: () => ({ | 784 methods: () => ({ |
785 m: dart.definiteFunctionType(core.num, [core.int]), | 785 m: dart.fnType(core.num, [core.int]), |
786 }) | 786 }) |
787 }); | 787 }); |
788 | 788 |
789 class M2 { | 789 class M2 { |
790 m(x) {return x;} | 790 m(x) {return x;} |
791 }; | 791 }; |
792 dart.setSignature(M2, { | 792 dart.setSignature(M2, { |
793 methods: () => ({ | 793 methods: () => ({ |
794 m: dart.definiteFunctionType(core.Object, [core.int]), | 794 m: dart.fnType(core.Object, [core.int]), |
795 }) | 795 }) |
796 }); | 796 }); |
797 | 797 |
798 class O extends dart.mixin(Base, M1, M2) { | 798 class O extends dart.mixin(Base, M1, M2) { |
799 new() {}; | 799 new() {}; |
800 }; | 800 }; |
801 dart.setSignature(O, {}); | 801 dart.setSignature(O, {}); |
802 var obj = new O(); | 802 var obj = new O(); |
803 var m = dart.bind(obj, 'm'); | 803 var m = dart.bind(obj, 'm'); |
804 checkType(m, dart.functionType(core.Object, [core.int])); | 804 checkType(m, dart.fnTypeFuzzy(core.Object, [core.int])); |
805 checkType(m, dart.functionType(core.int, [core.int]), false, true); | 805 checkType(m, dart.fnTypeFuzzy(core.int, [core.int]), false, true); |
806 | 806 |
807 // Test inherited signatures | 807 // Test inherited signatures |
808 class P extends O { | 808 class P extends O { |
809 new() {}; | 809 new() {}; |
810 m(x) {return x;}; | 810 m(x) {return x;}; |
811 }; | 811 }; |
812 dart.setSignature(P, {}); | 812 dart.setSignature(P, {}); |
813 var obj = new P(); | 813 var obj = new P(); |
814 var m = dart.bind(obj, 'm'); | 814 var m = dart.bind(obj, 'm'); |
815 checkType(m, dart.functionType(core.Object, [core.int])); | 815 checkType(m, dart.fnTypeFuzzy(core.Object, [core.int])); |
816 checkType(m, dart.functionType(core.int, [core.int]), false, true); | 816 checkType(m, dart.fnTypeFuzzy(core.int, [core.int]), false, true); |
817 }); | 817 }); |
818 | 818 |
819 test('Object members', () => { | 819 test('Object members', () => { |
820 let nullHash = dart.hashCode(null); | 820 let nullHash = dart.hashCode(null); |
821 assert.equal(nullHash, 0); | 821 assert.equal(nullHash, 0); |
822 let nullString = dart.toString(null); | 822 let nullString = dart.toString(null); |
823 assert.equal(nullString, 'null'); | 823 assert.equal(nullString, 'null'); |
824 | 824 |
825 let map = new Map(); | 825 let map = new Map(); |
826 let mapHash = dart.hashCode(map); | 826 let mapHash = dart.hashCode(map); |
(...skipping 17 matching lines...) Expand all Loading... |
844 checkType(intHash, core.int); | 844 checkType(intHash, core.int); |
845 | 845 |
846 let intString = dart.toString(n); | 846 let intString = dart.toString(n); |
847 assert.equal(intString, '42'); | 847 assert.equal(intString, '42'); |
848 }); | 848 }); |
849 }); | 849 }); |
850 | 850 |
851 suite('subtyping', function() { | 851 suite('subtyping', function() { |
852 'use strict'; | 852 'use strict'; |
853 | 853 |
854 let functionType = dart.functionType; | 854 let fnTypeFuzzy = dart.fnTypeFuzzy; |
855 let definiteFunctionType = dart.definiteFunctionType; | 855 let fnType = dart.fnType; |
856 let typedef = dart.typedef; | 856 let typedef = dart.typedef; |
857 let isSubtype = dart.isSubtype; | 857 let isSubtype = dart.isSubtype; |
858 let int = core.int; | 858 let int = core.int; |
859 let num = core.num; | 859 let num = core.num; |
860 let dyn = dart.dynamic; | 860 let dyn = dart.dynamic; |
861 | 861 |
862 function always(t1, t2) { | 862 function always(t1, t2) { |
863 assert.equal(isSubtype(t1, t2), true, | 863 assert.equal(isSubtype(t1, t2), true, |
864 dart.toString(t1) + | 864 dart.toString(t1) + |
865 " should always be a subtype of " + | 865 " should always be a subtype of " + |
866 dart.toString(t2)); | 866 dart.toString(t2)); |
867 } | 867 } |
868 function never(t1, t2) { | 868 function never(t1, t2) { |
869 assert.equal(isSubtype(t1, t2), false, | 869 assert.equal(isSubtype(t1, t2), false, |
870 dart.toString(t1) + | 870 dart.toString(t1) + |
871 " should never be a subtype of " + | 871 " should never be a subtype of " + |
872 dart.toString(t2)); | 872 dart.toString(t2)); |
873 } | 873 } |
874 function maybe(t1, t2) { | 874 function maybe(t1, t2) { |
875 assert.equal(isSubtype(t1, t2), null, | 875 assert.equal(isSubtype(t1, t2), null, |
876 dart.toString(t1) + | 876 dart.toString(t1) + |
877 " should maybe be a subtype of " + | 877 " should maybe be a subtype of " + |
878 dart.toString(t2)); | 878 dart.toString(t2)); |
879 } | 879 } |
880 | 880 |
881 function always2(t1, t2) { | 881 function always2(t1, t2) { |
882 always(t1, t2); | 882 always(t1, t2); |
883 always(functionType(t1, [t2]), functionType(t2, [t1])); | 883 always(fnTypeFuzzy(t1, [t2]), fnTypeFuzzy(t2, [t1])); |
884 } | 884 } |
885 function never2(t1, t2) { | 885 function never2(t1, t2) { |
886 never(t1, t2); | 886 never(t1, t2); |
887 maybe(functionType(t1, [t2]), functionType(t2, [t1])); | 887 maybe(fnTypeFuzzy(t1, [t2]), fnTypeFuzzy(t2, [t1])); |
888 } | 888 } |
889 function maybe2(t1, t2) { | 889 function maybe2(t1, t2) { |
890 maybe(t1, t2); | 890 maybe(t1, t2); |
891 maybe(functionType(t1, [t2]), functionType(t2, [t1])); | 891 maybe(fnTypeFuzzy(t1, [t2]), fnTypeFuzzy(t2, [t1])); |
892 } | 892 } |
893 | 893 |
894 function run_test(func1, func2, func2opt, func1extra, func2extra) { | 894 function run_test(func1, func2, func2opt, func1extra, func2extra) { |
895 always2(func2(int, int), func2(int, int)); | 895 always2(func2(int, int), func2(int, int)); |
896 always2(func2(int, num), func2(int, int)); | 896 always2(func2(int, num), func2(int, int)); |
897 always2(func2(int, int), func2(num, int)); | 897 always2(func2(int, int), func2(num, int)); |
898 | 898 |
899 always2(func2opt(int, int), func2opt(int, int)); | 899 always2(func2opt(int, int), func2opt(int, int)); |
900 always2(func2opt(int, num), func2opt(int, int)); | 900 always2(func2opt(int, num), func2opt(int, int)); |
901 always2(func2opt(int, int), func2opt(num, int)); | 901 always2(func2opt(int, int), func2opt(num, int)); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
958 never2(func2(num, int), func1extra(int)); | 958 never2(func2(num, int), func1extra(int)); |
959 never2(func2(num, num), func1extra(num)); | 959 never2(func2(num, num), func1extra(num)); |
960 | 960 |
961 never2(func2(int, int), func2extra(int, int)); | 961 never2(func2(int, int), func2extra(int, int)); |
962 never2(func2(num, int), func2extra(int, int)); | 962 never2(func2(num, int), func2extra(int, int)); |
963 never2(func2(num, num), func2extra(num, num)); | 963 never2(func2(num, num), func2extra(num, num)); |
964 }; | 964 }; |
965 | 965 |
966 test('basic function types', () => { | 966 test('basic function types', () => { |
967 function func1(S) { | 967 function func1(S) { |
968 return functionType(S, []); | 968 return fnTypeFuzzy(S, []); |
969 } | 969 } |
970 | 970 |
971 function func2(S, T) { | 971 function func2(S, T) { |
972 return functionType(S, [T]); | 972 return fnTypeFuzzy(S, [T]); |
973 } | 973 } |
974 | 974 |
975 function func2opt(S, T) { | 975 function func2opt(S, T) { |
976 return functionType(S, [], [T]); | 976 return fnTypeFuzzy(S, [], [T]); |
977 } | 977 } |
978 | 978 |
979 function func1extra(S) { | 979 function func1extra(S) { |
980 return functionType(S, [], {extra: int}); | 980 return fnTypeFuzzy(S, [], {extra: int}); |
981 } | 981 } |
982 | 982 |
983 function func2extra(S, T) { | 983 function func2extra(S, T) { |
984 return functionType(S, [T], {extra: int}); | 984 return fnTypeFuzzy(S, [T], {extra: int}); |
985 } | 985 } |
986 | 986 |
987 run_test(func1, func2, func2opt, func1extra, func2extra); | 987 run_test(func1, func2, func2opt, func1extra, func2extra); |
988 }); | 988 }); |
989 | 989 |
990 test('top and bottom types', () => { | 990 test('top and bottom types', () => { |
991 let FutureOr = async.FutureOr$; | 991 let FutureOr = async.FutureOr$; |
992 let tops = [ | 992 let tops = [ |
993 dart.dynamic, | 993 dart.dynamic, |
994 core.Object, | 994 core.Object, |
995 dart.void, | 995 dart.void, |
996 FutureOr(dart.dynamic), | 996 FutureOr(dart.dynamic), |
997 FutureOr(core.Object), | 997 FutureOr(core.Object), |
998 FutureOr(dart.void), | 998 FutureOr(dart.void), |
999 FutureOr(FutureOr(core.Object)), | 999 FutureOr(FutureOr(core.Object)), |
1000 // ... skip the (infinite) rest of the top types :D | 1000 // ... skip the (infinite) rest of the top types :D |
1001 ]; | 1001 ]; |
1002 let bottoms = [dart.bottom, core.Null]; | 1002 let bottoms = [dart.bottom, core.Null]; |
1003 | 1003 |
1004 for (let top of tops) { | 1004 for (let top of tops) { |
1005 for (let bottom of bottoms) { | 1005 for (let bottom of bottoms) { |
1006 always(bottom, top); | 1006 always(bottom, top); |
1007 always( | 1007 always( |
1008 definiteFunctionType(bottom, [top]), | 1008 fnType(bottom, [top]), |
1009 definiteFunctionType(top, [bottom])); | 1009 fnType(top, [bottom])); |
1010 } | 1010 } |
1011 } | 1011 } |
1012 | 1012 |
1013 for (let equalTypes of [tops, bottoms]) { | 1013 for (let equalTypes of [tops, bottoms]) { |
1014 for (let t1 of equalTypes) { | 1014 for (let t1 of equalTypes) { |
1015 for (let t2 of equalTypes) { | 1015 for (let t2 of equalTypes) { |
1016 always(t1, t2); | 1016 always(t1, t2); |
1017 always(t2, t1); | 1017 always(t2, t1); |
1018 | 1018 |
1019 let t11 = definiteFunctionType(t1, [t1]); | 1019 let t11 = fnType(t1, [t1]); |
1020 let t22 = definiteFunctionType(t2, [t2]); | 1020 let t22 = fnType(t2, [t2]); |
1021 always(t11, t22); | 1021 always(t11, t22); |
1022 always(t22, t11); | 1022 always(t22, t11); |
1023 } | 1023 } |
1024 } | 1024 } |
1025 } | 1025 } |
1026 }); | 1026 }); |
1027 | 1027 |
1028 test('basic typedefs', () => { | 1028 test('basic typedefs', () => { |
1029 function func1(S) { | 1029 function func1(S) { |
1030 return dart.typedef('Func1', () => functionType(S, [])) | 1030 return dart.typedef('Func1', () => fnTypeFuzzy(S, [])) |
1031 } | 1031 } |
1032 | 1032 |
1033 function func2(S, T) { | 1033 function func2(S, T) { |
1034 return dart.typedef('Func2', () => functionType(S, [T])) | 1034 return dart.typedef('Func2', () => fnTypeFuzzy(S, [T])) |
1035 } | 1035 } |
1036 | 1036 |
1037 function func2opt(S, T) { | 1037 function func2opt(S, T) { |
1038 return dart.typedef('Func2', () => functionType(S, [], [T])) | 1038 return dart.typedef('Func2', () => fnTypeFuzzy(S, [], [T])) |
1039 } | 1039 } |
1040 | 1040 |
1041 function func1extra(S) { | 1041 function func1extra(S) { |
1042 return dart.typedef('Func1', () => functionType(S, [], {extra: int})) | 1042 return dart.typedef('Func1', () => fnTypeFuzzy(S, [], {extra: int})) |
1043 } | 1043 } |
1044 | 1044 |
1045 function func2extra(S, T) { | 1045 function func2extra(S, T) { |
1046 return dart.typedef('Func2', () => functionType(S, [T], {extra: int})) | 1046 return dart.typedef('Func2', () => fnTypeFuzzy(S, [T], {extra: int})) |
1047 } | 1047 } |
1048 | 1048 |
1049 run_test(func1, func2, func2opt, func1extra, func2extra); | 1049 run_test(func1, func2, func2opt, func1extra, func2extra); |
1050 }); | 1050 }); |
1051 | 1051 |
1052 test('basic generic typedefs', () => { | 1052 test('basic generic typedefs', () => { |
1053 let func1 = dart.generic( | 1053 let func1 = dart.generic( |
1054 (S) => dart.typedef('Func1', () => functionType(S, []))); | 1054 (S) => dart.typedef('Func1', () => fnTypeFuzzy(S, []))); |
1055 | 1055 |
1056 let func2 = dart.generic( | 1056 let func2 = dart.generic( |
1057 (S, T) => dart.typedef('Func2', () => functionType(S, [T]))); | 1057 (S, T) => dart.typedef('Func2', () => fnTypeFuzzy(S, [T]))); |
1058 | 1058 |
1059 let func2opt = dart.generic( | 1059 let func2opt = dart.generic( |
1060 (S, T) => dart.typedef('Func2', () => functionType(S, [], [T]))); | 1060 (S, T) => dart.typedef('Func2', () => fnTypeFuzzy(S, [], [T]))); |
1061 | 1061 |
1062 let func1extra = dart.generic( | 1062 let func1extra = dart.generic( |
1063 (S) => dart.typedef('Func1', () => functionType(S, [], {extra: int}))); | 1063 (S) => dart.typedef('Func1', () => fnTypeFuzzy(S, [], {extra: int}))); |
1064 | 1064 |
1065 let func2extra = dart.generic( | 1065 let func2extra = dart.generic( |
1066 (S, T) => dart.typedef('Func2', | 1066 (S, T) => dart.typedef('Func2', |
1067 () => functionType(S, [T], {extra: int}))); | 1067 () => fnTypeFuzzy(S, [T], {extra: int}))); |
1068 | 1068 |
1069 run_test(func1, func2, func2opt, func1extra, func2extra); | 1069 run_test(func1, func2, func2opt, func1extra, func2extra); |
1070 }); | 1070 }); |
1071 | 1071 |
1072 test('fuzzy function types', () => { | 1072 test('fuzzy function types', () => { |
1073 always(functionType(int, [int]), functionType(dyn, [dyn])); | 1073 always(fnTypeFuzzy(int, [int]), fnTypeFuzzy(dyn, [dyn])); |
1074 always(functionType(int, [], [int]), functionType(dyn, [], [dyn])); | 1074 always(fnTypeFuzzy(int, [], [int]), fnTypeFuzzy(dyn, [], [dyn])); |
1075 always(functionType(int, [], [int]), functionType(dyn, [dyn])); | 1075 always(fnTypeFuzzy(int, [], [int]), fnTypeFuzzy(dyn, [dyn])); |
1076 always(functionType(int, [], [int]), functionType(dyn, [])); | 1076 always(fnTypeFuzzy(int, [], [int]), fnTypeFuzzy(dyn, [])); |
1077 always(functionType(int, [int], {extra: int}), functionType(dyn, [dyn])); | 1077 always(fnTypeFuzzy(int, [int], {extra: int}), fnTypeFuzzy(dyn, [dyn])); |
1078 | 1078 |
1079 always(functionType(dyn, [dyn]), functionType(dyn, [dyn])); | 1079 always(fnTypeFuzzy(dyn, [dyn]), fnTypeFuzzy(dyn, [dyn])); |
1080 always(functionType(dyn, [], [dyn]), functionType(dyn, [], [dyn])); | 1080 always(fnTypeFuzzy(dyn, [], [dyn]), fnTypeFuzzy(dyn, [], [dyn])); |
1081 always(functionType(dyn, [], [dyn]), functionType(dyn, [dyn])); | 1081 always(fnTypeFuzzy(dyn, [], [dyn]), fnTypeFuzzy(dyn, [dyn])); |
1082 always(functionType(dyn, [], [dyn]), functionType(dyn, [])); | 1082 always(fnTypeFuzzy(dyn, [], [dyn]), fnTypeFuzzy(dyn, [])); |
1083 always(functionType(dyn, [dyn], {extra: dyn}), functionType(dyn, [dyn])); | 1083 always(fnTypeFuzzy(dyn, [dyn], {extra: dyn}), fnTypeFuzzy(dyn, [dyn])); |
1084 }); | 1084 }); |
1085 | 1085 |
1086 test('void function types', () => { | 1086 test('void function types', () => { |
1087 always(functionType(int, [int]), functionType(dart.void, [dyn])); | 1087 always(fnTypeFuzzy(int, [int]), fnTypeFuzzy(dart.void, [dyn])); |
1088 always(functionType(int, [], [int]), functionType(dart.void, [], [dyn])); | 1088 always(fnTypeFuzzy(int, [], [int]), fnTypeFuzzy(dart.void, [], [dyn])); |
1089 always(functionType(int, [], [int]), functionType(dart.void, [dyn])); | 1089 always(fnTypeFuzzy(int, [], [int]), fnTypeFuzzy(dart.void, [dyn])); |
1090 always(functionType(int, [], [int]), functionType(dart.void, [])); | 1090 always(fnTypeFuzzy(int, [], [int]), fnTypeFuzzy(dart.void, [])); |
1091 always(functionType(int, [int], {extra: int}), functionType(dart.void, [dy
n])); | 1091 always(fnTypeFuzzy(int, [int], {extra: int}), fnTypeFuzzy(dart.void, [dyn]
)); |
1092 | 1092 |
1093 always(functionType(dart.void, [int]), functionType(dart.void, [dyn])); | 1093 always(fnTypeFuzzy(dart.void, [int]), fnTypeFuzzy(dart.void, [dyn])); |
1094 always(functionType(dart.void, [], [int]), functionType(dart.void, [], [dy
n])); | 1094 always(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(dart.void, [], [dyn]
)); |
1095 always(functionType(dart.void, [], [int]), functionType(dart.void, [dyn]))
; | 1095 always(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(dart.void, [dyn])); |
1096 always(functionType(dart.void, [], [int]), functionType(dart.void, [])); | 1096 always(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(dart.void, [])); |
1097 always(functionType(dart.void, [int], {extra: int}), functionType(dart.voi
d, [dyn])); | 1097 always(fnTypeFuzzy(dart.void, [int], {extra: int}), fnTypeFuzzy(dart.void,
[dyn])); |
1098 | 1098 |
1099 always(functionType(dyn, [dyn]), functionType(dart.void, [dyn])); | 1099 always(fnTypeFuzzy(dyn, [dyn]), fnTypeFuzzy(dart.void, [dyn])); |
1100 always(functionType(dyn, [], [dyn]), functionType(dart.void, [], [dyn])); | 1100 always(fnTypeFuzzy(dyn, [], [dyn]), fnTypeFuzzy(dart.void, [], [dyn])); |
1101 always(functionType(dyn, [], [dyn]), functionType(dart.void, [dyn])); | 1101 always(fnTypeFuzzy(dyn, [], [dyn]), fnTypeFuzzy(dart.void, [dyn])); |
1102 always(functionType(dyn, [], [dyn]), functionType(dart.void, [])); | 1102 always(fnTypeFuzzy(dyn, [], [dyn]), fnTypeFuzzy(dart.void, [])); |
1103 always(functionType(dyn, [dyn], {extra: dyn}), functionType(dart.void, [dy
n])); | 1103 always(fnTypeFuzzy(dyn, [dyn], {extra: dyn}), fnTypeFuzzy(dart.void, [dyn]
)); |
1104 | 1104 |
1105 always(functionType(dart.void, [dyn]), functionType(dart.void, [dyn])); | 1105 always(fnTypeFuzzy(dart.void, [dyn]), fnTypeFuzzy(dart.void, [dyn])); |
1106 always(functionType(dart.void, [], [dyn]), functionType(dart.void, [], [dy
n])); | 1106 always(fnTypeFuzzy(dart.void, [], [dyn]), fnTypeFuzzy(dart.void, [], [dyn]
)); |
1107 always(functionType(dart.void, [], [dyn]), functionType(dart.void, [dyn]))
; | 1107 always(fnTypeFuzzy(dart.void, [], [dyn]), fnTypeFuzzy(dart.void, [dyn])); |
1108 always(functionType(dart.void, [], [dyn]), functionType(dart.void, [])); | 1108 always(fnTypeFuzzy(dart.void, [], [dyn]), fnTypeFuzzy(dart.void, [])); |
1109 always(functionType(dart.void, [dyn], {extra: dyn}), functionType(dart.voi
d, [dyn])); | 1109 always(fnTypeFuzzy(dart.void, [dyn], {extra: dyn}), fnTypeFuzzy(dart.void,
[dyn])); |
1110 | 1110 |
1111 always(functionType(dart.void, [int]), functionType(dyn, [dyn])); | 1111 always(fnTypeFuzzy(dart.void, [int]), fnTypeFuzzy(dyn, [dyn])); |
1112 always(functionType(dart.void, [], [int]), functionType(dyn, [], [dyn])); | 1112 always(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(dyn, [], [dyn])); |
1113 always(functionType(dart.void, [], [int]), functionType(dyn, [dyn])); | 1113 always(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(dyn, [dyn])); |
1114 always(functionType(dart.void, [], [int]), functionType(dyn, [])); | 1114 always(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(dyn, [])); |
1115 always(functionType(dart.void, [int], {extra: int}), functionType(dyn, [dy
n])); | 1115 always(fnTypeFuzzy(dart.void, [int], {extra: int}), fnTypeFuzzy(dyn, [dyn]
)); |
1116 | 1116 |
1117 never(functionType(dart.void, [int]), functionType(int, [dyn])); | 1117 never(fnTypeFuzzy(dart.void, [int]), fnTypeFuzzy(int, [dyn])); |
1118 never(functionType(dart.void, [], [int]), functionType(int, [], [dyn])); | 1118 never(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(int, [], [dyn])); |
1119 never(functionType(dart.void, [], [int]), functionType(int, [dyn])); | 1119 never(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(int, [dyn])); |
1120 never(functionType(dart.void, [], [int]), functionType(int, [])); | 1120 never(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(int, [])); |
1121 never(functionType(dart.void, [int], {extra: int}), functionType(int, [dyn
])); | 1121 never(fnTypeFuzzy(dart.void, [int], {extra: int}), fnTypeFuzzy(int, [dyn])
); |
1122 | 1122 |
1123 never(functionType(dart.void, [int]), functionType(int, [int])); | 1123 never(fnTypeFuzzy(dart.void, [int]), fnTypeFuzzy(int, [int])); |
1124 never(functionType(dart.void, [], [int]), functionType(int, [], [int])); | 1124 never(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(int, [], [int])); |
1125 never(functionType(dart.void, [], [int]), functionType(int, [int])); | 1125 never(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(int, [int])); |
1126 never(functionType(dart.void, [], [int]), functionType(int, [])); | 1126 never(fnTypeFuzzy(dart.void, [], [int]), fnTypeFuzzy(int, [])); |
1127 never(functionType(dart.void, [int], {extra: int}), functionType(int, [int
])); | 1127 never(fnTypeFuzzy(dart.void, [int], {extra: int}), fnTypeFuzzy(int, [int])
); |
1128 }); | 1128 }); |
1129 | 1129 |
1130 test('higher-order typedef', () => { | 1130 test('higher-order typedef', () => { |
1131 let Func$ = dart.generic((S, T) => | 1131 let Func$ = dart.generic((S, T) => |
1132 dart.typedef('Func', () => | 1132 dart.typedef('Func', () => |
1133 functionType(T, [S]))); | 1133 fnTypeFuzzy(T, [S]))); |
1134 let Func2$ = dart.generic((R, S, T) => | 1134 let Func2$ = dart.generic((R, S, T) => |
1135 dart.typedef('Func2', () => | 1135 dart.typedef('Func2', () => |
1136 functionType(T, [Func$(R, S)]))); | 1136 fnTypeFuzzy(T, [Func$(R, S)]))); |
1137 | 1137 |
1138 maybe(functionType(int, [functionType(int, [num])]), | 1138 maybe(fnTypeFuzzy(int, [fnTypeFuzzy(int, [num])]), |
1139 functionType(num, [functionType(int, [int])])); | 1139 fnTypeFuzzy(num, [fnTypeFuzzy(int, [int])])); |
1140 maybe(functionType(int, [Func$(num, int)]), | 1140 maybe(fnTypeFuzzy(int, [Func$(num, int)]), |
1141 functionType(num, [Func$(int, int)])); | 1141 fnTypeFuzzy(num, [Func$(int, int)])); |
1142 maybe(Func2$(num, int, int), Func2$(int, int, num)); | 1142 maybe(Func2$(num, int, int), Func2$(int, int, num)); |
1143 }); | 1143 }); |
1144 | 1144 |
1145 test('mixed types', () => { | 1145 test('mixed types', () => { |
1146 let AA$ = dart.generic((T) => class AA extends core.Object {}); | 1146 let AA$ = dart.generic((T) => class AA extends core.Object {}); |
1147 | 1147 |
1148 always(int, dyn); | 1148 always(int, dyn); |
1149 maybe(dyn, int); | 1149 maybe(dyn, int); |
1150 | 1150 |
1151 never(functionType(int, [int]), int); | 1151 never(fnTypeFuzzy(int, [int]), int); |
1152 | 1152 |
1153 never(int, functionType(int, [int])); | 1153 never(int, fnTypeFuzzy(int, [int])); |
1154 | 1154 |
1155 always(AA$(int), AA$(dyn)); | 1155 always(AA$(int), AA$(dyn)); |
1156 maybe(AA$(dyn), AA$(int)); | 1156 maybe(AA$(dyn), AA$(int)); |
1157 never(AA$(core.Object), AA$(int)); | 1157 never(AA$(core.Object), AA$(int)); |
1158 | 1158 |
1159 always(AA$(functionType(int, [int])), AA$(dyn)); | 1159 always(AA$(fnTypeFuzzy(int, [int])), AA$(dyn)); |
1160 maybe(AA$(dyn), AA$(functionType(int, [int]))); | 1160 maybe(AA$(dyn), AA$(fnTypeFuzzy(int, [int]))); |
1161 never(AA$(core.Object), AA$(functionType(int, [int]))); | 1161 never(AA$(core.Object), AA$(fnTypeFuzzy(int, [int]))); |
1162 | 1162 |
1163 always(AA$(functionType(int, [int])), AA$(functionType(dyn, [dyn]))); | 1163 always(AA$(fnTypeFuzzy(int, [int])), AA$(fnTypeFuzzy(dyn, [dyn]))); |
1164 maybe(AA$(functionType(dyn, [dyn])), AA$(functionType(int, [int]))); | 1164 maybe(AA$(fnTypeFuzzy(dyn, [dyn])), AA$(fnTypeFuzzy(int, [int]))); |
1165 maybe(AA$(functionType(core.Object, [core.Object])), | 1165 maybe(AA$(fnTypeFuzzy(core.Object, [core.Object])), |
1166 AA$(functionType(int, [int]))); | 1166 AA$(fnTypeFuzzy(int, [int]))); |
1167 }); | 1167 }); |
1168 }); | 1168 }); |
1169 | 1169 |
1170 suite('canonicalization', function() { | 1170 suite('canonicalization', function() { |
1171 'use strict'; | 1171 'use strict'; |
1172 let functionType = dart.functionType; | 1172 let fnTypeFuzzy = dart.fnTypeFuzzy; |
1173 let definiteFunctionType = dart.definiteFunctionType; | 1173 let fnType = dart.fnType; |
1174 let typedef = dart.typedef; | 1174 let typedef = dart.typedef; |
1175 let generic = dart.generic; | 1175 let generic = dart.generic; |
1176 | 1176 |
1177 let Object = core.Object; | 1177 let Object = core.Object; |
1178 let String = core.String; | 1178 let String = core.String; |
1179 let int = core.int; | 1179 let int = core.int; |
1180 let dynamic = dart.dynamic; | 1180 let dynamic = dart.dynamic; |
1181 let bottom = dart.bottom; | 1181 let bottom = dart.bottom; |
1182 let Map = core.Map; | 1182 let Map = core.Map; |
1183 let Map$ = core.Map$; | 1183 let Map$ = core.Map$; |
1184 | 1184 |
1185 class A {} | 1185 class A {} |
1186 | 1186 |
1187 let AA$ = generic((T, U) => class AA extends core.Object {}); | 1187 let AA$ = generic((T, U) => class AA extends core.Object {}); |
1188 let AA = AA$(); | 1188 let AA = AA$(); |
1189 | 1189 |
1190 let Func2 = typedef('Func2', () => functionType(dynamic, [dynamic, dynamic])
); | 1190 let Func2 = typedef('Func2', () => fnTypeFuzzy(dynamic, [dynamic, dynamic]))
; |
1191 | 1191 |
1192 let FuncG$ = generic((T, U) => typedef('FuncG', () => functionType(T, [T, U]
))) | 1192 let FuncG$ = generic((T, U) => typedef('FuncG', () => fnTypeFuzzy(T, [T, U])
)) |
1193 let FuncG = FuncG$(); | 1193 let FuncG = FuncG$(); |
1194 | 1194 |
1195 test('base types', () => { | 1195 test('base types', () => { |
1196 assert.equal(Object, Object); | 1196 assert.equal(Object, Object); |
1197 assert.equal(String, String); | 1197 assert.equal(String, String); |
1198 assert.equal(dynamic, dynamic); | 1198 assert.equal(dynamic, dynamic); |
1199 }); | 1199 }); |
1200 | 1200 |
1201 test('class types', () => { | 1201 test('class types', () => { |
1202 assert.equal(A, A); | 1202 assert.equal(A, A); |
(...skipping 10 matching lines...) Expand all Loading... |
1213 }); | 1213 }); |
1214 | 1214 |
1215 test('typedefs', () => { | 1215 test('typedefs', () => { |
1216 assert.equal(Func2, Func2); | 1216 assert.equal(Func2, Func2); |
1217 assert.equal(FuncG, FuncG$(dynamic, dynamic)); | 1217 assert.equal(FuncG, FuncG$(dynamic, dynamic)); |
1218 assert.equal(FuncG$(dynamic, dynamic), FuncG$(dynamic, dynamic)); | 1218 assert.equal(FuncG$(dynamic, dynamic), FuncG$(dynamic, dynamic)); |
1219 assert.equal(FuncG$(String, Func2), FuncG$(String, Func2)); | 1219 assert.equal(FuncG$(String, Func2), FuncG$(String, Func2)); |
1220 }); | 1220 }); |
1221 | 1221 |
1222 test('function types', () => { | 1222 test('function types', () => { |
1223 assert.equal(functionType(dynamic, [dynamic, dynamic]), | 1223 assert.equal(fnTypeFuzzy(dynamic, [dynamic, dynamic]), |
1224 functionType(dynamic, [dynamic, dynamic])) | 1224 fnTypeFuzzy(dynamic, [dynamic, dynamic])) |
1225 | 1225 |
1226 assert.notEqual(definiteFunctionType(dynamic, [dynamic, dynamic]), | 1226 assert.notEqual(fnType(dynamic, [dynamic, dynamic]), |
1227 functionType(dynamic, [dynamic, dynamic])) | 1227 fnTypeFuzzy(dynamic, [dynamic, dynamic])) |
1228 | 1228 |
1229 assert.equal(functionType(dynamic, [dynamic, dynamic]), | 1229 assert.equal(fnTypeFuzzy(dynamic, [dynamic, dynamic]), |
1230 functionType(dynamic, [bottom, bottom])) | 1230 fnTypeFuzzy(dynamic, [bottom, bottom])) |
1231 | 1231 |
1232 assert.equal(functionType(dynamic, [], [dynamic, dynamic]), | 1232 assert.equal(fnTypeFuzzy(dynamic, [], [dynamic, dynamic]), |
1233 functionType(dynamic, [], [dynamic, dynamic])) | 1233 fnTypeFuzzy(dynamic, [], [dynamic, dynamic])) |
1234 | 1234 |
1235 assert.notEqual(definiteFunctionType(dynamic, [], [dynamic, dynamic]), | 1235 assert.notEqual(fnType(dynamic, [], [dynamic, dynamic]), |
1236 functionType(dynamic, [], [dynamic, dynamic])) | 1236 fnTypeFuzzy(dynamic, [], [dynamic, dynamic])) |
1237 | 1237 |
1238 assert.equal(functionType(dynamic, [], [dynamic, dynamic]), | 1238 assert.equal(fnTypeFuzzy(dynamic, [], [dynamic, dynamic]), |
1239 functionType(dynamic, [], [bottom, bottom])) | 1239 fnTypeFuzzy(dynamic, [], [bottom, bottom])) |
1240 | 1240 |
1241 assert.equal(functionType(dynamic, [], {extra: dynamic}), | 1241 assert.equal(fnTypeFuzzy(dynamic, [], {extra: dynamic}), |
1242 functionType(dynamic, [], {extra: dynamic})) | 1242 fnTypeFuzzy(dynamic, [], {extra: dynamic})) |
1243 | 1243 |
1244 assert.notEqual(definiteFunctionType(dynamic, [], {extra: dynamic}), | 1244 assert.notEqual(fnType(dynamic, [], {extra: dynamic}), |
1245 functionType(dynamic, [], {extra: dynamic})) | 1245 fnTypeFuzzy(dynamic, [], {extra: dynamic})) |
1246 | 1246 |
1247 assert.equal(functionType(dynamic, [], {extra: dynamic}), | 1247 assert.equal(fnTypeFuzzy(dynamic, [], {extra: dynamic}), |
1248 functionType(dynamic, [], {extra: bottom})) | 1248 fnTypeFuzzy(dynamic, [], {extra: bottom})) |
1249 | 1249 |
1250 assert.equal(functionType(int, [int, int]), | 1250 assert.equal(fnTypeFuzzy(int, [int, int]), |
1251 functionType(int, [int, int])) | 1251 fnTypeFuzzy(int, [int, int])) |
1252 | 1252 |
1253 assert.equal(functionType(int, [], [int, int]), | 1253 assert.equal(fnTypeFuzzy(int, [], [int, int]), |
1254 functionType(int, [], [int, int])) | 1254 fnTypeFuzzy(int, [], [int, int])) |
1255 | 1255 |
1256 assert.equal(functionType(int, [int, int], {extra: int}), | 1256 assert.equal(fnTypeFuzzy(int, [int, int], {extra: int}), |
1257 functionType(int, [int, int], {extra: int})) | 1257 fnTypeFuzzy(int, [int, int], {extra: int})) |
1258 | 1258 |
1259 assert.equal(functionType(int, [int, int, int, int, int]), | 1259 assert.equal(fnTypeFuzzy(int, [int, int, int, int, int]), |
1260 functionType(int, [int, int, int, int, int])) | 1260 fnTypeFuzzy(int, [int, int, int, int, int])) |
1261 | 1261 |
1262 assert.notEqual(functionType(int, [int, int, int, int, int]), | 1262 assert.notEqual(fnTypeFuzzy(int, [int, int, int, int, int]), |
1263 functionType(int, [int, int, int], [int, int])) | 1263 fnTypeFuzzy(int, [int, int, int], [int, int])) |
1264 | 1264 |
1265 assert.notEqual(functionType(String, [int, int, int, int, int]), | 1265 assert.notEqual(fnTypeFuzzy(String, [int, int, int, int, int]), |
1266 functionType(int, [int, int, int, int, int])) | 1266 fnTypeFuzzy(int, [int, int, int, int, int])) |
1267 | 1267 |
1268 assert.notEqual(functionType(String, []), | 1268 assert.notEqual(fnTypeFuzzy(String, []), |
1269 functionType(int, [])) | 1269 fnTypeFuzzy(int, [])) |
1270 }); | 1270 }); |
1271 }); | 1271 }); |
1272 | 1272 |
1273 suite('primitives', function() { | 1273 suite('primitives', function() { |
1274 'use strict'; | 1274 'use strict'; |
1275 | 1275 |
1276 test('fixed length list', () => { | 1276 test('fixed length list', () => { |
1277 let list = new core.List(10); | 1277 let list = new core.List(10); |
1278 list[0] = 42; | 1278 list[0] = 42; |
1279 assert.throws(() => list.add(42)); | 1279 assert.throws(() => list.add(42)); |
1280 }); | 1280 }); |
1281 | 1281 |
1282 test('toString on ES Symbol', () => { | 1282 test('toString on ES Symbol', () => { |
1283 let sym = Symbol('_foobar'); | 1283 let sym = Symbol('_foobar'); |
1284 assert.equal(dart.toString(sym), 'Symbol(_foobar)'); | 1284 assert.equal(dart.toString(sym), 'Symbol(_foobar)'); |
1285 }); | 1285 }); |
1286 }); | 1286 }); |
1287 }); | 1287 }); |
OLD | NEW |