blob: 9df58f3461b0b0a7b8033dce2b57e2cc1f629ced [file] [log] [blame]
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
var BUGNUMBER = 578700;
var summary = 'TypedObjects numeric types';
var actual = '';
var expect = '';
var ArrayType = TypedObject.ArrayType;
var StructType = TypedObject.StructType;
var uint8 = TypedObject.uint8;
var uint16 = TypedObject.uint16;
var uint32 = TypedObject.uint32;
var uint8Clamped = TypedObject.uint8Clamped;
var int8 = TypedObject.int8;
var int16 = TypedObject.int16;
var int32 = TypedObject.int32;
var float32 = TypedObject.float32;
var float64 = TypedObject.float64;
function runTests()
{
printBugNumber(BUGNUMBER);
printStatus(summary);
var TestPassCount = 0;
var TestFailCount = 0;
var TestTodoCount = 0;
var TODO = 1;
function check(fun, todo) {
var thrown = null;
var success = false;
try {
success = fun();
} catch (x) {
thrown = x;
}
if (thrown)
success = false;
if (todo) {
TestTodoCount++;
if (success) {
var ex = new Error;
print ("=== TODO but PASSED? ===");
print (ex.stack);
print ("========================");
}
return;
}
if (success) {
TestPassCount++;
} else {
TestFailCount++;
var ex = new Error;
print ("=== FAILED ===");
print (ex.stack);
if (thrown) {
print (" threw exception:");
print (thrown);
}
print ("==============");
}
}
function checkThrows(fun, todo) {
var thrown = false;
try {
fun();
} catch (x) {
thrown = true;
}
check(() => thrown, todo);
}
var types = [uint8, uint16, uint32, int8, int16, int32];
var strings = ["uint8", "uint16", "uint32", "int8", "int16", "int32"];
for (var i = 0; i < types.length; i++) {
var type = types[i];
check(() => type(true) === 1);
check(() => type(false) === 0);
check(() => type(+Infinity) === 0);
check(() => type(-Infinity) === 0);
check(() => type(NaN) === 0);
check(() => type.toSource() === strings[i]);
check(() => type(null) == 0);
check(() => type(undefined) == 0);
check(() => type([]) == 0);
check(() => type({}) == 0);
check(() => type(/abcd/) == 0);
checkThrows(() => new type());
checkThrows(() => type());
}
var floatTypes = [float32, float64];
var floatStrings = ["float32", "float64"];
for (var i = 0; i < floatTypes.length; i++) {
var type = floatTypes[i];
check(() => type(true) === 1);
check(() => type(false) === 0);
check(() => type(+Infinity) === Infinity);
check(() => type(-Infinity) === -Infinity);
check(() => Number.isNaN(type(NaN)));
check(() => type.toSource() === floatStrings[i]);
check(() => type(null) == 0);
check(() => Number.isNaN(type(undefined)));
check(() => type([]) == 0);
check(() => Number.isNaN(type({})));
check(() => Number.isNaN(type(/abcd/)));
checkThrows(() => new type());
checkThrows(() => type());
}
///// test ranges and creation
/// uint8
// valid
check(() => uint8(0) == 0);
check(() => uint8(-0) == 0);
check(() => uint8(129) == 129);
check(() => uint8(255) == 255);
// overflow is allowed for explicit conversions
check(() => uint8(-1) == 255);
check(() => uint8(-255) == 1);
check(() => uint8(256) == 0);
check(() => uint8(2345678) == 206);
check(() => uint8(3.14) == 3);
check(() => uint8(342.56) == 86);
check(() => uint8(-342.56) == 170);
/// uint8clamped
// valid
check(() => uint8Clamped(0) == 0);
check(() => uint8Clamped(-0) == 0);
check(() => uint8Clamped(129) == 129);
check(() => uint8Clamped(-30) == 0);
check(() => uint8Clamped(254.5) == 254);
check(() => uint8Clamped(257) == 255);
check(() => uint8Clamped(513) == 255);
check(() => uint8Clamped(60000) == 255);
// strings
check(() => uint8("0") == 0);
check(() => uint8("255") == 255);
check(() => uint8("256") == 0);
check(() => uint8("0x0f") == 15);
check(() => uint8("0x00") == 0);
check(() => uint8("0xff") == 255);
check(() => uint8("0x1ff") == 255);
// in JS, string literals with leading zeroes are interpreted as decimal
check(() => uint8("-0777") == 247);
check(() => uint8("-0xff") == 0);
/// uint16
// valid
check(() => uint16(65535) == 65535);
// overflow is allowed for explicit conversions
check(() => uint16(-1) == 65535);
check(() => uint16(-65535) == 1);
check(() => uint16(-65536) == 0);
check(() => uint16(65536) == 0);
// strings
check(() => uint16("0x1234") == 0x1234);
check(() => uint16("0x00") == 0);
check(() => uint16("0xffff") == 65535);
check(() => uint16("-0xffff") == 0);
check(() => uint16("0xffffff") == 0xffff);
// wrong types
check(() => uint16(3.14) == 3); // c-like casts in explicit conversion
print("done");
reportCompare(0, TestFailCount, "TypedObjects numeric type tests");
}
runTests();