// 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.7

import "package:expect/expect.dart";

// Don't convert !(a op b) to (a neg-op b) when a or b might be NaN.
test(double n) {
  // Force known type to double, preserves NaN.
  n = 0.0 + n;
  Expect.isFalse(n >= 0);
  Expect.isTrue(!(n < 0));

  Expect.isFalse(n <= 0);
  Expect.isTrue(!(n > 0));

  Expect.isFalse(n < 0);
  Expect.isTrue(!(n >= 0));

  Expect.isFalse(n > 0);
  Expect.isTrue(!(n <= 0));

  Expect.isFalse(n == 0);
  Expect.isFalse(!(n != 0));

  Expect.isTrue(n != 0);
  Expect.isTrue(!(n == 0));

  Expect.isFalse(identical(n, 0));
  Expect.isFalse(!(!identical(n, 0)));

  Expect.isTrue(!identical(n, 0));
  Expect.isTrue(!(identical(n, 0)));

  Expect.isFalse(0 >= n);
  Expect.isTrue(!(0 < n));

  Expect.isFalse(0 <= n);
  Expect.isTrue(!(0 > n));

  Expect.isFalse(0 < n);
  Expect.isTrue(!(0 >= n));

  Expect.isFalse(0 > n);
  Expect.isTrue(!(0 <= n));

  Expect.isFalse(0 == n);
  Expect.isFalse(!(0 != n));

  Expect.isTrue(0 != n);
  Expect.isTrue(!(0 == n));

  Expect.isFalse(identical(0, n));
  Expect.isFalse(!(!identical(0, n)));

  Expect.isTrue(!identical(0, n));
  Expect.isTrue(!(identical(0, n)));
}

testConstant() {
  Expect.isFalse(double.nan >= 0);
  Expect.isTrue(!(double.nan < 0));

  Expect.isFalse(double.nan <= 0);
  Expect.isTrue(!(double.nan > 0));

  Expect.isFalse(double.nan < 0);
  Expect.isTrue(!(double.nan >= 0));

  Expect.isFalse(double.nan > 0);
  Expect.isTrue(!(double.nan <= 0));

  Expect.isFalse(double.nan == 0);
  Expect.isFalse(!(double.nan != 0));

  Expect.isTrue(double.nan != 0);
  Expect.isTrue(!(double.nan == 0));

  Expect.isFalse(identical(double.nan, 0));
  Expect.isFalse(!(!identical(double.nan, 0)));

  Expect.isTrue(!identical(double.nan, 0));
  Expect.isTrue(!(identical(double.nan, 0)));

  Expect.isFalse(0 >= double.nan);
  Expect.isTrue(!(0 < double.nan));

  Expect.isFalse(0 <= double.nan);
  Expect.isTrue(!(0 > double.nan));

  Expect.isFalse(0 < double.nan);
  Expect.isTrue(!(0 >= double.nan));

  Expect.isFalse(0 > double.nan);
  Expect.isTrue(!(0 <= double.nan));

  Expect.isFalse(0 == double.nan);
  Expect.isFalse(!(0 != double.nan));

  Expect.isTrue(0 != double.nan);
  Expect.isTrue(!(0 == double.nan));

  Expect.isFalse(identical(0, double.nan));
  Expect.isFalse(!(!identical(0, double.nan)));

  Expect.isTrue(!identical(0, double.nan));
  Expect.isTrue(!(identical(0, double.nan)));
}

main() {
  test(hideConstant(27, double.nan));
  testConstant();
}

double hideConstant(int n, double result) {
  if (n == 1) return result;
  if ((n & 1) == 0) return hideConstant(n >> 1, result);
  return hideConstant(3 * n + 1, result);
}
