// 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.
//
// VMOptions=--generic-method-syntax

/// Dart test on the usage of method type arguments in type expressions. With
/// '--generic-method-syntax', the type argument is available at runtime,
/// but erased to `dynamic`.

library generic_methods_type_expression_test;

import "package:expect/expect.dart";

bool f1<T>(Object o) => o is T;   /// 01: static type warning

bool f2<T>(Object o) => o is List<T>;

bool f3<T>(Object o) => o is! T;   /// 03: static type warning

bool f4<T>(Object o) => o is! List<T>;

T f5<T>(Object o) => o as T;

List<T> f6<T>(Object o) => o as List<T>;

Type f7<T>() => T;

class TypeValue<X> {
  Type get value => X;
}

Type f8<T>() => new TypeValue<List<T>>().value;

bool f9<T>(Object o) => o is Map<T, String>;

class IsMap<A> {
  @NoInline()
  bool check<B>(o) => o is Map<A, B>;
}

main() {
  String s = "Hello!";
  List<String> ss = <String>[s];
  Expect.throws(() => f1<int>(42), (e) => e is TypeError);  /// 01: continued
  Expect.throws(() => f1<String>(42), (e) => e is TypeError);  /// 01: continued
  Expect.equals(f2<int>(<int>[42]), true);
  Expect.equals(f2<String>(<int>[42]), true); // `is List<dynamic>` is true.
  Expect.throws(() => f3<int>(42), (e) => e is TypeError);  /// 03: continued
  Expect.throws(() => f3<String>(42), (e) => e is TypeError);  /// 03: continued
  Expect.equals(f4<int>(<int>[42]), false);
  Expect.equals(f4<String>(<int>[42]), false); // `is! List<dynamic>` is false.
  Expect.equals(f5<String>(s), s); // `s as dynamic == s`
  Expect.equals(f5<int>(s), s); // `s as dynamic == s`
  Expect.equals(f6<String>(ss), ss);
  Expect.equals(f6<int>(ss), ss); // `as List<dynamic>` succeeds.
  Expect.throws(() => f7<int>(), (e) => e is TypeError);
  Expect.equals(f8<int>(), List); // Returns `List<dynamic>`.

  Expect.isTrue(f9<int>(<int,String>{}));
  Expect.isTrue(f9<int>(<bool,String>{})); // `is Map<dynamic, String>` is true.
  Expect.isFalse(f9<int>(<int,int>{}));

  Expect.isTrue(new IsMap<int>().check<String>(<int,String>{}));
  Expect.isTrue(new IsMap<int>().check<int>(<int,String>{}));
}
