blob: 3c3025993e67372a3c378a53dbac3c3c6512a234 [file] [log] [blame]
<html>
<head>
<script src="../../../resources/js-test.js"></script>
<script src="resources/webgl-test.js"></script>
</head>
<body>
<div id="description"></div>
<div id="console"></div>
<script>
description("Verifies that out-of-range parameters for creation, slicing and setting of WebGL arrays are caught");
function testConstructionWithNullBuffer(type, name) {
var array;
try {
array = new type(null, 0, 0);
testPassed("Construction of " + name + " with null buffer shouldn't throw exception");
} catch (e) {
testFailed("Construction of " + name + " with null buffer threw exception");
}
}
function testConstructionWithOutOfRangeValues(type, name) {
var buffer = new ArrayBuffer(4);
var array;
try {
array = new type(buffer, 4, 0x3FFFFFFF);
testFailed("Construction of " + name + " with out-of-range values should throw exception");
} catch (e) {
testPassed("Construction of " + name + " with out-of-range values threw exception");
}
}
function testConstructionWithNegativeOutOfRangeValues(type, name) {
var buffer = new ArrayBuffer(4);
var array;
try {
array = new type(buffer, 4, -2147483648);
testFailed("Construction of " + name + " with negative out-of-range values should throw exception");
} catch (e) {
testPassed("Construction of " + name + " with negative out-of-range values threw exception");
}
}
function testConstructionOfHugeArray(type, name, sz) {
if (sz == 1)
return;
try {
// Construction of huge arrays must fail because byteLength is
// an unsigned long
array = new type(3000000000);
testFailed("Construction of huge " + name + " should throw exception");
} catch (e) {
testPassed("Construction of huge " + name + " threw exception");
}
}
// These need to be global for shouldBe to see them
var array;
var typeSize;
function testSubarrayWithOutOfRangeValues(type, name, sz) {
debug("Testing subarray of " + name);
try {
var buffer = new ArrayBuffer(32);
array = new type(buffer);
typeSize = sz;
shouldBe("array.length", "32 / typeSize");
try {
shouldBe("array.subarray(4, 0x3FFFFFFF).length", "(32 / typeSize) - 4");
shouldBe("array.subarray(4, -2147483648).length", "0");
} catch (e) {
testFailed("Subarray of " + name + " threw exception");
}
} catch (e) {
testFailed("Exception: " + e);
}
}
function testSettingFromArrayWithOutOfRangeOffset(type, name) {
var webglArray = new type(32);
var array = [];
for (var i = 0; i < 16; i++) {
array.push(i);
}
try {
webglArray.set(array, 0x7FFFFFF8);
testFailed("Setting " + name + " from array with out-of-range offset was not caught");
} catch (e) {
testPassed("Setting " + name + " from array with out-of-range offset was caught");
}
}
function testSettingFromFakeArrayWithOutOfRangeLength(type, name) {
var webglArray = new type(32);
var array = {};
array.length = 0x80000000;
try {
webglArray.set(array, 8);
testFailed("Setting " + name + " from fake array with invalid length was not caught");
} catch (e) {
testPassed("Setting " + name + " from fake array with invalid length was caught");
}
}
function testSettingFromWebGLArrayWithOutOfRangeOffset(type, name) {
var webglArray = new type(32);
var srcArray = new type(16);
for (var i = 0; i < 16; i++) {
srcArray[i] = i;
}
try {
webglArray.set(srcArray, 0x7FFFFFF8);
testFailed("Setting " + name + " from " + name + " with out-of-range offset was not caught");
} catch (e) {
testPassed("Setting " + name + " from " + name + " with out-of-range offset was caught");
}
}
var typeNames = [ "Int8Array",
"Uint8Array",
"Int16Array",
"Uint16Array",
"Int32Array",
"Uint32Array",
"Float32Array" ];
var typeSizes = [ 1, 1, 2, 2, 4, 4, 4 ];
for (var i = 0; i < typeNames.length; i++) {
var name = typeNames[i];
var type = window[name];
if (!type) {
testFailed("Could not find array type " + name);
} else {
testConstructionWithNullBuffer(type, name);
testConstructionWithOutOfRangeValues(type, name);
testConstructionWithNegativeOutOfRangeValues(type, name);
testConstructionOfHugeArray(type, name, typeSizes[i]);
testSubarrayWithOutOfRangeValues(type, name, typeSizes[i]);
testSettingFromArrayWithOutOfRangeOffset(type, name);
testSettingFromFakeArrayWithOutOfRangeLength(type, name);
testSettingFromWebGLArrayWithOutOfRangeOffset(type, name);
}
}
buffer = new ArrayBuffer(40);
ints = new Int32Array(buffer, 0, 10);
floats = new Float32Array(buffer, 0, 10);
// Plant a NaN into the buffer
ints[0]=-0x7ffff;
// Read the NaN out as a float
shouldBeTrue("isNaN(floats[0])");
</script>
</body>
</html>