starlark: add tests of int / int
Also, remove StarklarkInt.divide, which is unused and untested.
(int / int is implemented by first converting operands to float.)
See https://github.com/bazelbuild/bazel/pull/12498 for context.
PiperOrigin-RevId: 342895923
diff --git a/src/main/java/net/starlark/java/eval/StarlarkInt.java b/src/main/java/net/starlark/java/eval/StarlarkInt.java
index c6be007..df34dfb 100644
--- a/src/main/java/net/starlark/java/eval/StarlarkInt.java
+++ b/src/main/java/net/starlark/java/eval/StarlarkInt.java
@@ -448,23 +448,6 @@
return StarlarkInt.of(zbig);
}
- /** Returns x / y (real division). */
- public static StarlarkInt divide(StarlarkInt x, StarlarkInt y) throws EvalException {
- if (y == ZERO) {
- throw Starlark.errorf("real division by zero");
- }
- if (x instanceof Int32 && y instanceof Int32) {
- long xl = ((Int32) x).v;
- long yl = ((Int32) y).v;
- return StarlarkInt.of(xl / yl);
- }
-
- BigInteger xbig = x.toBigInteger();
- BigInteger ybig = y.toBigInteger();
- BigInteger zbig = xbig.divide(ybig);
- return StarlarkInt.of(zbig);
- }
-
/** Returns x // y (floor of integer division). */
public static StarlarkInt floordiv(StarlarkInt x, StarlarkInt y) throws EvalException {
if (y == ZERO) {
diff --git a/src/test/java/net/starlark/java/eval/testdata/int.star b/src/test/java/net/starlark/java/eval/testdata/int.star
index 9c8e236..4d38e62 100644
--- a/src/test/java/net/starlark/java/eval/testdata/int.star
+++ b/src/test/java/net/starlark/java/eval/testdata/int.star
@@ -83,7 +83,7 @@
assert_eq(-(111111111 * 111111111), -12345678987654321)
assert_eq((111111111 * 111111111) // 111111111, 111111111)
-# division
+# floored division
assert_eq(100 // 7, 14)
assert_eq(100 // -7, -15)
assert_eq(-100 // 7, -15) # NB: different from Go / Java
@@ -92,12 +92,30 @@
assert_eq(98 // -7, -14)
assert_eq(-98 // 7, -14)
assert_eq(-98 // -7, 14)
-quot = 1169282 * 1000000 + 890553 # simplify when we have big literals
-assert_eq(product // 1234567, quot)
-assert_eq(product // -1234567, -quot-1)
-assert_eq(-product // 1234567, -quot-1)
-assert_eq(-product // -1234567, quot)
-assert_eq(((-1) << 31) // -1, 2147483647+1) # sole case of int // int that causes int overflow
+assert_eq( product // 1234567, 1169282890553)
+assert_eq( product // -1234567, -1169282890553-1)
+assert_eq(-product // 1234567, -1169282890553-1)
+assert_eq(-product // -1234567, 1169282890553)
+assert_eq(((-1) << 31) // -1, 1 << 31) # sole case of int // int that causes int overflow
+assert_eq(((-1) << 63) // -1, 1 << 63) # ditto, long overflow
+
+# floating-point division of int operands
+assert_eq(str(100 / 7), "14.285714285714286")
+assert_eq(str(100 / -7), "-14.285714285714286")
+assert_eq(str(-100 / 7), "-14.285714285714286")
+assert_eq(str(-100 / -7), "14.285714285714286")
+assert_eq(type(98 / 7), "float")
+assert_eq(98 / 7, 14.0)
+assert_eq(98 / -7, -14.0)
+assert_eq(-98 / 7, -14.0)
+assert_eq(-98 / -7, 14.0)
+assert_eq(type(product / 1234567), "float")
+assert_eq(int( product / 1234567), 1169282890553)
+assert_eq(int( product / -1234567), -1169282890553)
+assert_eq(int(-product / 1234567), -1169282890553)
+assert_eq(int(-product / -1234567), 1169282890553)
+assert_eq(((-1) << 31) / -1, 1 << 31) # sole case of int / int that causes int overflow
+assert_eq(((-1) << 63) / -1, 1 << 63) # ditto, long overflow
# remainder
assert_eq(100 % 7, 2)