| Index: pkg/kernel/test/type_subtype_test.dart
|
| diff --git a/pkg/kernel/test/type_subtype_test.dart b/pkg/kernel/test/type_subtype_test.dart
|
| deleted file mode 100644
|
| index 56b23398f8e032395ed7fb5c52a2fc3b3b5fbeed..0000000000000000000000000000000000000000
|
| --- a/pkg/kernel/test/type_subtype_test.dart
|
| +++ /dev/null
|
| @@ -1,162 +0,0 @@
|
| -// Copyright (c) 2016, 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:test/test.dart';
|
| -import 'package:kernel/ast.dart';
|
| -import 'package:kernel/class_hierarchy.dart';
|
| -import 'package:kernel/type_environment.dart';
|
| -import 'type_parser.dart';
|
| -
|
| -/// Description of a small class hierarchy for use in subtype tests.
|
| -var classEnvironment = <String, List<String>>{
|
| - 'Comparable<T>': ['Object'],
|
| - 'num': ['Object', 'Comparable<num>'],
|
| - 'int': ['num'],
|
| - 'double': ['num'],
|
| - 'Iterable<T>': ['Object'],
|
| - 'List<T>': ['Iterable<T>'],
|
| -};
|
| -
|
| -List<TestCase> testCases = <TestCase>[
|
| - subtype('int', 'num'),
|
| - subtype('int', 'Comparable<num>'),
|
| - subtype('int', 'Comparable<Object>'),
|
| - subtype('int', 'Object'),
|
| - subtype('double', 'num'),
|
| -
|
| - notSubtype('int', 'double'),
|
| - notSubtype('int', 'Comparable<int>'),
|
| - notSubtype('int', 'Iterable<int>'),
|
| - notSubtype('Comparable<int>', 'Iterable<int>'),
|
| -
|
| - subtype('List<int>', 'List<int>'),
|
| - subtype('List<int>', 'Iterable<int>'),
|
| - subtype('List<int>', 'List<num>'),
|
| - subtype('List<int>', 'Iterable<num>'),
|
| - subtype('List<int>', 'List<Object>'),
|
| - subtype('List<int>', 'Iterable<Object>'),
|
| - subtype('List<int>', 'Object'),
|
| - subtype('List<int>', 'List<Comparable<Object>>'),
|
| - subtype('List<int>', 'List<Comparable<num>>'),
|
| - subtype('List<int>', 'List<Comparable<Comparable<num>>>'),
|
| -
|
| - notSubtype('List<int>', 'List<double>'),
|
| - notSubtype('List<int>', 'Iterable<double>'),
|
| - notSubtype('List<int>', 'Comparable<int>'),
|
| - notSubtype('List<int>', 'List<Comparable<int>>'),
|
| - notSubtype('List<int>', 'List<Comparable<Comparable<int>>>'),
|
| -
|
| - subtype('(num) => num', '(int) => num'),
|
| - subtype('(num) => int', '(num) => num'),
|
| - subtype('(num) => int', '(int) => num'),
|
| - notSubtype('(int) => int', '(num) => num'),
|
| -
|
| - subtype('(num) => (num) => num', '(num) => (int) => num'),
|
| - notSubtype('(num) => (int) => int', '(num) => (num) => num'),
|
| -
|
| - subtype('(x:num) => num', '(x:int) => num'), // named parameters
|
| - subtype('(num,x:num) => num', '(int,x:int) => num'),
|
| - subtype('(x:num) => int', '(x:num) => num'),
|
| - notSubtype('(x:int) => int', '(x:num) => num'),
|
| -
|
| - subtype('<E>(E) => int', '<E>(E) => num'), // type parameters
|
| - subtype('<E>(num) => E', '<E>(int) => E'),
|
| - subtype('<E>(E,num) => E', '<E>(E,int) => E'),
|
| - notSubtype('<E>(E,num) => E', '<E>(E,E) => E'),
|
| -
|
| - subtype('<E>(E) => (E) => E', '<F>(F) => (F) => F'),
|
| - subtype('<E>(E, (int,E) => E) => E', '<E>(E, (int,E) => E) => E'),
|
| - subtype('<E>(E, (int,E) => E) => E', '<E>(E, (num,E) => E) => E'),
|
| - notSubtype('<E,F>(E) => (F) => E', '<E>(E) => <F>(F) => E'),
|
| - notSubtype('<E,F>(E) => (F) => E', '<F,E>(E) => (F) => E'),
|
| -
|
| - subtype('<E>(E,num) => E', '<E:num>(E,E) => E'),
|
| - subtype('<E:num>(E) => int', '<E:int>(E) => int'),
|
| - subtype('<E:num>(E) => E', '<E:int>(E) => E'),
|
| - subtype('<E:num>(int) => E', '<E:int>(int) => E'),
|
| - notSubtype('<E>(int) => int', '(int) => int'),
|
| - notSubtype('<E,F>(int) => int', '<E>(int) => int'),
|
| -
|
| - subtype('<E:List<E>>(E) => E', '<F:List<F>>(F) => F'),
|
| - subtype('<E:Iterable<E>>(E) => E', '<F:List<F>>(F) => F'),
|
| - subtype('<E>(E,List<Object>) => E', '<F:List<F>>(F,F) => F'),
|
| - notSubtype('<E>(E,List<Object>) => List<E>', '<F:List<F>>(F,F) => F'),
|
| - notSubtype('<E>(E,List<Object>) => int', '<F:List<F>>(F,F) => F'),
|
| - subtype('<E>(E,List<Object>) => E', '<F:List<F>>(F,F) => void'),
|
| -];
|
| -
|
| -/// Assert that [subtype] is a subtype of [supertype], and that [supertype]
|
| -/// is not a subtype of [subtype] (unless the two strings are equal).
|
| -TestCase subtype(String subtype_, String supertype) {
|
| - return new TestCase(subtype_, supertype, isSubtype: true);
|
| -}
|
| -
|
| -/// Assert that neither type is a subtype of the other.
|
| -TestCase notSubtype(String subtype_, String supertype) {
|
| - return new TestCase(subtype_, supertype, isSubtype: false);
|
| -}
|
| -
|
| -class TestCase {
|
| - String subtype;
|
| - String supertype;
|
| - bool isSubtype;
|
| - TestCase(this.subtype, this.supertype, {this.isSubtype});
|
| -
|
| - String toString() =>
|
| - isSubtype ? '$subtype <: $supertype' : '$subtype </: $supertype';
|
| -}
|
| -
|
| -class MockSubtypeTester extends SubtypeTester {
|
| - ClassHierarchy hierarchy;
|
| - InterfaceType objectType;
|
| - InterfaceType rawFunctionType;
|
| - LazyTypeEnvironment environment;
|
| -
|
| - MockSubtypeTester(
|
| - this.hierarchy, this.objectType, this.rawFunctionType, this.environment);
|
| -}
|
| -
|
| -MockSubtypeTester makeSubtypeTester(Map<String, List<String>> testcase) {
|
| - LazyTypeEnvironment environment = new LazyTypeEnvironment();
|
| - Class objectClass = environment.lookup('Object');
|
| - Class functionClass = environment.lookup('Function');
|
| - functionClass.supertype = objectClass.asRawSupertype;
|
| - for (var typeString in testcase.keys) {
|
| - InterfaceType type = environment.parseFresh(typeString);
|
| - Class class_ = type.classNode;
|
| - for (TypeParameterType typeArg in type.typeArguments) {
|
| - class_.typeParameters.add(typeArg.parameter);
|
| - }
|
| - for (var supertypeString in testcase[typeString]) {
|
| - if (class_.supertype == null) {
|
| - class_.supertype = environment.parseSuper(supertypeString);
|
| - } else {
|
| - class_.implementedTypes.add(environment.parseSuper(supertypeString));
|
| - }
|
| - }
|
| - }
|
| - var program = new Program([environment.dummyLibrary]);
|
| - var hierarchy = new ClassHierarchy(program);
|
| - return new MockSubtypeTester(
|
| - hierarchy, objectClass.rawType, functionClass.rawType, environment);
|
| -}
|
| -
|
| -main() {
|
| - var tester = makeSubtypeTester(classEnvironment);
|
| - var environment = tester.environment;
|
| - for (var testCase in testCases) {
|
| - test('$testCase', () {
|
| - var subtype = environment.parseFresh(testCase.subtype);
|
| - var supertype = environment.parseFresh(testCase.supertype);
|
| - if (tester.isSubtypeOf(subtype, supertype) != testCase.isSubtype) {
|
| - fail('isSubtypeOf(${testCase.subtype}, ${testCase.supertype}) returned '
|
| - '${!testCase.isSubtype} but should return ${testCase.isSubtype}');
|
| - }
|
| - if (subtype != supertype && tester.isSubtypeOf(supertype, subtype)) {
|
| - fail('isSubtypeOf(${testCase.supertype}, ${testCase.subtype}) returned '
|
| - 'true but should return false');
|
| - }
|
| - });
|
| - }
|
| -}
|
|
|