// 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";

// Dart test program for testing NaN and Infinity.

void main() {
  // Sanity tests.
  Expect.isFalse(1.5.isNaN);
  Expect.isFalse(1.5.isInfinite);
  Expect.isTrue(1.5.isFinite);
  Expect.isFalse(1.5.isNegative);
  Expect.isTrue((-1.5).isNegative);
  Expect.isFalse(0.0.isNegative);
  Expect.isTrue((-0.0).isNegative);
  Expect.isTrue((-0.0).isFinite);

  Expect.isFalse(1.isNaN);
  Expect.isFalse(1.isInfinite);
  Expect.isTrue(1.isFinite);
  Expect.isFalse(1.isNegative);
  Expect.isTrue((-1).isNegative);

  // Test that predicates give the correct result.
  Expect.isTrue(double.nan.isNaN);
  Expect.isFalse(double.nan.isInfinite);
  Expect.isFalse(double.nan.isFinite);
  Expect.isFalse(double.nan.isNegative);
  Expect.isFalse((-double.nan).isNegative);

  Expect.isFalse(double.infinity.isNaN);
  Expect.isTrue(double.infinity.isInfinite);
  Expect.isFalse(double.infinity.isFinite);
  Expect.isFalse(double.infinity.isNegative);
  Expect.isTrue((-double.infinity).isNegative);

  Expect.isFalse(double.negativeInfinity.isNaN);
  Expect.isTrue(double.negativeInfinity.isInfinite);
  Expect.isFalse(double.negativeInfinity.isFinite);
  Expect.isTrue(double.negativeInfinity.isNegative);
  Expect.isFalse((-double.negativeInfinity).isNegative);

  // Test toString.
  Expect.equals("NaN", double.nan.toString());
  Expect.equals("Infinity", double.infinity.toString());
  Expect.equals("-Infinity", double.negativeInfinity.toString());

  // Test identities.
  Expect.isTrue(identical(double.nan, double.nan)); // //# 01: ok
  Expect.isTrue(identical(double.infinity, double.infinity));
  Expect.isTrue(identical(double.negativeInfinity, double.negativeInfinity));
  Expect.isFalse(identical(double.nan, double.infinity));
  Expect.isFalse(identical(double.nan, double.negativeInfinity));
  Expect.isFalse(identical(double.infinity, double.negativeInfinity));
  Expect.isFalse(identical(double.nan, -double.nan));
  Expect.isTrue(identical(double.infinity, -double.negativeInfinity));
  Expect.isTrue(identical(double.negativeInfinity, -double.infinity));

  // Test equalities
  Expect.isTrue(double.infinity == double.infinity);
  Expect.isTrue(double.negativeInfinity == double.negativeInfinity);
  Expect.isFalse(double.infinity == double.negativeInfinity);
  Expect.isFalse(double.negativeInfinity == double.infinity);
  Expect.isFalse(double.nan == double.nan);
  Expect.isFalse(double.nan == double.infinity);
  Expect.isFalse(double.nan == double.negativeInfinity);
  Expect.isFalse(double.infinity == double.nan);
  Expect.isFalse(double.negativeInfinity == double.nan);

  // Test relational order.
  Expect.isFalse(double.nan < double.nan);
  Expect.isFalse(double.nan < double.infinity);
  Expect.isFalse(double.nan < double.negativeInfinity);
  Expect.isFalse(double.nan > double.nan);
  Expect.isFalse(double.nan > double.infinity);
  Expect.isFalse(double.nan > double.negativeInfinity);
  Expect.isFalse(double.infinity < double.nan);
  Expect.isFalse(double.negativeInfinity < double.nan);
  Expect.isFalse(double.infinity > double.nan);
  Expect.isFalse(double.negativeInfinity > double.nan);
  Expect.isTrue(double.infinity > double.negativeInfinity);
  Expect.isFalse(double.infinity < double.negativeInfinity);

  // NaN is contagious.
  Expect.isTrue((3.0 * double.nan).isNaN);
  Expect.isTrue((3.0 + double.nan).isNaN);
  Expect.isTrue((-double.nan).isNaN);
}
