blob: e4507fac77f6f6730410add2f03cbdbd7531188a [file] [log] [blame]
description(
"Tests that -2^31/-1 (and a bunch of other corner cases) does the right thing."
);
function myDiv(a, b) {
return a / b;
}
function myDivByNeg1(a) {
return a / -1;
}
function myDivNeg2ToThe31(b) {
return -2147483648 / b;
}
function myMod(a, b) {
return a % b;
}
function myModByNeg1(a) {
return a % -1;
}
function myModBy2(a) {
return a % 2;
}
function myModBy1073741824(a) {
return a % 1073741824;
}
function myModNeg2ToThe31(b) {
return -2147483648 % b;
}
function myOtherDiv(a, b) {
return a / b;
}
function myOtherDivByNeg1(a) {
return a / -1;
}
function myOtherDivNeg2ToThe31(b) {
return -2147483648 / b;
}
function myOtherMod(a, b) {
return a % b;
}
function myOtherModByNeg1(a) {
return a % -1;
}
function myOtherModNeg2ToThe31(b) {
return -2147483648 % b;
}
function myDivExpectingInt(a, b) {
return (a / b) | 0;
}
var w = 4;
var v = 2;
var x = -2147483648;
var y = -1;
var z = 3;
// Use a loop to ensure we cover all three tiers of optimization.
for (var i = 0; i < 200; ++i) {
shouldBe("myDiv(x, y)", "2147483648");
shouldBe("myDivByNeg1(x)", "2147483648");
shouldBe("myDivNeg2ToThe31(y)", "2147483648");
shouldBe("myMod(x, y)", "-0");
shouldBe("myMod(x, z)", "-2");
shouldBe("myModByNeg1(x)", "-0");
shouldBe("myModBy2(x)", "-0");
shouldBe("myModBy1073741824(x)", "-0");
shouldBe("myModBy2(y)", "-1");
shouldBe("myModBy1073741824(y)", "-1");
shouldBe("myModBy2(z)", "1");
shouldBe("myModBy1073741824(z)", "3");
shouldBe("myModNeg2ToThe31(y)", "-0");
if (i > 100) {
w = x;
v = y;
}
shouldBe("myOtherDiv(w, v)", i > 100 ? "2147483648" : "2");
shouldBe("myOtherDivByNeg1(w)", i > 100 ? "2147483648" : "-4");
shouldBe("myOtherDivNeg2ToThe31(v)", i > 100 ? "2147483648" : "-1073741824");
shouldBe("myOtherMod(w, v)", i > 100 ? "-0" : "0");
shouldBe("myOtherModByNeg1(w)", i > 100 ? "-0" : "0");
shouldBe("myOtherModNeg2ToThe31(v)", "-0");
shouldBe("myOtherModNeg2ToThe31(3)", "-2");
shouldBe("myDivExpectingInt(x, y)", "x");
}