| // 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. | 
 |  | 
 | 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); | 
 | } |