mirror of https://github.com/tc39/test262.git
257 lines
8.0 KiB
JavaScript
257 lines
8.0 KiB
JavaScript
function mathTruncOnIntegers(value)
|
|
{
|
|
return Math.trunc(value);
|
|
}
|
|
noInline(mathTruncOnIntegers);
|
|
|
|
function mathTruncOnDoubles(value)
|
|
{
|
|
return Math.trunc(value);
|
|
}
|
|
noInline(mathTruncOnDoubles);
|
|
|
|
function mathTruncOnBooleans(value)
|
|
{
|
|
return Math.trunc(value);
|
|
}
|
|
noInline(mathTruncOnBooleans);
|
|
|
|
// The trivial cases first.
|
|
for (var i = 1; i < 1e4; ++i) {
|
|
var truncedValue = mathTruncOnIntegers(i);
|
|
if (truncedValue !== i)
|
|
throw new Error("mathTruncOnIntegers(" + i + ") = " + truncedValue);
|
|
|
|
var truncedValue = mathTruncOnIntegers(-i);
|
|
if (truncedValue !== -i)
|
|
throw new Error("mathTruncOnIntegers(" + -i + ") = " + truncedValue);
|
|
|
|
var doubleLow = i + 0.4;
|
|
var truncedValue = mathTruncOnDoubles(doubleLow);
|
|
if (truncedValue !== i)
|
|
throw new Error("mathTruncOnDoubles(" + doubleLow + ") = " + truncedValue);
|
|
|
|
var doubleHigh = i + 0.6;
|
|
var truncedValue = mathTruncOnDoubles(doubleHigh);
|
|
if (truncedValue !== i)
|
|
throw new Error("mathTruncOnDoubles(" + doubleHigh + ") = " + truncedValue);
|
|
|
|
var doubleMid = i + 0.5;
|
|
var truncedValue = mathTruncOnDoubles(doubleMid);
|
|
if (truncedValue !== i)
|
|
throw new Error("mathTruncOnDoubles(" + doubleMid + ") = " + truncedValue);
|
|
|
|
var truncedValue = mathTruncOnDoubles(-0.6);
|
|
if (truncedValue !== -0.0)
|
|
throw new Error("mathTruncOnDoubles(-0.6) = " + truncedValue);
|
|
}
|
|
|
|
// Some more interesting cases, some of them well OSR exit when the return value is zero.
|
|
for (var i = 0; i < 1e4; ++i) {
|
|
var truncedValue = mathTruncOnIntegers(i);
|
|
if (truncedValue !== i)
|
|
throw new Error("mathTruncOnIntegers(" + i + ") = " + truncedValue);
|
|
|
|
var truncedValue = mathTruncOnIntegers(-i);
|
|
if (truncedValue !== -i)
|
|
throw new Error("mathTruncOnIntegers(-" + i + ") = " + truncedValue);
|
|
|
|
var truncedValue = mathTruncOnDoubles(-0.4);
|
|
if (truncedValue !== -0.0)
|
|
throw new Error("mathTruncOnDoubles(-0.4) = " + truncedValue);
|
|
|
|
var truncedValue = mathTruncOnDoubles(-0.5);
|
|
if (truncedValue !== -0.0)
|
|
throw new Error("mathTruncOnDoubles(-0.5) = " + truncedValue);
|
|
|
|
var truncedValue = mathTruncOnDoubles(-0);
|
|
if (!(truncedValue === 0 && (1/truncedValue) === -Infinity))
|
|
throw new Error("mathTruncOnDoubles(-0) = " + truncedValue);
|
|
|
|
var truncedValue = mathTruncOnDoubles(NaN);
|
|
if (truncedValue === truncedValue)
|
|
throw new Error("mathTruncOnDoubles(NaN) = " + truncedValue);
|
|
|
|
var truncedValue = mathTruncOnDoubles(Number.POSITIVE_INFINITY);
|
|
if (truncedValue !== Number.POSITIVE_INFINITY)
|
|
throw new Error("mathTruncOnDoubles(Number.POSITIVE_INFINITY) = " + truncedValue);
|
|
|
|
var truncedValue = mathTruncOnDoubles(Number.NEGATIVE_INFINITY);
|
|
if (truncedValue !== Number.NEGATIVE_INFINITY)
|
|
throw new Error("mathTruncOnDoubles(Number.NEGATIVE_INFINITY) = " + truncedValue);
|
|
|
|
var boolean = !!(i % 2);
|
|
var truncedBoolean = mathTruncOnBooleans(boolean);
|
|
if (truncedBoolean != boolean)
|
|
throw new Error("mathTruncOnDoubles(" + boolean + ") = " + truncedBoolean);
|
|
}
|
|
|
|
function uselessMathTrunc(value)
|
|
{
|
|
return Math.trunc(value|0);
|
|
}
|
|
noInline(uselessMathTrunc);
|
|
|
|
for (var i = 0; i < 1e4; ++i) {
|
|
var truncedValue = uselessMathTrunc(i);
|
|
if (truncedValue !== i)
|
|
throw new Error("uselessMathTrunc(" + i + ") = " + truncedValue);
|
|
|
|
var doubleLow = i + 0.4;
|
|
var truncedValue = uselessMathTrunc(doubleLow);
|
|
if (truncedValue !== i)
|
|
throw new Error("uselessMathTrunc(" + doubleLow + ") = " + truncedValue);
|
|
|
|
var doubleHigh = i + 0.6;
|
|
var truncedValue = uselessMathTrunc(doubleHigh);
|
|
if (truncedValue !== i)
|
|
throw new Error("uselessMathTrunc(" + doubleHigh + ") = " + truncedValue);
|
|
|
|
var doubleMid = i + 0.5;
|
|
var truncedValue = uselessMathTrunc(doubleMid);
|
|
if (truncedValue !== i)
|
|
throw new Error("uselessMathTrunc(" + doubleMid + ") = " + truncedValue);
|
|
|
|
var truncedValue = uselessMathTrunc(-0.4);
|
|
if (truncedValue !== 0)
|
|
throw new Error("uselessMathTrunc(-0.4) = " + truncedValue);
|
|
|
|
var truncedValue = uselessMathTrunc(-0.5);
|
|
if (truncedValue !== 0)
|
|
throw new Error("uselessMathTrunc(-0.5) = " + truncedValue);
|
|
|
|
var truncedValue = uselessMathTrunc(-0.6);
|
|
if (truncedValue !== 0)
|
|
throw new Error("uselessMathTrunc(-0.6) = " + truncedValue);
|
|
}
|
|
|
|
function mathTruncWithOverflow(value)
|
|
{
|
|
return Math.trunc(value);
|
|
}
|
|
noInline(mathTruncWithOverflow);
|
|
|
|
for (var i = 0; i < 1e4; ++i) {
|
|
var bigValue = 1000000000000;
|
|
var truncedValue = mathTruncWithOverflow(bigValue);
|
|
if (truncedValue !== bigValue)
|
|
throw new Error("mathTruncWithOverflow(" + bigValue + ") = " + truncedValue);
|
|
}
|
|
|
|
function mathTruncConsumedAsDouble(value)
|
|
{
|
|
return Math.trunc(value) * 0.5;
|
|
}
|
|
noInline(mathTruncConsumedAsDouble);
|
|
|
|
for (var i = 0; i < 1e4; ++i) {
|
|
var doubleValue = i + 0.1;
|
|
var truncedValue = mathTruncConsumedAsDouble(doubleValue);
|
|
if (truncedValue !== (i * 0.5))
|
|
throw new Error("mathTruncConsumedAsDouble(" + doubleValue + ") = " + truncedValue);
|
|
|
|
var doubleValue = i + 0.6;
|
|
var truncedValue = mathTruncConsumedAsDouble(doubleValue);
|
|
if (truncedValue !== (i * 0.5))
|
|
throw new Error("mathTruncConsumedAsDouble(" + doubleValue + ") = " + truncedValue);
|
|
|
|
}
|
|
|
|
function mathTruncDoesNotCareAboutMinusZero(value)
|
|
{
|
|
return Math.trunc(value)|0;
|
|
}
|
|
noInline(mathTruncDoesNotCareAboutMinusZero);
|
|
|
|
for (var i = 0; i < 1e4; ++i) {
|
|
var doubleMid = i + 0.5;
|
|
var truncedValue = mathTruncDoesNotCareAboutMinusZero(doubleMid);
|
|
if (truncedValue !== i)
|
|
throw new Error("mathTruncDoesNotCareAboutMinusZero(" + doubleMid + ") = " + truncedValue);
|
|
}
|
|
|
|
|
|
// *** Function arguments. ***
|
|
function mathTruncNoArguments()
|
|
{
|
|
return Math.trunc();
|
|
}
|
|
noInline(mathTruncNoArguments);
|
|
|
|
function mathTruncTooManyArguments(a, b, c)
|
|
{
|
|
return Math.trunc(a, b, c);
|
|
}
|
|
noInline(mathTruncTooManyArguments);
|
|
|
|
for (var i = 0; i < 1e4; ++i) {
|
|
var value = mathTruncNoArguments();
|
|
if (value === value)
|
|
throw new Error("mathTruncNoArguments() = " + value);
|
|
|
|
var value = mathTruncTooManyArguments(2.1, 3, 5);
|
|
if (value !== 2)
|
|
throw new Error("mathTruncTooManyArguments() = " + value);
|
|
}
|
|
|
|
|
|
// *** Constant as arguments. ***
|
|
function testMathTruncOnConstants()
|
|
{
|
|
var value = Math.trunc(0);
|
|
if (value !== 0)
|
|
throw new Error("Math.trunc(0) = " + value);
|
|
var value = Math.trunc(-0);
|
|
if (!(value === 0 && (1/value) === -Infinity))
|
|
throw new Error("Math.trunc(-0) = " + value);
|
|
var value = Math.trunc(1);
|
|
if (value !== 1)
|
|
throw new Error("Math.trunc(1) = " + value);
|
|
var value = Math.trunc(-1);
|
|
if (value !== -1)
|
|
throw new Error("Math.trunc(-1) = " + value);
|
|
var value = Math.trunc(42);
|
|
if (value !== 42)
|
|
throw new Error("Math.trunc(42) = " + value);
|
|
var value = Math.trunc(-42.2);
|
|
if (value !== -42)
|
|
throw new Error("Math.trunc(-42.2) = " + value);
|
|
var value = Math.trunc(NaN);
|
|
if (value === value)
|
|
throw new Error("Math.trunc(NaN) = " + value);
|
|
var value = Math.trunc(Number.POSITIVE_INFINITY);
|
|
if (value !== Infinity)
|
|
throw new Error("Math.trunc(Number.POSITIVE_INFINITY) = " + value);
|
|
var value = Math.trunc(Number.NEGATIVE_INFINITY);
|
|
if (value !== -Infinity)
|
|
throw new Error("Math.trunc(Number.NEGATIVE_INFINITY) = " + value);
|
|
var value = Math.trunc(Math.E);
|
|
if (value !== 2)
|
|
throw new Error("Math.trunc(Math.E) = " + value);
|
|
}
|
|
noInline(testMathTruncOnConstants);
|
|
|
|
for (var i = 0; i < 1e4; ++i) {
|
|
testMathTruncOnConstants();
|
|
}
|
|
|
|
|
|
// *** Struct transition. ***
|
|
function mathTruncStructTransition(value)
|
|
{
|
|
return Math.trunc(value);
|
|
}
|
|
noInline(mathTruncStructTransition);
|
|
|
|
for (var i = 0; i < 1e4; ++i) {
|
|
var value = mathTruncStructTransition(42.5);
|
|
if (value !== 42)
|
|
throw new Error("mathTruncStructTransition(42.5) = " + value);
|
|
}
|
|
|
|
Math.trunc = function() { return arguments[0] + 5; }
|
|
|
|
var value = mathTruncStructTransition(42);
|
|
if (value !== 47)
|
|
throw new Error("mathTruncStructTransition(42) after transition = " + value);
|