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

/// @assertion bool operator <(num other)
/// @description Checks operator < when 'other' is of type int.
/// @author pagolubev

import "../../../Utils/expect.dart";

check(double d, int i, bool lessThan) {
  if (lessThan)
    Expect.isTrue(d < i, 'Expected $d < $i');
  else
    Expect.isFalse(d < i, 'Expected !($d < $i)');
}

main() {
  check(-1/0, -9007199254740991, true); // -infinity < -2^53
  check(-1.7976931348623157e308, -9007199254740991, true); // -maxdouble < -2^53

  check(-100.00000000000001, -100, true);
  check(-100.0, -100, false);
  check(-99.99999999999999, -100, false);

  check(-1.0000000000000002, -1, true);
  check(-1.0, -1, false);
  check(-.9999999999999999, -1, false);

  check(-4.9406564584124654e-324, 0, true); // -mindouble < 0

  check(-.0, 0, false);
  check(.0, 0, false);

  check(4.9406564584124654e-324, 0, false); // !(mindouble < 0)

  check(.9999999999999999, 1, true);
  check(1.0, 1, false);
  check(1.0000000000000002, 1, false);

  check(99.99999999999999, 100, true);
  check(100.0, 100, false);
  check(100.00000000000001, 100, false);

  check(1.7976931348623157e308, 9007199254740991, false); // !(maxdouble < 2^53 - 1)
  check(1/0, 9007199254740991, false); // !(infinity < 2^53 - 1)
}
