if (typeof TypedObject === "undefined") quit(); // Test the behavior of property sets on typed objects when they are a // prototype or their prototype has a setter. var TO = TypedObject; function assertThrows(fun, errorType) { try { fun(); assertEq(true, false, "Expected error, but none was thrown"); } catch (e) { assertEq(e instanceof errorType, true, "Wrong error type thrown"); } } var PointType = new TO.StructType({x: TO.int32, y: TO.int32 }); function testPoint() { var p = new PointType(); var sub = Object.create(p); var found; Object.defineProperty(PointType.prototype, "z", {set: function(a) { this.d = a; }}); Object.defineProperty(PointType.prototype, "innocuous", {set: function(a) { found = a; }}); sub.x = 5; assertEq(sub.x, 5); assertEq(p.x, 0); sub.z = 5; assertEq(sub.d, 5); assertEq(sub.z, undefined); sub[3] = 5; assertEq(sub[3], 5); p.innocuous = 10; assertEq(found, 10); assertThrows(function() { p.z = 10; assertEq(true, false); }, TypeError); } testPoint(); var IntArrayType = new TO.ArrayType(TO.int32, 3); function testArray() { var arr = new IntArrayType(); var found; Object.defineProperty(IntArrayType.prototype, 5, {set: function(a) { found = a; }}); assertThrows(function() { arr[5] = 5; }, RangeError); assertThrows(function() { arr[4] = 5; }, RangeError); var p = Object.create(arr); p.length = 100; assertEq(p.length, 3); assertThrows(function() { "use strict"; p.length = 100; }, TypeError); } testArray();