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

const Map<String, String> data = {
  'dynamic': 'dynamic',
  'void': 'void',
  'Null': 'Never',
  'Never': 'Never',
  'Never?': 'Never',
  'Never*': 'Never',
  'Object': 'Object',
  'Object?': 'Object',
  'Object*': 'Object',
  'List<Object>': 'List<Object>',
  'List<Object>?': 'List<Object>',
  'List<Object>*': 'List<Object>',
  'List<Object?>': 'List<Object?>',
  'List<Object?>?': 'List<Object?>',
  'List<Object?>*': 'List<Object?>',
  'List<Object*>': 'List<Object*>',
  'List<Object*>?': 'List<Object*>',
  'List<Object*>*': 'List<Object*>',
  'FutureOr<Null>': 'FutureOr<Never>',
  'FutureOr<dynamic>': 'FutureOr<dynamic>',
  'FutureOr<Object>': 'FutureOr<Object>',
  'FutureOr<Object>?': 'FutureOr<Object>',
  'FutureOr<Object>*': 'FutureOr<Object>',
  'FutureOr<Object?>': 'FutureOr<Object>',
  'FutureOr<Object?>?': 'FutureOr<Object>',
  'FutureOr<Object?>*': 'FutureOr<Object>',
  'FutureOr<Object*>': 'FutureOr<Object>',
  'FutureOr<Object*>?': 'FutureOr<Object>',
  'FutureOr<Object*>*': 'FutureOr<Object>',
  'FutureOr<FutureOr<Object?>>': 'FutureOr<FutureOr<Object>>',
  '(List<Object>, {required List<Object> a, List<Object> b}) -> List<Object>':
      '(List<Object>, {required List<Object> a, List<Object> b}) -> List<Object>',
  '(List<Object>, {required List<Object> a, List<Object> b}) ->? List<Object>':
      '(List<Object>, {required List<Object> a, List<Object> b}) -> List<Object>',
  '(List<Object>, {required List<Object> a, List<Object> b}) ->* List<Object>':
      '(List<Object>, {required List<Object> a, List<Object> b}) -> List<Object>',
  '(List<Object>?, {required List<Object?> a, List<Object?>? b}) ->? List<Object?>':
      '(List<Object>?, {required List<Object?> a, List<Object?>? b}) -> List<Object?>',
  'X': 'X & Object',
  'X?': 'X & Object',
  'X*': 'X & Object',
  'X_extends_Object': 'X_extends_Object',
  'X_extends_Object?': 'X_extends_Object',
  'X_extends_Object*': 'X_extends_Object',
  'X_extends_dynamic': 'X_extends_dynamic',
  'X_extends_dynamic?': 'X_extends_dynamic',
  'X_extends_dynamic*': 'X_extends_dynamic',
  'X & Object?': 'X & Object',
  'X & dynamic': 'X & dynamic',
  'X & Object': 'X & Object',
  'X? & Object?': 'X & Object',
  'X? & dynamic': 'X & dynamic',
  'X? & Object': 'X & Object',
  'Y': 'Y & X & Object',
  'Y?': 'Y & X & Object',
  'Y_extends_dynamic': 'Y_extends_dynamic',
  'Y_extends_dynamic?': 'Y_extends_dynamic',
  'Y_extends_dynamic*': 'Y_extends_dynamic',
  'Y_extends_dynamic & X': 'Y_extends_dynamic & X & Object',
  'Y_extends_dynamic & X_extends_dynamic?':
      'Y_extends_dynamic & X_extends_dynamic',
};

main() {
  Env env = new Env('')
    ..extendWithTypeParameters('X,'
        'X_extends_Object extends Object,'
        'X_extends_dynamic extends dynamic,'
        'Y extends X,'
        'Y_extends_dynamic extends X_extends_dynamic');
  data.forEach((String input, String output) {
    DartType inputType = env.parseType(input);
    DartType expectedOutputType = env.parseType(output);
    DartType actualOutputType = computeNonNull(env.coreTypes, inputType);
    print('legacyErasure($inputType) = $actualOutputType: $expectedOutputType');
    Expect.equals(
        expectedOutputType,
        actualOutputType,
        "Unexpected NonNull of $inputType ('$input'):\n"
        "Expected: ${expectedOutputType} ('$output')\n"
        "Actual: ${actualOutputType}");
  });
}
