// Copyright (c) 2019, 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. // @dart = 2.9 import "package:expect/expect.dart" show Expect; import 'package:kernel/ast.dart'; import 'package:kernel/class_hierarchy.dart'; import 'package:kernel/testing/type_parser_environment.dart'; import 'package:kernel/type_environment.dart'; const Set data = { const Test('Null', 'Null'), const Test('Never?', 'Never?'), const Test('void', 'void'), const Test('dynamic', 'dynamic'), const Test('bool', 'bool'), const Test('bool?', 'bool?'), const Test('bool*', 'bool*'), const Test('List', 'List'), const Test('List?', 'List?'), const Test('List*', 'List*'), const Test('FutureOr', 'bool'), const Test('FutureOr?', 'bool?'), const Test('FutureOr*', 'bool*'), const Test('FutureOr*', 'bool?'), const Test('FutureOr?', 'bool?'), const Test('FutureOr?', 'bool?'), const Test('FutureOr', 'Null'), const Test('FutureOr?', 'Null'), const Test('FutureOr*', 'Null'), const Test('Future', 'bool'), const Test('Future?', 'bool?'), const Test('Future*', 'bool*'), const Test('Future', 'bool?'), const Test('Future', 'bool*'), const Test('() ->* bool*', '() ->* bool*'), const Test('() -> bool*', '() -> bool*'), const Test('() ->? bool*', '() ->? bool*'), const Test('() ->* bool', '() ->* bool'), const Test('() ->? bool', '() ->? bool'), const Test('() -> bool', '() -> bool'), const Test('T', 'T', 'T'), const Test('T?', 'T?', 'T'), const Test('T*', 'T*', 'T'), const Test('T', 'T', 'T extends bool'), const Test('T?', 'T?', 'T extends bool'), const Test('T*', 'T*', 'T extends bool'), const Test('T', 'T', 'T extends FutureOr'), const Test('T?', 'T?', 'T extends FutureOr'), const Test('T*', 'T*', 'T extends FutureOr'), const Test('T', 'bool', 'T extends Future'), const Test('T?', 'bool?', 'T extends Future'), const Test('T*', 'bool*', 'T extends Future'), const Test('T & bool', 'T & bool', 'T'), const Test('T & bool?', 'T & bool?', 'T'), const Test('T & bool*', 'T & bool*', 'T'), }; class Test { final String input; final String output; final String typeParameters; const Test(this.input, this.output, [this.typeParameters]); } main() { Env env = new Env('', isNonNullableByDefault: true); ClassHierarchy classHierarchy = new ClassHierarchy(env.component, env.coreTypes); TypeEnvironment typeEnvironment = new TypeEnvironment(env.coreTypes, classHierarchy); data.forEach((Test test) { env.withTypeParameters(test.typeParameters, (List typeParameterNodes) { String input = test.input; String output = test.output; DartType inputType = env.parseType(input); DartType expectedOutputType = env.parseType(output); DartType actualOutputType = typeEnvironment.flatten(inputType); print('flatten($inputType) ' '${test.typeParameters != null ? 'with ${test.typeParameters} ' : ''}' '= $actualOutputType, expected $expectedOutputType'); Expect.equals( expectedOutputType, actualOutputType, "Unexpected flatten of $inputType ('$input'):\n" "Expected: ${expectedOutputType} ('$output')\n" "Actual: ${actualOutputType}"); }); }); }