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

// @dart = 2.9

library kernel.type_substitute_bounds_test;

import 'package:kernel/kernel.dart';
import 'package:kernel/type_algebra.dart';
import 'package:test/test.dart';
import 'type_parser.dart';

final List<TestCase> testCases = <TestCase>[
  testCase('T', {'T': bound('_', 'String')}, 'String'),
  testCase('List<T>', {'T': bound('_', 'String')}, 'List<String>'),
  testCase('List<List<T>>', {'T': bound('_', 'String')}, 'List<List<String>>'),
  testCase('(T) => T', {'T': bound('_', 'String')}, '(_) => String'),
  testCase('<G>(G,T) => T', {'T': bound('_', 'String')}, '<G>(G,_) => String'),
  testCase(
      '<G>(G,x:T) => T', {'T': bound('_', 'String')}, '<G>(G,x:_) => String'),
  testCase('<G:T>(G) => G', {'T': bound('_', 'String')}, '<G:_>(G) => G'),
  testCase('<G:T>(G) => G', {'T': bound('int', 'num')}, '<G:int>(G) => G'),
  testCase('<G>(T,G) => void', {'T': bound('_', 'String')}, '<G>(_,G) => void'),
  testCase('(T) => void', {'T': bound('_', 'String')}, '(_) => void'),
  testCase('(int) => T', {'T': bound('_', 'String')}, '(int) => String'),
  testCase('(int) => int', {'T': bound('_', 'String')}, '(int) => int'),
  testCase('((T) => int) => int', {'T': bound('_', 'String')},
      '((String) => int) => int'),
  testCase('<E>(<F>(T) => int) => int', {'T': bound('_', 'String')},
      '<E>(<F>(String) => int) => int'),
  testCase('(<F>(T) => int) => int', {'T': bound('_', 'String')},
      '(<F>(String) => int) => int'),
  testCase('<E>((T) => int) => int', {'T': bound('_', 'String')},
      '<E>((String) => int) => int'),
  testCase('(T?) =>* String', {'T': bound('int', 'int')}, '(int?) =>* String'),
];

class TestCase {
  final String type;
  final Map<String, TypeBound> bounds;
  final String expected;

  TestCase(this.type, this.bounds, this.expected);

  String toString() {
    var substitution = bounds.keys.map((key) {
      var bound = bounds[key];
      return '${bound.lower} <: $key <: ${bound.upper}';
    }).join(',');
    return '$type [$substitution] <: $expected';
  }
}

class TypeBound {
  final String lower, upper;

  TypeBound(this.lower, this.upper);
}

TypeBound bound(String lower, String upper) => new TypeBound(lower, upper);

TestCase testCase(String type, Map<String, TypeBound> bounds, String expected) {
  return new TestCase(type, bounds, expected);
}

main() {
  for (var testCase in testCases) {
    test('$testCase', () {
      var environment = new LazyTypeEnvironment();
      var type = environment.parse(testCase.type);
      var upperBounds = <TypeParameter, DartType>{};
      var lowerBounds = <TypeParameter, DartType>{};
      testCase.bounds.forEach((String name, TypeBound bounds) {
        var parameter = environment.getTypeParameter(name);
        upperBounds[parameter] = environment.parse(bounds.upper);
        lowerBounds[parameter] = environment.parse(bounds.lower);
      });
      var substituted =
          Substitution.fromUpperAndLowerBounds(upperBounds, lowerBounds)
              .substituteType(type);
      var expected = environment.parse(testCase.expected);
      if (substituted != expected) {
        fail('Expected `$expected` but got `$substituted`');
      }
    });
  }
}
