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

main() {
  // Integer literals.
  Expect.isTrue(2 is int);
  //                 ^^^
  // [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
  //                 ^^^
  // [analyzer] COMPILE_TIME_ERROR.TYPE_TEST_WITH_NON_TYPE
  Expect.equals(2, 2 as int);
  //                    ^^^
  // [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
  //                    ^^^
  // [analyzer] COMPILE_TIME_ERROR.CAST_TO_NON_TYPE
  Expect.isTrue(-2 is int);
  //                  ^^^
  // [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
  //                  ^^^
  // [analyzer] COMPILE_TIME_ERROR.TYPE_TEST_WITH_NON_TYPE
  Expect.equals(-2, -2 as int);
  //                      ^^^
  // [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
  //                      ^^^
  // [analyzer] COMPILE_TIME_ERROR.CAST_TO_NON_TYPE
  Expect.isTrue(0x10 is int);
  //                    ^^^
  // [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
  //                    ^^^
  // [analyzer] COMPILE_TIME_ERROR.TYPE_TEST_WITH_NON_TYPE
  Expect.isTrue(-0x10 is int);
  //                     ^^^
  // [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
  //                     ^^^
  // [analyzer] COMPILE_TIME_ERROR.TYPE_TEST_WITH_NON_TYPE

  // "a" will be part of hex literal, the following "s" is an error.
  0x10as int;
//^^^^^
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
// [cfe] Expected ';' after this.
//     ^
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
// [cfe] 's' isn't a type.
//       ^
// [cfe] Can't declare 'int' because it was already used in this scope.
  0x;
//^
// [cfe] A hex digit (0-9 or A-F) must follow '0x'.
// ^
// [analyzer] SYNTACTIC_ERROR.MISSING_HEX_DIGIT

  // Double literals.
  Expect.isTrue(2.0 is double);
  Expect.equals(2.0, 2.0 as double);
  Expect.isTrue(-2.0 is double);
  Expect.equals(-2.0, -2.0 as double);
  Expect.isTrue(.2 is double);
  Expect.equals(0.2, .2 as double);
  Expect.isTrue(1e2 is double);
  Expect.equals(1e2, 1e2 as double);
  Expect.isTrue(1e-2 is double);
  Expect.equals(1e-2, 1e-2 as double);
  Expect.isTrue(1e+2 is double);
  Expect.equals(1e+2, 1e+2 as double);
  Expect.throwsNoSuchMethodError(() => 1.e+2);
  //                                     ^
  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
  // [cfe] The getter 'e' isn't defined for the class 'int'.
  1d;
//^
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
// [cfe] Expected ';' after this.
// ^
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER
// [cfe] Getter not found: 'd'.
  1D;
//^
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
// [cfe] Expected ';' after this.
// ^
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER
// [cfe] Getter not found: 'D'.
  Expect.throwsNoSuchMethodError(() => 1.d+2);
  //                                     ^
  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
  // [cfe] The getter 'd' isn't defined for the class 'int'.
  Expect.throwsNoSuchMethodError(() => 1.D+2);
  //                                     ^
  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
  // [cfe] The getter 'D' isn't defined for the class 'int'.
  1.1d;
//^^^
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
// [cfe] Expected ';' after this.
//   ^
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER
// [cfe] Getter not found: 'd'.
  1.1D;
//^^^
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
// [cfe] Expected ';' after this.
//   ^
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER
// [cfe] Getter not found: 'D'.
  1e;
//^
// [cfe] Numbers in exponential notation should always contain an exponent (an integer number with an optional sign).
// ^
// [analyzer] SYNTACTIC_ERROR.MISSING_DIGIT
  1x;
//^
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
// [cfe] Expected ';' after this.
// ^
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER
// [cfe] Getter not found: 'x'.
}
