blob: 11de9b425583ee77cdf363f22dcc3b0f6e86549c [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
write("\nJ*************************** JSON test parse simple literals ***************");
write(JSON.stringify(JSON.parse("{ \"memberNum\" : -0.1}")));
var rev1 = function(name, value) {
write("+++in reviver")
// for (a in this) {
// write(a)
// write(this[a])
// }
if (this[name] != value) {
write("error");
}
write(name);
if (value === undefined) {
write("undefined");
}
else if (value === null) {
write("null");
}
else {
write(value);
}
write("+++out reviver");
if (value == 3) {
return undefined;
}
else if (value == true) {
return 99;
}
return value;
}
write("");
write("");
var jsObjString = "{\"\" : 7, \"memberNullFirst\" : null, \"memberNum\" : 3, \"memberNegNum\" : -98765,\"memberStr\" : \"StringJSON\", \"memberBool\" : true , \"memberObj\" : { \"mm\" : 1, \"mb\" : false}, \"memberX\" : {}, \"memberArray\" : [33, \"StringTst\",null,{}], \"memberNull\" : null}";
//var jsObjString = "{\"memberNullFirst\" : null}";
write("\nJ*************************** JSON test parse simple with no reviver ***************");
write("");
write("JSON Parse__ original= ");
write(jsObjString);
var jsObjStringParsed = JSON.parse(jsObjString);
var jsObjStringBack = JSON.stringify(jsObjStringParsed);
write("");
write(" __Parsed and stringify back= ");
write( jsObjStringBack);
write("");
write("");
write("\nJ*************************** JSON test parse simple with tracing reviver ***************");
write("");
write("JSON Parse__ original= ");
write(jsObjString);
jsObjStringParsed = JSON.parse(jsObjString, rev1);
jsObjStringBack = JSON.stringify(jsObjStringParsed);
write("");
write(" __Parsed with tracing reviver and stringify back = ");
write( jsObjStringBack);
write("");
write("");
write("\nJ*************************** JSON test parse simple with data restore reviver ***************");
jsObjString = "{\"\" : 7, \"memberNullFirst\" : null, \"dateMember\" : \"2008-05-30T07:00:59Z\", \"memberNum\" : 3, \"memberStr\" : \"StringJSON\", \"memberBool\" : true , \"memberObj\" : { \"mm\" : 1, \"mb\" : false}, \"memberX\" : {}, \"memberArray\" : [33, \"StringTst\",null,{}], \"memberNull\" : null}";
write("");
jsObjStringParsed = JSON.parse(jsObjString, function(key, value) {
var a;
if (typeof value === 'string') {
a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
if (a) {
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
+a[5], +a[6]));
}
}
return value;
}
);
jsObjStringBack = JSON.stringify(jsObjStringParsed);
write("");
write("JSON Parse__ original= ");
write(jsObjString);
write("");
write(" __Parsed and stringify back with Date rev = ");
write(jsObjStringBack);
write("VERIFICATION: restored date year(if this doesn't throw we know the filter worked)= ");
write(jsObjStringParsed.dateMember.getUTCFullYear());
var rev2 = function(name, value) {
if (this[name] != value) {
write("error");
}
if (value == 3.14) {
return undefined;
}
else if (value == true) {
return 99;
}
return value;
}
write("");
write("");
write("\nJ*************************** JSON test parse simple with reviver2: replace(delete) 3.14 by undefined, replace'true' by 99 ***************");
write("");
jsObjStringParsed = JSON.parse(jsObjString, rev2);
jsObjStringBack = JSON.stringify(jsObjStringParsed);
write("");
write("JSON Parse__ original= ");
write(jsObjString);
write("");
write(" __Parsed with reviver2 and stringify back= ");
write(jsObjStringBack);
var num = 12345;
var bfalse = false;
var jundef;
function f() { return 0; }
var arrSimple = new Array();
arrSimple[0] = "document.location";
arrSimple[1] = "foolish";
var simpleObj = { MemberNo1: '"data"' };
simpleObj.dateMember = new Date(2008, 3, 1);
simpleObj.functionMember = f;
simpleObj.nullMember = null;
simpleObj.undefinedMember = jundef;
simpleObj.stringmember = "this string ends the obj. You should not see functionMember and undefinedMember";
var simpleObjN = { MemberNo1: '"data"' };
simpleObjN.dateMember = new Date(2008, 3, 1);
simpleObjN.functionMember = f;
simpleObjN.nullMember = null;
simpleObjN.arr = arrSimple;
simpleObjN.undefinedMember = jundef;
simpleObjN.nested = { nestedM1: {}, nestedM2: 1234, nestedM3: { a: true, b: false} };
simpleObjN.a = { a: {}, nestedM2: 1234, b: { a: true, b: false, c : 3.14} };
simpleObjN.stringmember = "this string ends the obj. You should not see functionMember and undefinedMember";
var objNull = null;
var objArrMem = new Object();
objArrMem.intMember = 3;
objArrMem.strMember = "string_member_in_object";
var arr = new Array();
arr[0] = "document.location";
arr[1] = "foolish";
arr[2] = 12.3;
arr[3] = new Date(2008, 9, 9);
arr[4] = new Object();
arr[6] = objArrMem;
arr[7] = objNull;
arr[8] = jundef;
arr[9] = f;
arr[10] = new Array();
arr[10][0] = "NestedArray_1stParamString";
arr[10][1] = 3.14;
arr[10][2] = { a: "nested object in array", c: true };
arr[10][4] = new Array();
arr[11] = "[0]-document.location, [1]-string, [2]-number, [3]-date, [4]-empty obj, [5]-missing, [6]-obj, [7]-null, [8]-undef, [9]-function, [10]-nestedArray, [11]-this";
function repf(key, value) {
if (key == "a" && (this.b != undefined)) {
return this.b;
}
return value;
}
var objectArray = [
{ obj: "SampleTest", desc: "String simple" },
{ obj: 1, desc: "Number(1)" },
{ obj: num, desc: "Number(1234)" },
{ obj: 3.14, desc: "Number(3.14)" },
{ obj: Number.NaN, desc: "Number(NaN)" },
{ obj: Number.POSITIVE_INFINITY, desc: "Number(POSITIVE_INFINITY)" },
{ obj: true, desc: "bool(true)" },
{ obj: bfalse, desc: "bool(false)" },
{ obj: null, desc: "null" },
{ obj: jundef, desc: "undefined" },
{ obj: new Date(2008, 10, 10), desc: "Date(2008, 10, 10)" },
{ obj: new Object("hello"), desc: "string in Object" },
{ obj: new Number(33), desc: "number in Object" },
{ obj: new Object(true), desc: "bool in Object" },
{ obj: simpleObj, desc: "SimpleObject" },
{ obj: simpleObjN, desc: "Object with nested objects and array" },
{ obj: arrSimple, desc: "Simple array" },
{ obj: arr, desc: "Complex array" }
];
var replacerArray = [
{ obj: null, desc: "null" },
{ obj: [], desc: "array replacer: []" },
{ obj: ["a", "b"], desc: "array replacer: [\"a\",\"b\"]" },
{ obj: ["a", "b", "a", "a"], desc: "array replacer: [\"a\",\"b\",\"a\",\"a\"]" },
{ obj: repf, desc: "replacer function, if the key is 'a' and the holder has a prop 'b', replace the value of the prop 'a' with the value of prop b " }
]
var spaceArray = [
{ obj: null, desc: "null" },
{ obj: 4, desc: "number 4" },
{ obj: 24, desc: "number 24" },
{ obj: "........................", desc: "string : ........................" }
]
var stringifiedObj;
var parsedObj;
var reStringified;
write("");
write("");
write("\n%%%%%%%%%%%%%%%%% Matrix Testing %%%%%%%%%%%%%%%%% ");
write("");
write("");
write("\nJ*************************** JSON test stringify - simple, no space, not replacer *********************** ");
for (var i = 0; i < objectArray.length; i++) {
try {
write("");
write("------ JSON test stringify: " + objectArray[i].desc + " ------");
stringifiedObj = JSON.stringify(objectArray[i].obj);
write(stringifiedObj);
parsedObj = JSON.parse(stringifiedObj);
reStringified = JSON.stringify(parsedObj);
write("=== Parsed and restringified :")
write(reStringified);
parsedObj = JSON.parse(stringifiedObj, rev2);
reStringified = JSON.stringify(parsedObj);
write("=== Parsed with reviver and restringified :")
write(reStringified);
}
catch (e) {
write("!!Exception: " + e);
}
}
function checkStrEqual(str1, str2)
{
if (str1 === str2)
{
write("PASS");
}
else
{
write("FAIL");
write(str1);
write(str2);
}
}
var complexStr = "/test ze\0ro\vString\n_u4:\u0061_u2:\xbc_u1:\x0e_u2clean:\x8f";
var expectedString = "\"/test ze\\u0000ro\\u000bString\\n_u4:a_u2:¼_u1:\\u000e_u2clean:\\"";
write("");
write("------ JSON test stringify: complex string ------");
stringifiedObj = JSON.stringify(complexStr);
checkStrEqual(stringifiedObj, expectedString);
parsedObj = JSON.parse(stringifiedObj);
reStringified = JSON.stringify(parsedObj);
write("=== Parsed and restringified :")
checkStrEqual(reStringified, expectedString);
parsedObj = JSON.parse(stringifiedObj, rev2);
reStringified = JSON.stringify(parsedObj);
write("=== Parsed with reviver and restringified :")
checkStrEqual(reStringified, expectedString);
for (var k = 0; k < replacerArray.length; k++) {
for (var j = 0; j < spaceArray.length; j++) {
write("");
write("");
write("\n*************************** JSON test stringify: replacer: " + replacerArray[k].desc + " space: " + spaceArray[j].desc + " *********************** ");
for (var i = 0; i < objectArray.length; i++) {
try {
write("");
write("------ JSON test stringify: " + objectArray[i].desc + " ------");
stringifiedObj = JSON.stringify(objectArray[i].obj, replacerArray[k].obj, spaceArray[j].obj);
write(stringifiedObj);
parsedObj = JSON.parse(stringifiedObj);
reStringified = JSON.stringify(parsedObj);
write("=== Parsed with no reviver and restringified :")
write(reStringified);
parsedObj = JSON.parse(stringifiedObj, rev2);
reStringified = JSON.stringify(parsedObj);
write("=== Parsed with reviver2 and restringified :")
write(reStringified);
}
catch (e) {
write("!!Exception: " + e);
}
}
write("");
write("------ JSON test stringify: complex string 2 ------");
stringifiedObj = JSON.stringify(complexStr, replacerArray[k].obj, spaceArray[j].obj);
checkStrEqual(stringifiedObj, expectedString);
parsedObj = JSON.parse(stringifiedObj);
reStringified = JSON.stringify(parsedObj);
write("=== Parsed with no reviver and restringified :")
checkStrEqual(reStringified, expectedString);
parsedObj = JSON.parse(stringifiedObj, rev2);
reStringified = JSON.stringify(parsedObj);
write("=== Parsed with reviver2 and restringified :")
checkStrEqual(reStringified, expectedString);
}
}
function write(a) {
if (this.WScript == undefined) {
document.write(a);
document.write("\n");
}
else
WScript.Echo(a)
}