| Index: test/runtime/dart_runtime_test.dart
|
| diff --git a/test/runtime/dart_runtime_test.dart b/test/runtime/dart_runtime_test.dart
|
| deleted file mode 100644
|
| index 87c147d578a5b8ae7d50abedade088b5ce169564..0000000000000000000000000000000000000000
|
| --- a/test/runtime/dart_runtime_test.dart
|
| +++ /dev/null
|
| @@ -1,335 +0,0 @@
|
| -// Copyright (c) 2015, 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.
|
| -
|
| -// Test code
|
| -import 'dart:collection';
|
| -import 'dart:mirrors';
|
| -import 'package:test/test.dart';
|
| -import 'package:dev_compiler/config.dart';
|
| -import 'package:dev_compiler/runtime/dart_runtime.dart';
|
| -
|
| -final bool intIsNonNullable = TypeOptions.NONNULLABLE_TYPES.contains('int');
|
| -final bool doubleIsNonNullable =
|
| - TypeOptions.NONNULLABLE_TYPES.contains('double');
|
| -
|
| -class A {
|
| - int x;
|
| -}
|
| -
|
| -class B extends A {
|
| - int y;
|
| -}
|
| -
|
| -class C extends B {
|
| - int z;
|
| -}
|
| -
|
| -class AA<T, U> {
|
| - T x;
|
| - U y;
|
| -}
|
| -
|
| -class BB<T, U> extends AA<U, T> {
|
| - T z;
|
| -}
|
| -
|
| -class CC extends BB<String, List> {}
|
| -
|
| -typedef Func2(x, y);
|
| -typedef B Foo(B b, String s);
|
| -
|
| -A bar1(C c, String s) => null;
|
| -bar2(B b, String s) => null;
|
| -B bar3(B b, Object o) => null;
|
| -B bar4(B b, o) => null;
|
| -C bar5(A a, Object o) => null;
|
| -B bar6(B b, String s, String o) => null;
|
| -B bar7(B b, String s, [Object o]) => null;
|
| -B bar8(B b, String s, {Object p}) => null;
|
| -
|
| -class Bar {
|
| - B call(B b, String s) => null;
|
| -}
|
| -
|
| -class Baz {
|
| - Foo call = (B b, String s) => null;
|
| -}
|
| -
|
| -class Checker<T> {
|
| - void isGround(bool expected) => expect(isGroundType(T), equals(expected));
|
| - void isGroundList(bool expected) =>
|
| - expect(isGroundType(new List<T>().runtimeType), equals(expected));
|
| - void check(x, bool expected) => checkType(x, T, expected);
|
| - void checkList(x, bool expected) =>
|
| - checkType(x, type((List<T> _) {}), expected);
|
| -}
|
| -
|
| -bool dartIs(expr, Type type) {
|
| - var exprMirror = reflectType(expr.runtimeType);
|
| - var typeMirror = reflectType(type);
|
| - return exprMirror.isSubtypeOf(typeMirror);
|
| -}
|
| -
|
| -void checkType(x, Type type, [bool expectedTrue = true]) {
|
| - var isGround = isGroundType(type);
|
| - var restrictedSubType = instanceOf(x, type);
|
| - var dartSubType = dartIs(x, type);
|
| -
|
| - // Matches expectation
|
| - expect(restrictedSubType, equals(expectedTrue));
|
| -
|
| - // x is_R T => x is T
|
| - expect(!restrictedSubType || dartSubType, isTrue);
|
| -
|
| - // x is T && isGroundType(T) => x is_R T
|
| - expect(!(dartSubType && isGround) || restrictedSubType, isTrue);
|
| -}
|
| -
|
| -void checkArity(Function f, int min, int max) {
|
| - Arity arity = getArity(f);
|
| - expect(arity.min, equals(min));
|
| - expect(arity.max, equals(max));
|
| -}
|
| -
|
| -void main() {
|
| - test('int', () {
|
| - expect(isGroundType(int), isTrue);
|
| - expect(isGroundType(5.runtimeType), isTrue);
|
| -
|
| - checkType(5, int);
|
| - checkType(5, dynamic);
|
| - checkType(5, Object);
|
| - checkType(5, num);
|
| -
|
| - checkType(5, bool, false);
|
| - checkType(5, String, false);
|
| -
|
| - expect(cast(5, int), equals(5));
|
| - if (intIsNonNullable) {
|
| - expect(() => cast(null, int), throws);
|
| - } else {
|
| - expect(cast(null, int), equals(null));
|
| - }
|
| - });
|
| -
|
| - test('dynamic', () {
|
| - expect(isGroundType(dynamic), isTrue);
|
| - checkType(new Object(), dynamic);
|
| - checkType(null, dynamic);
|
| -
|
| - expect(cast(null, dynamic), equals(null));
|
| - });
|
| -
|
| - test('Object', () {
|
| - expect(isGroundType(Object), isTrue);
|
| - checkType(new Object(), dynamic);
|
| - checkType(null, Object);
|
| -
|
| - expect(cast(null, Object), equals(null));
|
| - });
|
| -
|
| - test('String', () {
|
| - expect(isGroundType(String), isTrue);
|
| - expect(isGroundType("foo".runtimeType), isTrue);
|
| - checkType("foo", String);
|
| - checkType("foo", Object);
|
| - checkType("foo", dynamic);
|
| -
|
| - expect(cast(null, String), equals(null));
|
| - });
|
| -
|
| - test('Map', () {
|
| - final m1 = new Map<String, String>();
|
| - final m2 = new Map<Object, Object>();
|
| - final m3 = new Map();
|
| - final m4 = new HashMap<dynamic, dynamic>();
|
| - final m5 = new LinkedHashMap();
|
| -
|
| - expect(isGroundType(Map), isTrue);
|
| - expect(isGroundType(m1.runtimeType), isFalse);
|
| - expect(isGroundType(type((Map<String, String> _) {})), isFalse);
|
| - expect(isGroundType(m2.runtimeType), isTrue);
|
| - expect(isGroundType(type((Map<Object, Object> _) {})), isTrue);
|
| - expect(isGroundType(m3.runtimeType), isTrue);
|
| - expect(isGroundType(type((Map _) {})), isTrue);
|
| - expect(isGroundType(m4.runtimeType), isTrue);
|
| - expect(isGroundType(type((HashMap<dynamic, dynamic> _) {})), isTrue);
|
| - expect(isGroundType(m5.runtimeType), isTrue);
|
| - expect(isGroundType(type((LinkedHashMap _) {})), isTrue);
|
| - expect(isGroundType(LinkedHashMap), isTrue);
|
| -
|
| - // Map<T1,T2> <: Map
|
| - checkType(m1, Map);
|
| - checkType(m1, Object);
|
| -
|
| - // Instance of self
|
| - checkType(m1, m1.runtimeType);
|
| - checkType(m1, type((Map<String, String> _) {}));
|
| -
|
| - // Object == dynamic == top as a type parameter
|
| - checkType(m2, m3.runtimeType);
|
| - checkType(m2, Map);
|
| - checkType(m3, m2.runtimeType);
|
| - checkType(m3, type((Map<Object, Object> _) {}));
|
| -
|
| - // Covariance on generics
|
| - checkType(m1, m2.runtimeType);
|
| - checkType(m1, type((Map<Object, Object> _) {}));
|
| -
|
| - // No contravariance on generics.
|
| - checkType(m2, m1.runtimeType, false);
|
| - checkType(m2, type((Map<String, String> _) {}), false);
|
| -
|
| - // null is! Map
|
| - checkType(null, Map, false);
|
| -
|
| - // Raw generic types
|
| - checkType(m5, Map);
|
| - checkType(m5, type((Map<Object, Object> _) {}));
|
| - checkType(m4, Map);
|
| - checkType(m4, type((Map<Object, Object> _) {}));
|
| -
|
| - // Mixin: the actual implementation class should implement MapMixin
|
| - checkType(m1, MapMixin);
|
| - checkType(m1, type((MapMixin<String, String> _) {}));
|
| - checkType(m1, type((MapMixin<Object, Object> _) {}));
|
| - checkType(m5, MapMixin);
|
| - checkType(m5, type((MapMixin<String, String> _) {}), false);
|
| - checkType(m5, type((MapMixin<Object, Object> _) {}));
|
| - });
|
| -
|
| - test('generic and inheritance', () {
|
| - AA aaraw = new AA();
|
| - final aarawtype = aaraw.runtimeType;
|
| - AA<dynamic, dynamic> aadynamic = new AA<dynamic, dynamic>();
|
| - final aadynamictype = aadynamic.runtimeType;
|
| - AA<String, List> aa = new AA<String, List>();
|
| - final aatype = aa.runtimeType;
|
| - BB<String, List> bb = new BB<String, List>();
|
| - final bbtype = bb.runtimeType;
|
| - CC cc = new CC();
|
| - final cctype = cc.runtimeType;
|
| - AA<String> aabad = new AA<String>();
|
| - final aabadtype = aabad.runtimeType;
|
| -
|
| - expect(isGroundType(aatype), isFalse);
|
| - expect(isGroundType(type((AA<String, List> _) {})), isFalse);
|
| - expect(isGroundType(bbtype), isFalse);
|
| - expect(isGroundType(type((BB<String, List> _) {})), isFalse);
|
| - expect(isGroundType(cctype), isTrue);
|
| - expect(isGroundType(CC), isTrue);
|
| - checkType(cc, aatype, false);
|
| - checkType(cc, type((AA<String, List> _) {}), false);
|
| - checkType(cc, bbtype);
|
| - checkType(cc, type((BB<String, List> _) {}));
|
| - checkType(aa, cctype, false);
|
| - checkType(aa, CC, false);
|
| - checkType(aa, bbtype, false);
|
| - checkType(aa, type((BB<String, List> _) {}), false);
|
| - checkType(bb, cctype, false);
|
| - checkType(bb, CC, false);
|
| - checkType(aa, aabadtype);
|
| - checkType(aa, type((AA<String> _) {}));
|
| - checkType(aabad, aatype, false);
|
| - checkType(aabad, type((AA<String, List> _) {}), false);
|
| - checkType(aabad, aarawtype);
|
| - checkType(aabad, AA);
|
| - checkType(aaraw, aabadtype);
|
| - checkType(aaraw, type((AA<String> _) {}));
|
| - checkType(aaraw, aadynamictype);
|
| - checkType(aaraw, type((AA<dynamic, dynamic> _) {}));
|
| - checkType(aadynamic, aarawtype);
|
| - checkType(aadynamic, AA);
|
| - });
|
| -
|
| - test('Functions', () {
|
| - // - return type: Dart is bivariant. We're covariant.
|
| - // - param types: Dart is bivariant. We're contravariant.
|
| - expect(isGroundType(Func2), isTrue);
|
| - expect(isGroundType(Foo), isFalse);
|
| - expect(isGroundType(type((B _(B _1, String _2)) {})), isFalse);
|
| - checkType(bar1, Foo, false);
|
| - checkType(bar1, type((B _(B _1, String _2)) {}), false);
|
| - checkType(bar2, Foo, false);
|
| - checkType(bar2, type((B _(B _1, String _2)) {}), false);
|
| - checkType(bar3, Foo);
|
| - checkType(bar3, type((B _(B _1, String _2)) {}));
|
| - checkType(bar4, Foo, false);
|
| - // TODO(vsm): Revisit. bar4 is (B, *) -> B. Perhaps it should be treated as top for a reified object.
|
| - checkType(bar4, type((B _(B _1, String _2)) {}), false);
|
| - checkType(bar5, Foo);
|
| - checkType(bar5, type((B _(B _1, String _2)) {}));
|
| - checkType(bar6, Foo, false);
|
| - checkType(bar6, type((B _(B _1, String _2)) {}), false);
|
| - checkType(bar7, Foo);
|
| - checkType(bar7, type((B _(B _1, String _2)) {}));
|
| - checkType(bar7, bar6.runtimeType);
|
| - checkType(bar8, Foo);
|
| - checkType(bar8, type((B _(B _1, String _2)) {}));
|
| - checkType(bar8, bar6.runtimeType, false);
|
| - checkType(bar7, bar8.runtimeType, false);
|
| - checkType(bar8, bar7.runtimeType, false);
|
| - });
|
| -
|
| - test('void', () {
|
| - checkType((x) => x, type((void _(x)) {}));
|
| - });
|
| -
|
| - test('null', () {
|
| - checkType(null, Object);
|
| - checkType(null, Null);
|
| - checkType(null, dynamic);
|
| - checkType(null, int, false);
|
| - checkType(null, String, false);
|
| - checkType(null, Map, false);
|
| -
|
| - expect(cast(null, Object), equals(null));
|
| - expect(cast(null, String), equals(null));
|
| - expect(cast(null, Map), equals(null));
|
| - });
|
| -
|
| - test('Function objects', () {
|
| - // Bar has a call method - it emulates the corresponding function.
|
| - var bar = new Bar();
|
| - checkType(bar, Bar);
|
| - checkType(bar, Function);
|
| - checkType(bar, Foo);
|
| - checkType(bar, type((B _(B _1, String _2)) {}));
|
| - checkType(bar, type((B _(String _1, String _2)) {}), false);
|
| -
|
| - // Baz has a call getter that is a closure - this does not make it a
|
| - // function.
|
| - var baz = new Baz();
|
| - checkType(baz, Function, false);
|
| - checkType(baz, Foo, false);
|
| - });
|
| -
|
| - test('arity', () {
|
| - checkArity(bar1, 2, 2);
|
| - checkArity(bar4, 2, 2);
|
| - checkArity(bar6, 3, 3);
|
| - checkArity(bar7, 2, 3);
|
| - checkArity(bar8, 2, 2);
|
| - checkArity(() {}, 0, 0);
|
| - checkArity((a, [b]) {}, 1, 2);
|
| - });
|
| -
|
| - test('type variable', () {
|
| - var stringChecker = new Checker<String>();
|
| - stringChecker.isGround(true);
|
| - stringChecker.isGroundList(false);
|
| -
|
| - stringChecker.check(5, false);
|
| - stringChecker.check("hello", true);
|
| - stringChecker.check(null, false);
|
| -
|
| - var objectChecker = new Checker<Object>();
|
| - objectChecker.isGround(true);
|
| - objectChecker.isGroundList(true);
|
| -
|
| - objectChecker.check(5, true);
|
| - objectChecker.check("hello", true);
|
| - objectChecker.check(null, true);
|
| - });
|
| -}
|
|
|