| Index: pkg/kernel/test/type_unification_test.dart
|
| diff --git a/pkg/kernel/test/type_unification_test.dart b/pkg/kernel/test/type_unification_test.dart
|
| deleted file mode 100644
|
| index ed75d269930c87f0e2234ba0fd3624abb8c70e01..0000000000000000000000000000000000000000
|
| --- a/pkg/kernel/test/type_unification_test.dart
|
| +++ /dev/null
|
| @@ -1,138 +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:kernel/type_algebra.dart';
|
| -import 'package:test/test.dart';
|
| -import 'type_parser.dart';
|
| -import 'dart:io';
|
| -
|
| -final List<TestCase> testCases = <TestCase>[
|
| - successCase('List<T>', 'List<String>', {'T': 'String'}),
|
| - successCase('List<String>', 'List<T>', {'T': 'String'}),
|
| - successCase('List<T>', 'List<T>', {'T': null}),
|
| - successCase('List<S>', 'List<T>', {'S': 'T'}),
|
| - successCase('List<S>', 'List<T>', {'T': 'S'}),
|
| - successCase(
|
| - 'List<S>', 'List<T>', {'S': 'T', 'T': null}), // Require left bias.
|
| - failureCase('List<S>', 'List<T>', []),
|
| -
|
| - failureCase('List<T>', 'T', ['T']),
|
| - failureCase('List<List<T>>', 'List<T>', ['T']),
|
| - failureCase('Map<S, T>', 'Map<List<T>, List<S>>', ['T', 'S']),
|
| -
|
| - failureCase('Map<Map<S,String>, Map<int,S>>',
|
| - 'Map<Map<int, S>, Map<S, String>>', ['S']),
|
| - successCase('Map<Map<S, int>, Map<int, S>>', 'Map<Map<int, S>, Map<S, int>>',
|
| - {'S': 'int'}),
|
| - successCase('Map<Map<S, String>, Map<int, T>>',
|
| - 'Map<Map<int, T>, Map<S, String>>', {'S': 'int', 'T': 'String'}),
|
| -
|
| - successCase('Map<S, List<T>>', 'Map<T, List<S>>', {'S': 'T'}),
|
| - successCase('Map<S, T>', 'Map<S, List<S>>', {'T': 'List<S>'}),
|
| - successCase('Map<S, T>', 'Map<S, List<S>>', {'T': 'List<S>', 'S': null}),
|
| - successCase('Map<List<S>, T>', 'Map<T, List<S>>', {'T': 'List<S>'}),
|
| - successCase(
|
| - 'Map<List<S>, T>', 'Map<T, List<S>>', {'T': 'List<S>', 'S': null}),
|
| -
|
| - successCase('<E>(E) => E', '<T>(T) => T', {}),
|
| - successCase('<E>(E, S) => E', '<T>(T, int) => T', {'S': 'int'}),
|
| - failureCase('<E>(E, S) => E', '<T>(T, T) => T', ['S']),
|
| - successCase(
|
| - '<E>(E) => <T>(T) => Map<E,T>', '<E>(E) => <T>(T) => Map<E,T>', {}),
|
| - successCase('<E>(E,_) => E', '<T>(T,_) => T', {}),
|
| -
|
| - successCase('(x:int,y:String) => int', '(y:String,x:int) => int', {}),
|
| - successCase('<S,T>(x:S,y:T) => S', '<S,T>(y:T,x:S) => S', {}),
|
| - successCase('(x:<T>(T)=>T,y:<S>(S)=>S) => int', '(y:<S>(S)=>S,x:<T>(T)=>T) => int', {}),
|
| - successCase('(x:<T>(T)=>T,y:<S>(S,S,S)=>S) => int', '(y:<S>(S,S,S)=>S,x:<T>(T)=>T) => int', {}),
|
| -];
|
| -
|
| -class TestCase {
|
| - String type1;
|
| - String type2;
|
| - Iterable<String> quantifiedVariables;
|
| - Map<String, String> expectedSubstitution; // Null if unification should fail.
|
| -
|
| - TestCase.success(this.type1, this.type2, this.expectedSubstitution) {
|
| - quantifiedVariables = expectedSubstitution.keys;
|
| - }
|
| -
|
| - TestCase.fail(this.type1, this.type2, this.quantifiedVariables);
|
| -
|
| - bool get shouldSucceed => expectedSubstitution != null;
|
| -
|
| - String toString() => '∃ ${quantifiedVariables.join(',')}. $type1 = $type2';
|
| -}
|
| -
|
| -TestCase successCase(String type1, String type2, Map<String, String> expected,
|
| - {bool debug: false}) {
|
| - return new TestCase.success(type1, type2, expected);
|
| -}
|
| -
|
| -TestCase failureCase(
|
| - String type1, String type2, List<String> quantifiedVariables,
|
| - {bool debug: false}) {
|
| - return new TestCase.fail(type1, type2, quantifiedVariables);
|
| -}
|
| -
|
| -int numFailures = 0;
|
| -
|
| -void reportFailure(TestCase testCase, String message) {
|
| - ++numFailures;
|
| - fail('$message in `$testCase`');
|
| -}
|
| -
|
| -main() {
|
| - for (TestCase testCase in testCases) {
|
| - test('$testCase', () {
|
| - var env = new LazyTypeEnvironment();
|
| - var type1 = env.parse(testCase.type1);
|
| - var type2 = env.parse(testCase.type2);
|
| - var quantifiedVariables =
|
| - testCase.quantifiedVariables.map(env.getTypeParameter).toSet();
|
| - var substitution = unifyTypes(type1, type2, quantifiedVariables);
|
| - if (testCase.shouldSucceed) {
|
| - if (substitution == null) {
|
| - reportFailure(testCase, 'Unification failed');
|
| - } else {
|
| - for (var key in testCase.expectedSubstitution.keys) {
|
| - var typeParameter = env.getTypeParameter(key);
|
| - if (testCase.expectedSubstitution[key] == null) {
|
| - if (substitution.containsKey(key)) {
|
| - var actualType = substitution[typeParameter];
|
| - reportFailure(
|
| - testCase,
|
| - 'Incorrect substitution '
|
| - '`$key = $actualType` should be unbound');
|
| - }
|
| - } else {
|
| - var expectedType = env.parse(testCase.expectedSubstitution[key]);
|
| - var actualType = substitution[typeParameter];
|
| - if (actualType != expectedType) {
|
| - reportFailure(
|
| - testCase,
|
| - 'Incorrect substitution '
|
| - '`$key = $actualType` should be `$key = $expectedType`');
|
| - }
|
| - }
|
| - }
|
| - var boundTypeVariables = testCase.expectedSubstitution.keys
|
| - .where((name) => testCase.expectedSubstitution[name] != null);
|
| - if (substitution.length != boundTypeVariables.length) {
|
| - reportFailure(
|
| - testCase,
|
| - 'Substituted `${substitution.keys.join(',')}` '
|
| - 'but should only substitute `${boundTypeVariables.join(',')}`');
|
| - }
|
| - }
|
| - } else {
|
| - if (substitution != null) {
|
| - reportFailure(testCase, 'Unification was supposed to fail');
|
| - }
|
| - }
|
| - });
|
| - }
|
| - if (numFailures > 0) {
|
| - exit(1);
|
| - }
|
| -}
|
|
|