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