// 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.

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<Test> 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<bool>', 'List<bool>'),
  const Test('List<bool>?', 'List<bool>?'),
  const Test('List<bool>*', 'List<bool>*'),
  const Test('FutureOr<bool>', 'bool'),
  const Test('FutureOr<bool>?', 'bool?'),
  const Test('FutureOr<bool>*', 'bool*'),
  const Test('FutureOr<bool?>*', 'bool?'),
  const Test('FutureOr<bool?>?', 'bool?'),
  const Test('FutureOr<bool*>?', 'bool?'),
  const Test('FutureOr<Null>', 'Null'),
  const Test('FutureOr<Null>?', 'Null'),
  const Test('FutureOr<Null>*', 'Null'),
  const Test('Future<bool>', 'bool'),
  const Test('Future<bool>?', 'bool?'),
  const Test('Future<bool>*', 'bool*'),
  const Test('Future<bool?>', 'bool?'),
  const Test('Future<bool*>', '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<bool>'),
  const Test('T?', 'T?', 'T extends FutureOr<bool>'),
  const Test('T*', 'T*', 'T extends FutureOr<bool>'),
  const Test('T', 'bool', 'T extends Future<bool>'),
  const Test('T?', 'bool?', 'T extends Future<bool>'),
  const Test('T*', 'bool*', 'T extends Future<bool>'),
  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<TypeParameter> 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}");
    });
  });
}
