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)