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

// @dart = 2.9

// Testing integers with and without intrinsics.
// VMOptions=
// VMOptions=--no_intrinsify

library integer_arithmetic_test;

import "package:expect/expect.dart";

mulDivParsed(String a, String b, String product,
    {String expected_quotient1, String expected_quotient2}) {
  int int_a = int.parse(a);
  int int_b = int.parse(b);
  int int_product = int.parse(product);
  int computed_product = int_a * int_b;
  Expect.equals(int_product, computed_product);
  String str_product = computed_product >= 0
      ? "0x${computed_product.toRadixString(16)}"
      : "-0x${(-computed_product).toRadixString(16)}";
  Expect.equals(product.toLowerCase(), str_product);
  int computed_product2 = int_b * int_a;
  Expect.equals(int_product, computed_product2);
  String str_product2 = computed_product2 >= 0
      ? "0x${computed_product2.toRadixString(16)}"
      : "-0x${(-computed_product2).toRadixString(16)}";
  Expect.equals(product.toLowerCase(), str_product2);

  if (int_a != 0) {
    expected_quotient1 ??= b;
    int int_expected_quotient1 = int.parse(expected_quotient1);
    int computed_quotient1 = int_product ~/ int_a;
    Expect.equals(int_expected_quotient1, computed_quotient1);
    String str_quotient1 = computed_quotient1 >= 0
        ? "0x${computed_quotient1.toRadixString(16)}"
        : "-0x${(-computed_quotient1).toRadixString(16)}";
    Expect.equals(expected_quotient1.toLowerCase(), str_quotient1);
  }

  if (int_b != 0) {
    expected_quotient2 ??= a;
    int int_expected_quotient2 = int.parse(expected_quotient2);
    int computed_quotient2 = int_product ~/ int_b;
    Expect.equals(int_expected_quotient2, computed_quotient2);
    String str_quotient2 = computed_quotient2 >= 0
        ? "0x${computed_quotient2.toRadixString(16)}"
        : "-0x${(-computed_quotient2).toRadixString(16)}";
    Expect.equals(expected_quotient2.toLowerCase(), str_quotient2);
  }
}

testMultiplyDivide() {
  String zero = "0x0";
  String one = "0x1";
  String minus_one = "-0x1";

  mulDivParsed(zero, zero, zero);
  mulDivParsed(one, one, one);
  mulDivParsed(one, zero, zero);
  mulDivParsed(zero, one, zero);
  mulDivParsed(one, minus_one, minus_one);
  mulDivParsed(minus_one, minus_one, one);
  mulDivParsed("0x42", one, "0x42");
  mulDivParsed("0x42", "0x2", "0x84");
  mulDivParsed("0xFFFF", "0x2", "0x1FFFE");
  mulDivParsed("0x3", "0x5", "0xF");
  mulDivParsed("0xFFFFF", "0x5", "0x4FFFFB");
  mulDivParsed("0xFFFFFFF", "0x5", "0x4FFFFFFB");
  mulDivParsed("0xFFFFFFFF", "0x5", "0x4FFFFFFFB");
  mulDivParsed("0x7FFFFFFFFFFFFFFF", "0x5", "0x7FFFFFFFFFFFFFFB",
      expected_quotient1: zero, expected_quotient2: "0x1999999999999998");
  mulDivParsed("0x7FFFFFFFFFFFFFFF", "0x3039", "0x7FFFFFFFFFFFCFC7",
      expected_quotient1: zero, expected_quotient2: "0x2A783BE38C73D");
  mulDivParsed("0x10000001", "0x5", "0x50000005");
}

main() {
  testMultiplyDivide();
}
