diff options
Diffstat (limited to 'js/src/tests/ecma_7/TypedObject/referencetypetrace.js')
-rw-r--r-- | js/src/tests/ecma_7/TypedObject/referencetypetrace.js | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/js/src/tests/ecma_7/TypedObject/referencetypetrace.js b/js/src/tests/ecma_7/TypedObject/referencetypetrace.js new file mode 100644 index 000000000..02246c1d2 --- /dev/null +++ b/js/src/tests/ecma_7/TypedObject/referencetypetrace.js @@ -0,0 +1,80 @@ +// |reftest| skip-if(!this.hasOwnProperty("TypedObject")||!this.hasOwnProperty("hasChild")) +var BUGNUMBER = 898359; +var summary = 'TypedObjects reference type trace'; +var actual = ''; +var expect = ''; + +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +var ArrayType = TypedObject.ArrayType; +var StructType = TypedObject.StructType; +var Any = TypedObject.Any; +var Object = TypedObject.Object; +var string = TypedObject.string; + +function TestStructFields(RefType) { + var rabbit = {}; + var S1 = new StructType({f: RefType}); + var s1 = new S1({f: rabbit}); + assertEq(hasChild(s1, rabbit), true); + s1.f = null; + assertEq(hasChild(s1, rabbit), false); +} + +function TestArrayElements(RefType) { + var rabbit = {}; + var S1 = new ArrayType(RefType, 1); + var s1 = new S1([rabbit]); + assertEq(hasChild(s1, rabbit), true); + s1[0] = null; + assertEq(hasChild(s1, rabbit), false); +} + +function TestStructInArray(RefType) { + var rabbit = {}; + var S2 = new StructType({f: RefType, g: RefType}); + var S1 = new ArrayType(S2, 1); + var s1 = new S1([{f: rabbit, g: {}}]); + assertEq(hasChild(s1, rabbit), true); + s1[0].f = null; + assertEq(hasChild(s1, rabbit), false); +} + +function TestStringInStruct() { + // Rather subtle hair-pullingly maddening testing phenomena: If you + // just use a constant string here, it's always reachable via the + // atoms table. Same is true of "Hello" + "1" (an earlier + // attempt) due to parser constant folding. So we have to make a + // rabbit that's not constant foldable. But don't just use + // Math.random(), since small integers are atoms already. + var rabbit = "Hello" + Math.random(); + var S1 = new StructType({f: string}); + var s1 = new S1({f: rabbit}); + assertEq(hasChild(s1, rabbit), true); + s1.f = "World"; + assertEq(hasChild(s1, rabbit), false); +} + +function runTests() +{ + printBugNumber(BUGNUMBER); + printStatus(summary); + + TestStructFields(Object); + TestStructFields(Any); + + TestArrayElements(Object); + TestArrayElements(Any); + + TestStructInArray(Object); + TestStructInArray(Any); + + TestStringInStruct(); + + reportCompare(true, true, "TypedObjects trace tests"); +} + +runTests(); |