function testBasic() { // Latin1 var s = '[1, 2, "foo", "bar\\r\\n", {"xyz": 3}, [1, 2, 3]]'; assertEq(isLatin1(s), true); assertEq(JSON.stringify(JSON.parse(s)), '[1,2,"foo","bar\\r\\n",{"xyz":3},[1,2,3]]'); // TwoByte s = '[1, 2, "foo\u1200", "bar\\r\\n", {"xyz": 3}, [1, 2, 3]]'; assertEq(JSON.stringify(JSON.parse(s)), '[1,2,"foo\u1200","bar\\r\\n",{"xyz":3},[1,2,3]]'); } testBasic(); function testErrorPos() { // Make sure the error location is calculated correctly. // Latin1 var s = '[1, \n2,'; try { JSON.parse(s); assertEq(0, 1); } catch(e) { assertEq(e instanceof SyntaxError, true); assertEq(e.toString().includes("line 2 column 3"), true); } s = '[1, "\u1300",\n2,'; try { JSON.parse(s); assertEq(0, 1); } catch(e) { assertEq(e instanceof SyntaxError, true); assertEq(e.toString().includes("line 2 column 3"), true); } } testErrorPos(); function testEvalHack() { // Latin1 var arr = eval("[1, 2, 3, \"abc\"]"); assertEq(JSON.stringify(arr), '[1,2,3,"abc"]'); assertEq(isLatin1(JSON.stringify(arr)), true); // TwoByte arr = eval("[1, 2, 3, \"abc\u1200\"]"); assertEq(JSON.stringify(arr), '[1,2,3,"abc\u1200"]'); } testEvalHack(); function testEvalHackNotJSON() { // Latin1 var arr = eval("[]; var q; [1, 2, 3, \"abc\"]"); assertEq(JSON.stringify(arr), '[1,2,3,"abc"]'); // TwoByte arr = eval("[]; var z; [1, 2, 3, \"abc\u1200\"]"); assertEq(JSON.stringify(arr), '[1,2,3,"abc\u1200"]'); try { eval("[1, 2, 3, \"abc\u2028\"]"); throw new Error("U+2028 shouldn't eval"); } catch (e) { assertEq(e instanceof SyntaxError, true, "should have thrown a SyntaxError, instead got " + e); } } testEvalHackNotJSON(); function testQuote() { // Latin1 var s = "abc--\x05-'\"-\n-\u00ff++"; var res = JSON.stringify(s); assertEq(res, '"abc--\\u0005-\'\\"-\\n-\xFF++"'); assertEq(isLatin1(res), true); // TwoByte s += "\uAAAA"; assertEq(JSON.stringify(s), '"abc--\\u0005-\'\\"-\\n-\xFF++\uAAAA"'); } testQuote();