blob: 78f4494dd1cfed0edf9e2550492a20029b651fd4 [file] [log] [blame]
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
var BUGNUMBER = 578700;
var summary = 'TypedObjects ArrayType implementation';
function assertThrows(f) {
var ok = false;
try {
f();
} catch (exc) {
ok = true;
}
if (!ok)
throw new TypeError("Assertion failed: " + f + " did not throw as expected");
}
var ArrayType = TypedObject.ArrayType;
var uint8 = TypedObject.uint8;
var float32 = TypedObject.float32;
var uint32 = TypedObject.uint32;
function runTests() {
print(BUGNUMBER + ": " + summary);
assertEq(typeof ArrayType.prototype.prototype.forEach == "function", true);
assertThrows(() => ArrayType(uint8, 10));
assertThrows(() => new ArrayType());
assertThrows(() => new ArrayType(""));
assertThrows(() => new ArrayType(5));
assertThrows(() => new ArrayType(uint8).dimension(-1));
var A = new ArrayType(uint8, 10);
//assertEq(A.__proto__.__proto__, ArrayType.prototype);
assertEq(A.length, 10);
assertEq(A.elementType, uint8);
assertEq(A.byteLength, 10);
assertEq(A.toSource(), "new ArrayType(uint8, 10)");
//assertEq(A.prototype.__proto__.__proto__, ArrayType.prototype.prototype);
var a = new A();
assertEq(a.__proto__, A.prototype);
assertEq(a.length, 10);
assertThrows(() => a.length = 2);
for (var i = 0; i < a.length; i++)
a[i] = i*2;
for (var i = 0; i < a.length; i++)
assertEq(a[i], i*2);
a.forEach(function(val, i) {
assertEq(val, i*2);
assertEq(arguments[2], a);
});
// Range.
assertThrows(() => a[i] = 5);
assertEq(a[a.length], undefined);
// constructor takes initial value
var b = new A(a);
for (var i = 0; i < a.length; i++)
assertEq(b[i], i*2);
var b = new A([0, 1, 0, 1, 0, 1, 0, 1, 0, 1]);
for (var i = 0; i < b.length; i++)
assertEq(b[i], i%2);
assertThrows(() => new A(5));
assertThrows(() => new A(/fail/));
// Length different
assertThrows(() => new A([0, 1, 0, 1, 0, 1, 0, 1, 0]));
var Vec3 = new ArrayType(float32, 3);
var Sprite = new ArrayType(Vec3, 3); // say for position, velocity, and direction
assertEq(Sprite.elementType, Vec3);
assertEq(Sprite.elementType.elementType, float32);
var mario = new Sprite();
// setting using binary data
mario[0] = new Vec3([1, 0, 0]);
// setting using JS array conversion
mario[1] = [1, 1.414, 3.14];
assertEq(mario[0].length, 3);
assertEq(mario[0][0], 1);
assertEq(mario[0][1], 0);
assertEq(mario[0][2], 0);
assertThrows(() => mario[1] = 5);
mario[1][1] = {};
assertEq(Number.isNaN(mario[1][1]), true);
// ok this is just for kicks
var AllSprites = new ArrayType(Sprite, 65536);
var as = new AllSprites();
assertEq(as.length, 65536);
var indexPropDesc = Object.getOwnPropertyDescriptor(as, '0');
assertEq(typeof indexPropDesc == "undefined", false);
assertEq(indexPropDesc.configurable, false);
assertEq(indexPropDesc.enumerable, true);
assertEq(indexPropDesc.writable, true);
var lengthPropDesc = Object.getOwnPropertyDescriptor(as, 'length');
assertEq(typeof lengthPropDesc == "undefined", false);
assertEq(lengthPropDesc.configurable, false);
assertEq(lengthPropDesc.enumerable, false);
assertEq(lengthPropDesc.writable, false);
var counter = 0;
for (var nm in as) {
assertEq(+nm, counter++);
}
assertEq(counter, as.length);
assertThrows(() => Object.defineProperty(o, "foo", { value: "bar" }));
// check if a reference acts the way it should
var AA = uint8.array(5, 5);
var aa = new AA();
var aa0 = aa[0];
aa[0] = [0,1,2,3,4];
for (var i = 0; i < aa0.length; i++)
assertEq(aa0[i], i);
if (typeof reportCompare === "function")
reportCompare(true, true);
print("Tests complete");
}
runTests();