blob: ff9dc51a79a1c5f288a96aeb94139dbe38675784 [file] [log] [blame]
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");