// Copyright (c) 2012, 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";

class C<T, U, V> {}

class D {}

typedef int Foo(bool b);

sameType(a, b) {
  Expect.equals(a.runtimeType, b.runtimeType);
}

main() {
  void foo(a) {}

  // Test that literals can be used in different contexts.
  [int];
  ([int]);
  foo([int]);
  [int].length;
  ({1: int});
  foo({1: int});
  ({1: int}).keys;

  // Test type literals.
  Expect.equals(int, int);
  Expect.notEquals(int, num);
  Expect.equals(Foo, Foo);
  Expect.equals(dynamic, dynamic);

  // Test that class literals return instances of Type.
  Expect.isTrue((D).runtimeType is Type);
  Expect.isTrue((dynamic).runtimeType is Type);

  // Test that types from runtimeType and literals agree.
  Expect.equals(int, 1.runtimeType);
  Expect.equals(String, 'hest'.runtimeType);
  Expect.equals(double, (0.5).runtimeType);
  Expect.equals(bool, true.runtimeType);
  Expect.equals(Object, Object().runtimeType);
  Expect.equals(C, new C().runtimeType);
  Expect.equals(D, new D().runtimeType);

  // runtimeType on type is idempotent.
  Expect.equals((D).runtimeType, (D).runtimeType.runtimeType);

  // Test that operator calls on class literals go to Type.
  Expect.throwsNoSuchMethodError(() => C = 1);
  //                                   ^
  // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_TYPE
  // [cfe] Can't assign to a type literal.
  Expect.throwsNoSuchMethodError(() => C++);
  //                                   ^
  // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_TYPE
  // [cfe] Can't assign to a type literal.
  Expect.throwsNoSuchMethodError(() => C + 1);
  //                                     ^
  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
  // [cfe] The operator '+' isn't defined for the class 'Type'.
  Expect.throwsNoSuchMethodError(() => C[2]);
  //                                    ^^^
  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
  // [cfe] The operator '[]' isn't defined for the class 'Type'.
  Expect.throwsNoSuchMethodError(() => C[2] = 'hest');
  //                                    ^^^
  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
  // [cfe] The operator '[]=' isn't defined for the class 'Type'.
  Expect.throwsNoSuchMethodError(() => dynamic = 1);
  //                                   ^
  // [cfe] Can't assign to a type literal.
  //                                   ^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_TYPE
  Expect.throwsNoSuchMethodError(() => dynamic++);
  //                                   ^
  // [cfe] Can't assign to a type literal.
  //                                   ^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_TYPE
  Expect.throwsNoSuchMethodError(() => dynamic + 1);
  //                                           ^
  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
  // [cfe] The operator '+' isn't defined for the class 'Type'.
  Expect.throwsNoSuchMethodError(() => dynamic[2]);
  //                                          ^^^
  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
  // [cfe] The operator '[]' isn't defined for the class 'Type'.
  Expect.throwsNoSuchMethodError(() => dynamic[2] = 'hest');
  //                                          ^^^
  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
  // [cfe] The operator '[]=' isn't defined for the class 'Type'.

  Expect.equals((dynamic).toString(), 'dynamic');
}
