| // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import "package:async_helper/async_helper.dart"; |
| import "package:expect/expect.dart"; |
| import 'compiler_helper.dart'; |
| import 'type_mask_test_helper.dart'; |
| |
| import 'dart:async'; |
| |
| const String TEST1 = r""" |
| foo(int x) { |
| var a = "one"; |
| switch (x) { |
| case 1: |
| a = "two"; |
| break; |
| case 2: |
| break; |
| } |
| |
| return a; |
| } |
| |
| main() { |
| foo(new DateTime.now().millisecondsSinceEpoch); |
| } |
| """; |
| |
| const String TEST2 = r""" |
| foo(int x) { |
| var a; |
| switch (x) { |
| case 1: |
| a = "two"; |
| break; |
| case 2: |
| break; |
| } |
| |
| return a; |
| } |
| |
| main() { |
| foo(new DateTime.now().millisecondsSinceEpoch); |
| } |
| """; |
| |
| const String TEST3 = r""" |
| foo(int x) { |
| var a; |
| switch (x) { |
| case 1: |
| a = 1; |
| case 2: // illegal fall through |
| a = 2; |
| break; |
| } |
| |
| return a; |
| } |
| |
| main() { |
| foo(new DateTime.now().millisecondsSinceEpoch); |
| } |
| """; |
| |
| const String TEST4 = r""" |
| foo(int x) { |
| var a; |
| switch (x) { |
| case 1: |
| a = 1; |
| case 2: // illegal fall through |
| a = 2; |
| break; |
| default: |
| a = 0; |
| } |
| |
| return a; |
| } |
| |
| main() { |
| foo(new DateTime.now().millisecondsSinceEpoch); |
| } |
| """; |
| |
| const String TEST5 = r""" |
| foo(int x) { |
| var a; |
| switch (x) { |
| case 1: |
| a = 1; |
| break; |
| case 2: |
| a = 2; |
| break; |
| default: |
| } |
| |
| return a; |
| } |
| |
| main() { |
| foo(new DateTime.now().millisecondsSinceEpoch); |
| } |
| """; |
| |
| const String TEST6 = r""" |
| foo(int x) { |
| var a; |
| do { // add extra locals scope |
| switch (x) { |
| case 1: |
| a = 1; |
| break; |
| case 2: |
| a = 2; |
| break; |
| } |
| } while (false); |
| |
| return a; |
| } |
| |
| main() { |
| foo(new DateTime.now().millisecondsSinceEpoch); |
| } |
| """; |
| |
| Future runTest(String test, checker) { |
| Uri uri = new Uri(scheme: 'source'); |
| var compiler = compilerFor(test, uri); |
| return compiler.run(uri).then((_) { |
| var typesInferrer = compiler.globalInference.typesInferrerInternal; |
| var closedWorld = typesInferrer.closedWorld; |
| var commonMasks = closedWorld.commonMasks; |
| |
| checkTypeOf(String name, TypeMask type) { |
| var element = findElement(compiler, name); |
| var mask = typesInferrer.getReturnTypeOfElement(element); |
| Expect.equals(type, simplify(mask, closedWorld)); |
| } |
| |
| checker(commonMasks, checkTypeOf); |
| }); |
| } |
| |
| main() { |
| asyncTest(() async { |
| await runTest(TEST1, (t, c) => c("foo", t.stringType)); |
| await runTest(TEST2, (t, c) => c("foo", t.stringType.nullable())); |
| await runTest(TEST3, (t, c) => c("foo", t.uint31Type.nullable())); |
| await runTest(TEST4, (t, c) => c("foo", t.uint31Type)); |
| await runTest(TEST5, (t, c) => c("foo", t.uint31Type.nullable())); |
| await runTest(TEST6, (t, c) => c("foo", t.uint31Type.nullable())); |
| }); |
| } |