// 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/src/future_value_type.dart';
import 'package:kernel/testing/type_parser_environment.dart';

const Map<String, String> data = {
  'Null': 'Object?',
  'Never': 'Object?',
  'Never?': 'Object?',
  'void': 'void',
  'dynamic': 'dynamic',
  'bool': 'Object?',
  'bool?': 'Object?',
  'bool*': 'Object?',
  'List<bool>': 'Object?',
  '() -> void': 'Object?',
  '<T>(T) -> void': 'Object?',
  'X': 'Object?',
  'X_extends_FutureInt': 'Object?',
  'X_extends_FutureOrInt': 'Object?',
  'Future<dynamic>': 'dynamic',
  'Future<dynamic>?': 'dynamic',
  'Future<dynamic>*': 'dynamic',
  'Future<Object>': 'Object',
  'Future<Object>?': 'Object',
  'Future<Object>*': 'Object',
  'Future<int?>': 'int?',
  'Future<int?>?': 'int?',
  'Future<int?>*': 'int?',
  'Future<Future<int>?>': 'Future<int>?',
  'Future<Future<int>?>?': 'Future<int>?',
  'Future<Future<int>?>*': 'Future<int>?',
  'Future<FutureOr<int>?>': 'FutureOr<int>?',
  'Future<FutureOr<int>?>?': 'FutureOr<int>?',
  'Future<FutureOr<int>?>*': 'FutureOr<int>?',
  'Future<Null>': 'Null',
  'Future<Null>?': 'Null',
  'Future<Null>*': 'Null',
  'Future<void>': 'void',
  'Future<void>?': 'void',
  'Future<void>*': 'void',
  'FutureOr<dynamic>': 'dynamic',
  'FutureOr<dynamic>?': 'dynamic',
  'FutureOr<dynamic>*': 'dynamic',
  'FutureOr<Object>': 'Object',
  'FutureOr<Object>?': 'Object',
  'FutureOr<Object>*': 'Object',
  'FutureOr<int?>': 'int?',
  'FutureOr<int?>?': 'int?',
  'FutureOr<int?>*': 'int?',
  'FutureOr<Future<int>?>': 'Future<int>?',
  'FutureOr<Future<int>?>?': 'Future<int>?',
  'FutureOr<Future<int>?>*': 'Future<int>?',
  'FutureOr<FutureOr<int>?>': 'FutureOr<int>?',
  'FutureOr<FutureOr<int>?>?': 'FutureOr<int>?',
  'FutureOr<FutureOr<int>?>*': 'FutureOr<int>?',
  'FutureOr<Null>': 'Null',
  'FutureOr<Null>?': 'Null',
  'FutureOr<Null>*': 'Null',
  'FutureOr<void>': 'void',
  'FutureOr<void>?': 'void',
  'FutureOr<void>*': 'void',
};

main() {
  Env env = new Env('', isNonNullableByDefault: true)
    ..extendWithTypeParameters('X,'
        'X_extends_FutureInt extends Future<int>,'
        'X_extends_FutureOrInt extends FutureOr<int>');
  data.forEach((String input, String output) {
    DartType inputType = env.parseType(input);
    DartType expectedOutputType = env.parseType(output);
    DartType actualOutputType =
        computeFutureValueType(env.coreTypes, inputType);
    print(
        'futureValueType($inputType) = $actualOutputType: $expectedOutputType');
    Expect.equals(
        expectedOutputType,
        actualOutputType,
        "Unexpected future value type of $inputType ('$input'):\n"
        "Expected: ${expectedOutputType} ('$output')\n"
        "Actual: ${actualOutputType}");
  });
}
