// 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 num operator +(num other)
/// This operator implements arithmetic addition operation.
/// @description Checks that this operator returns correct value for both integer 
/// and double arguments (including special values).
/// @author vasya

import "../../../Utils/expect.dart";
import "dart:math" as Math;

main() {
  Expect.equals(2, 1 + 1);
  Expect.equals(2147483648, 2147483647 + 1);
  Expect.equals(-2147483647, -2147483648 + 1);
  Expect.equals(4294967296, 4294967295 + 1);
  Expect.equals( -4294967295, -4294967296 + 1);
  Expect.equals(-1, -9007199254740991 + 9007199254740990);

  final double MIN_DOUBLE = Math.pow(2.0, -1074) as double;
  final double NEG_MIN_DOUBLE = -1 * MIN_DOUBLE; 
  final double MAX_DOUBLE =
      (2 - Math.pow(2.0, -52)) * Math.pow(2.0, 1023) as double;
  final double NEG_MAX_DOUBLE = -1 * MAX_DOUBLE; 

  Expect.equals(0.0, 0 + 0.0);
  Expect.equals(0.0, 0 + -0.0);
  Expect.equals(0.0, 1 + -1.0);
  Expect.equals(0.0, -1 + 1.0);

  Expect.equals(double.infinity, 0 + double.infinity);
  Expect.equals(double.infinity, 0 + double.infinity);
  Expect.equals(MIN_DOUBLE, 0 + MIN_DOUBLE);
  Expect.equals(NEG_MIN_DOUBLE, 0 + NEG_MIN_DOUBLE);
  Expect.equals(MAX_DOUBLE, 0 + MAX_DOUBLE);
  Expect.equals(NEG_MAX_DOUBLE, 0 + NEG_MAX_DOUBLE);
  
  Expect.isTrue((0 + double.nan).isNaN);
}
