/*
 * Copyright (c) 2017, 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 pow(num x, num exponent)
 * For doubles, pow(x, y) handles edge cases as follows:
 * ...
 *  - if [x] is -Infinity or -0.0 and [y] is an odd integer, then the result
 *    is -pow(-[x] ,[y]).
 * @description Checks the result when [x] is -Infinity or -0.0 and [y] is an
 * odd integer, the result is -pow(-[x] ,[y])..
 * @author ngl@unipro.ru
 */
import "dart:math" as Math;
import "../../Utils/expect.dart";

main() {
  Expect.equals(
      -Math.pow(double.infinity, 1), Math.pow(double.negativeInfinity, 1));
  Expect.equals(
      -Math.pow(double.infinity, 1.0), Math.pow(double.negativeInfinity, 1.0));
  Expect.equals(
      -Math.pow(double.infinity, 11), Math.pow(double.negativeInfinity, 11));
  Expect.equals(
      -Math.pow(double.infinity, 11.0),
      Math.pow(double.negativeInfinity, 11.0));

  Expect.equals(
      -Math.pow(double.infinity, -1), Math.pow(double.negativeInfinity, -1));
  Expect.equals(
      -Math.pow(double.infinity, -1.0),
      Math.pow(double.negativeInfinity, -1.0));
  Expect.equals(
      -Math.pow(double.infinity, -11), Math.pow(double.negativeInfinity, -11));
  Expect.equals(
      -Math.pow(double.infinity, -11.0),
      Math.pow(double.negativeInfinity, -11.0));

  Expect.equals(-Math.pow(.0, 1), Math.pow(-.0, 1));
  Expect.equals(-Math.pow(.0, 1.0), Math.pow(-.0, 1.0));
  Expect.equals(-Math.pow(.0, 11), Math.pow(-.0, 11));
  Expect.equals(-Math.pow(.0, 11.0), Math.pow(-.0, 11.0));

  Expect.equals(-Math.pow(.0, -1), Math.pow(-.0, -1));
  Expect.equals(-Math.pow(.0, -1.0), Math.pow(-.0, -1.0));
  Expect.equals(-Math.pow(.0, -11), Math.pow(-.0, -11));
  Expect.equals(-Math.pow(.0, -11.0), Math.pow(-.0, -11.0));
}
