| // Copyright (c) 2012, 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. |
| |
| /// TODO(johnniwinther): Port this test to use the equivalence framework. |
| |
| import 'dart:async'; |
| import 'package:expect/expect.dart'; |
| import 'package:async_helper/async_helper.dart'; |
| import '../compiler_helper.dart'; |
| |
| Future compileAndFind(String code, String name, check(compiler, element)) { |
| Uri uri = new Uri(scheme: 'source'); |
| var compiler = mockCompilerFor(code, uri); |
| return compiler.run(uri).then((_) { |
| var element = findElement(compiler, name); |
| check(compiler, element); |
| }); |
| } |
| |
| void checkPrintType(String expression, checkType(closedWorld, type)) { |
| asyncTest(() => compileAndFind('main() { print($expression); }', 'print', |
| (compiler, printElement) { |
| var parameter = printElement.functionSignature.requiredParameters.first; |
| checkType(compiler.resolutionWorldBuilder.closedWorldForTesting, |
| _typeOf(compiler, parameter)); |
| })); |
| |
| asyncTest(() => |
| compileAndFind('main() { var x = print; print($expression); }', 'print', |
| (compiler, printElement) { |
| var parameter = printElement.functionSignature.requiredParameters.first; |
| checkType(compiler.resolutionWorldBuilder.closedWorldForTesting, |
| _typeOf(compiler, parameter)); |
| })); |
| |
| asyncTest(() => compileAndFind( |
| 'main() { print($expression); print($expression); }', 'print', |
| (compiler, printElement) { |
| var parameter = printElement.functionSignature.requiredParameters.first; |
| checkType(compiler.resolutionWorldBuilder.closedWorldForTesting, |
| _typeOf(compiler, parameter)); |
| })); |
| } |
| |
| void testBasicTypes() { |
| checkPrintType('true', (closedWorld, type) { |
| if (type.isForwarding) type = type.forwardTo; |
| Expect.identical(closedWorld.commonMasks.boolType, type); |
| }); |
| checkPrintType('1.5', (closedWorld, type) { |
| Expect.identical(closedWorld.commonMasks.doubleType, type); |
| }); |
| checkPrintType('1', (closedWorld, type) { |
| Expect.identical(closedWorld.commonMasks.uint31Type, type); |
| }); |
| checkPrintType('[]', (closedWorld, type) { |
| if (type.isForwarding) type = type.forwardTo; |
| Expect.identical(closedWorld.commonMasks.growableListType, type); |
| }); |
| checkPrintType('null', (closedWorld, type) { |
| Expect.identical(closedWorld.commonMasks.nullType, type); |
| }); |
| checkPrintType('"foo"', (closedWorld, type) { |
| Expect.isTrue( |
| closedWorld.commonMasks.stringType.containsOnlyString(closedWorld)); |
| }); |
| } |
| |
| void testOptionalParameters() { |
| compileAndFind('fisk(a, [b, c]) {} main() { fisk(1); }', 'fisk', |
| (compiler, fiskElement) { |
| var firstParameter = fiskElement.functionSignature.requiredParameters[0]; |
| var secondParameter = fiskElement.functionSignature.optionalParameters[0]; |
| var thirdParameter = fiskElement.functionSignature.optionalParameters[1]; |
| var commonMasks = |
| compiler.resolutionWorldBuilder.closedWorldForTesting.commonMasks; |
| Expect.identical(commonMasks.uint31Type, _typeOf(compiler, firstParameter)); |
| Expect.identical(commonMasks.nullType, _typeOf(compiler, secondParameter)); |
| Expect.identical(commonMasks.nullType, _typeOf(compiler, thirdParameter)); |
| }); |
| } |
| |
| void main() { |
| testBasicTypes(); |
| testOptionalParameters(); |
| } |
| |
| _typeOf(compiler, parameter) => |
| compiler.globalInference.results.resultOfParameter(parameter).type; |