| Index: test/browser/runtime_tests.js
|
| diff --git a/test/browser/runtime_tests.js b/test/browser/runtime_tests.js
|
| index 354139e24ab6dd9257bf297ea1a2a5686c443115..9412c97696ababa85cd19dc033864b874f1d854d 100644
|
| --- a/test/browser/runtime_tests.js
|
| +++ b/test/browser/runtime_tests.js
|
| @@ -809,76 +809,144 @@ suite('subtyping', function() {
|
| 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]));
|
| + 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));
|
|
|
| - always2(functionType(int, [], [int]), functionType(int, [], [int]));
|
| - always2(functionType(int, [], [num]), functionType(int, [], [int]));
|
| - always2(functionType(int, [], [int]), functionType(num, [], [int]));
|
| + never2(func2(int, int), func1extra(int));
|
| + never2(func2(num, int), func1extra(int));
|
| + never2(func2(num, num), func1extra(num));
|
|
|
| - always2(functionType(int, [], [int]), functionType(int, [int]));
|
| - always2(functionType(int, [], [num]), functionType(int, [int]));
|
| - always2(functionType(int, [], [int]), functionType(num, [int]));
|
| + never2(func2(int, int), func2extra(int, int));
|
| + never2(func2(num, int), func2extra(int, int));
|
| + never2(func2(num, num), func2extra(num, num));
|
| + };
|
|
|
| - always2(functionType(int, [], [int]), functionType(int, []));
|
| - always2(functionType(int, [], [num]), functionType(int, []));
|
| - always2(functionType(int, [], [int]), functionType(num, []));
|
| + test('basic function types', () => {
|
| + function func1(S) {
|
| + return functionType(S, []);
|
| + }
|
|
|
| - 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]));
|
| + function func2(S, T) {
|
| + return functionType(S, [T]);
|
| + }
|
|
|
| - maybe2(functionType(int, [int]), functionType(int, [num]));
|
| - maybe2(functionType(num, [int]), functionType(int, [int]));
|
| + function func2opt(S, T) {
|
| + return functionType(S, [], [T]);
|
| + }
|
|
|
| - maybe2(functionType(num, [], [num]), functionType(int, []));
|
| + function func1extra(S) {
|
| + return functionType(S, [], {extra: int});
|
| + }
|
|
|
| - maybe2(functionType(int, [], [int]), functionType(int, [], [num]));
|
| - maybe2(functionType(num, [], [int]), functionType(int, [], [int]));
|
| + function func2extra(S, T) {
|
| + return functionType(S, [T], {extra: int});
|
| + }
|
|
|
| - maybe2(functionType(int, [], [int]), functionType(int, [num]));
|
| - maybe2(functionType(num, [], [int]), functionType(int, [int]));
|
| + run_test(func1, func2, func2opt, func1extra, func2extra);
|
| + });
|
|
|
| - maybe2(functionType(int, [int], {extra: int}), functionType(int, [num]));
|
| - maybe2(functionType(num, [int], {extra: int}), functionType(int, [int]));
|
| + test('basic typedefs', () => {
|
| + function func1(S) {
|
| + return dart.typedef('Func1', () => functionType(S, []))
|
| + }
|
|
|
| - never2(functionType(int, []), functionType(int, [num]));
|
| - never2(functionType(num, []), functionType(int, [int]));
|
| - never2(functionType(num, []), functionType(num, [num]));
|
| + function func2(S, T) {
|
| + return dart.typedef('Func2', () => functionType(S, [T]))
|
| + }
|
|
|
| - never2(functionType(int, [int]), functionType(int, []));
|
| - never2(functionType(num, [int]), functionType(int, []));
|
| - never2(functionType(num, [num]), functionType(num, []));
|
| + 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}))
|
| + }
|
|
|
| - never2(functionType(int, []), functionType(int, [], [num]));
|
| - never2(functionType(num, []), functionType(int, [], [int]));
|
| - never2(functionType(num, []), functionType(num, [], [num]));
|
| + run_test(func1, func2, func2opt, func1extra, func2extra);
|
| + });
|
|
|
| - never2(functionType(int, [int]), functionType(int, [], [num]));
|
| - never2(functionType(num, [int]), functionType(int, [], [int]));
|
| - never2(functionType(num, [num]), functionType(num, [], [num]));
|
| + test('basic generic typedefs', () => {
|
| + let func1 = dart.generic(
|
| + (S) => dart.typedef('Func1', () => functionType(S, [])));
|
|
|
| - never2(functionType(int, [], {extra: int}), functionType(int, [num]));
|
| - never2(functionType(num, [], {extra: int}), functionType(int, [int]));
|
| - never2(functionType(num, [], {extra: int}), functionType(num, [num]));
|
| + let func2 = dart.generic(
|
| + (S, T) => dart.typedef('Func2', () => functionType(S, [T])));
|
|
|
| - never2(functionType(int, [], {extra: int}), functionType(int, [], [num]));
|
| - never2(functionType(num, [], {extra: int}), functionType(int, [], [int]));
|
| - never2(functionType(num, [], {extra: int}), functionType(num, [], [num]));
|
| + let func2opt = dart.generic(
|
| + (S, T) => dart.typedef('Func2', () => functionType(S, [], [T])));
|
|
|
| - never2(functionType(int, []), functionType(int, [], {extra: int}));
|
| - never2(functionType(num, []), functionType(int, [], {extra: int}));
|
| - never2(functionType(num, []), functionType(num, [], {extra: int}));
|
| + let func1extra = dart.generic(
|
| + (S) => dart.typedef('Func1', () => functionType(S, [], {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}));
|
| + let func2extra = dart.generic(
|
| + (S, T) => dart.typedef('Func2',
|
| + () => functionType(S, [T], {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}));
|
| + run_test(func1, func2, func2opt, func1extra, func2extra);
|
| });
|
|
|
| test('fuzzy function types', () => {
|
| @@ -894,6 +962,21 @@ suite('subtyping', function() {
|
|
|
| });
|
|
|
| + 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 {});
|
|
|
|
|