function assertIsObject(x) { assertEq(typeof x, "object"); assertEq(x instanceof Object, true); } function assertIsArray(x) { assertIsObject(x); assertEq(Array.isArray(x), true); assertEq(Object.getPrototypeOf(x), Array.prototype); assertEq(x instanceof Array, true); assertEq(x.constructor, Array); } var x; var props; // empty object x = JSON.parse("{}"); assertIsObject(x); assertEq(Object.getOwnPropertyNames(x).length, 0); // empty array x = JSON.parse("[]"); assertIsArray(x); assertEq(x.length, 0); // one element array x = JSON.parse("[[]]"); assertIsArray(x); assertEq(x.length, 1); assertIsArray(x[0]); assertEq(x[0].length, 0); // multiple arrays x = JSON.parse("[[],[],[]]"); assertIsArray(x); assertEq(x.length, 3); assertIsArray(x[0]); assertEq(x[0].length, 0); assertIsArray(x[1]); assertEq(x[1].length, 0); assertIsArray(x[2]); assertEq(x[2].length, 0); // array key/value x = JSON.parse('{"foo":[]}'); assertIsObject(x); props = Object.getOwnPropertyNames(x); assertEq(props.length, 1); assertEq(props[0], "foo"); assertIsArray(x.foo); assertEq(x.foo.length, 0); x = JSON.parse('{"foo":[], "bar":[]}'); assertIsObject(x); props = Object.getOwnPropertyNames(x).sort(); assertEq(props.length, 2); assertEq(props[0], "bar"); assertEq(props[1], "foo"); assertIsArray(x.foo); assertEq(x.foo.length, 0); assertIsArray(x.bar); assertEq(x.bar.length, 0); // nesting x = JSON.parse('{"foo":[{}]}'); assertIsObject(x); props = Object.getOwnPropertyNames(x); assertEq(props.length, 1); assertEq(props[0], "foo"); assertIsArray(x.foo); assertEq(x.foo.length, 1); assertIsObject(x.foo[0]); assertEq(Object.getOwnPropertyNames(x.foo[0]).length, 0); x = JSON.parse('{"foo":[{"foo":[{"foo":{}}]}]}'); assertIsObject(x.foo[0].foo[0].foo); x = JSON.parse('{"foo":[{"foo":[{"foo":[]}]}]}'); assertIsArray(x.foo[0].foo[0].foo); // strings x = JSON.parse('{"foo":"bar"}'); assertIsObject(x); props = Object.getOwnPropertyNames(x); assertEq(props.length, 1); assertEq(props[0], "foo"); assertEq(x.foo, "bar"); x = JSON.parse('["foo", "bar", "baz"]'); assertIsArray(x); assertEq(x.length, 3); assertEq(x[0], "foo"); assertEq(x[1], "bar"); assertEq(x[2], "baz"); // numbers x = JSON.parse('{"foo":5.5, "bar":5}'); assertIsObject(x); props = Object.getOwnPropertyNames(x).sort(); assertEq(props.length, 2); assertEq(props[0], "bar"); assertEq(props[1], "foo"); assertEq(x.foo, 5.5); assertEq(x.bar, 5); // keywords x = JSON.parse('{"foo": true, "bar":false, "baz":null}'); assertIsObject(x); props = Object.getOwnPropertyNames(x).sort(); assertEq(props.length, 3); assertEq(props[0], "bar"); assertEq(props[1], "baz"); assertEq(props[2], "foo"); assertEq(x.foo, true); assertEq(x.bar, false); assertEq(x.baz, null); // short escapes x = JSON.parse('{"foo": "\\"", "bar":"\\\\", "baz":"\\b","qux":"\\f", "quux":"\\n", "quuux":"\\r","quuuux":"\\t"}'); props = Object.getOwnPropertyNames(x).sort(); assertEq(props.length, 7); assertEq(props[0], "bar"); assertEq(props[1], "baz"); assertEq(props[2], "foo"); assertEq(props[3], "quuuux"); assertEq(props[4], "quuux"); assertEq(props[5], "quux"); assertEq(props[6], "qux"); assertEq(x.foo, '"'); assertEq(x.bar, '\\'); assertEq(x.baz, '\b'); assertEq(x.qux, '\f'); assertEq(x.quux, "\n"); assertEq(x.quuux, "\r"); assertEq(x.quuuux, "\t"); // unicode escape x = JSON.parse('{"foo":"hmm\\u006dmm"}'); assertIsObject(x); props = Object.getOwnPropertyNames(x); assertEq(props.length, 1); assertEq(props[0], "foo"); assertEq("hmm\u006dmm", x.foo); x = JSON.parse('{"hmm\\u006dmm":"foo"}'); assertIsObject(x); props = Object.getOwnPropertyNames(x); assertEq(props.length, 1); assertEq(props[0], "hmmmmm"); assertEq(x.hmm\u006dmm, "foo"); // miscellaneous x = JSON.parse('{"JSON Test Pattern pass3": {"The outermost value": "must be an object or array.","In this test": "It is an object." }}'); assertIsObject(x); props = Object.getOwnPropertyNames(x); assertEq(props.length, 1); assertEq(props[0], "JSON Test Pattern pass3"); assertIsObject(x["JSON Test Pattern pass3"]); props = Object.getOwnPropertyNames(x["JSON Test Pattern pass3"]).sort(); assertEq(props.length, 2); assertEq(props[0], "In this test"); assertEq(props[1], "The outermost value"); assertEq(x["JSON Test Pattern pass3"]["The outermost value"], "must be an object or array."); assertEq(x["JSON Test Pattern pass3"]["In this test"], "It is an object."); /******************************************************************************/ if (typeof reportCompare === "function") reportCompare(true, true); print("Tests complete");