// Copyright (c) 2018, 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:async_helper/async_helper.dart';
import '../helpers/d8_helper.dart';
import 'package:compiler/src/util/memory_compiler.dart';

const String SOURCE1 = r'''
import 'package:expect/expect.dart';

class A {}
class B {}

method1<T extends A>() {}

class C {
  method2<T, S extends T>() {}
}

main() {
  bool printError(e) {
     print(e); return true;
  }

  method3<T extends B>() {}

  dynamic m1 = method1;
  dynamic m2 = C().method2;
  dynamic m3 = method3;

  m1<A>();
  Expect.throws(() => m1<B>(), printError);
  m2<A, A>();
  Expect.throws(() => m2<B, A>(), printError);
  m3<B>();
  Expect.throws(() => m3<A>(), printError);
}

''';

const String OUTPUT1 = r'''
TypeError: The type argument 'B' is not a subtype of the type variable bound 'A' of type variable 'T' in 'method1'.
TypeError: The type argument 'A' is not a subtype of the type variable bound 'B' of type variable 'S' in 'method2'.
TypeError: The type argument 'A' is not a subtype of the type variable bound 'B' of type variable 'T' in 'call'.
''';

main(List<String> args) {
  asyncTest(() async {
    await runWithD8(
        memorySourceFiles: {'main.dart': SOURCE1},
        expectedOutput: OUTPUT1,
        printJs: args.contains('-v'),
        options: ['--libraries-spec=$sdkLibrariesSpecificationUri']);
  });
}
