[test] Fix expectations in WebKit JSON.stringify tests
The reference implementation used in the tests does not fully match the spec, so for the diverging cases we need to explicitly specify the correct expectation. Every single change in this patch has been verified against every major JavaScript engine using eshost + jsvu. All implementations match the spec (and the V8 implementation), with the following two exceptions: - One expectation was wrong because of a JavaScriptCore bug (that is, we inherited the incorrect expectation when importing the tests from WebKit). A comment was added for that one. - This work resulted in the discovery of bugs in Moddable/XS: https://github.com/Moddable-OpenSource/moddable/issues/112 Change-Id: I05d91d7acc5c8765e941fcd68c1086c2694c710c Reviewed-on: https://chromium-review.googlesource.com/c/1396081 Reviewed-by: Sigurd Schneider <sigurds@chromium.org> Commit-Queue: Mathias Bynens <mathias@chromium.org> Cr-Commit-Position: refs/heads/master@{#58546}
This commit is contained in:
parent
af0428aca9
commit
40eb442783
@ -88,10 +88,10 @@ function createTests() {
|
||||
result[result.length - 1].expected = '2';
|
||||
result.push(function (jsonObject){
|
||||
var value = new Boolean(true);
|
||||
value.valueOf = function() { return 2; };
|
||||
value.valueOf = function() { return false; };
|
||||
return jsonObject.stringify(value);
|
||||
});
|
||||
result[result.length - 1].expected = '2';
|
||||
result[result.length - 1].expected = 'true';
|
||||
result.push(function (jsonObject){
|
||||
var value = new String("fail");
|
||||
value.toString = function() { return "converted string"; };
|
||||
@ -114,10 +114,13 @@ function createTests() {
|
||||
result.push(function (jsonObject){
|
||||
return jsonObject.stringify({toJSON: Date.prototype.toJSON, toISOString: function(){ return "custom toISOString"; }});
|
||||
});
|
||||
// Note: JSC fails the following test. Every other engine matches the spec.
|
||||
// This is also covered by the test in
|
||||
// https://github.com/v8/v8/blob/fc664bda1725de0412f6d197fda9503d6e6e122e/test/mjsunit/json.js#L78-L80
|
||||
result.push(function (jsonObject){
|
||||
return jsonObject.stringify({toJSON: Date.prototype.toJSON, toISOString: function(){ return {}; }});
|
||||
});
|
||||
result[result.length - 1].throws = true;
|
||||
result[result.length - 1].expected = '{}';
|
||||
result.push(function (jsonObject){
|
||||
return jsonObject.stringify({toJSON: Date.prototype.toJSON, toISOString: function(){ throw "An exception"; }});
|
||||
});
|
||||
@ -162,6 +165,7 @@ function createTests() {
|
||||
jsonObject.stringify([1,2,3,4,5], function(k,v){allString = allString && (typeof k == "string"); return v});
|
||||
return allString;
|
||||
});
|
||||
result[result.length - 1].expected = true;
|
||||
result.push(function (jsonObject){
|
||||
var allString = true;
|
||||
var array = [];
|
||||
@ -332,9 +336,11 @@ function createTests() {
|
||||
result.push(function (jsonObject){
|
||||
return jsonObject.stringify(objectWithSideEffectGetter);
|
||||
});
|
||||
result[result.length - 1].expected = '{}';
|
||||
result.push(function (jsonObject){
|
||||
return jsonObject.stringify(objectWithSideEffectGetterAndProto);
|
||||
});
|
||||
result[result.length - 1].expected = '{}';
|
||||
result.push(function (jsonObject){
|
||||
return jsonObject.stringify(arrayWithSideEffectGetter);
|
||||
});
|
||||
@ -351,7 +357,7 @@ function createTests() {
|
||||
jsonObject.stringify([1,2,3,,,,4,5,6], replaceFunc);
|
||||
return replaceTracker;
|
||||
});
|
||||
result[result.length - 1].expected = '(string)[1,2,3,null,null,null,4,5,6];0(number)1;1(number)2;2(number)3;3(number)undefined;4(number)undefined;5(number)undefined;6(number)4;7(number)5;8(number)6;'
|
||||
result[result.length - 1].expected = '(string)[1,2,3,null,null,null,4,5,6];0(string)1;1(string)2;2(string)3;3(string)undefined;4(string)undefined;5(string)undefined;6(string)4;7(string)5;8(string)6;';
|
||||
result.push(function (jsonObject){
|
||||
replaceTracker = "";
|
||||
jsonObject.stringify({a:"a", b:"b", c:"c", 3: "d", 2: "e", 1: "f"}, replaceFunc);
|
||||
@ -432,7 +438,7 @@ function createTests() {
|
||||
try { jsonObject.stringify(cyclicArray); } catch { cycleTracker += " -> exception" }
|
||||
return cycleTracker;
|
||||
});
|
||||
result[result.length - 1].expected = "0(number):[object Object]first, -> exception";
|
||||
result[result.length - 1].expected = "0(string):[object Object]first, -> exception";
|
||||
function createArray(len, o) { var r = []; for (var i = 0; i < len; i++) r[i] = o; return r; }
|
||||
var getterCalls;
|
||||
var magicObject = createArray(10, {abcdefg: [1,2,5,"ab", null, undefined, true, false,,],
|
||||
|
@ -58,10 +58,10 @@ function (jsonObject){
|
||||
PASS tests[i](nativeJSON) is tests[i].expected
|
||||
function (jsonObject){
|
||||
var value = new Boolean(true);
|
||||
value.valueOf = function() { return 2; };
|
||||
value.valueOf = function() { return false; };
|
||||
return jsonObject.stringify(value);
|
||||
}
|
||||
FAIL tests[i](nativeJSON) should be 2. Was true.
|
||||
PASS tests[i](nativeJSON) is tests[i].expected
|
||||
function (jsonObject){
|
||||
var value = new String("fail");
|
||||
value.toString = function() { return "converted string"; };
|
||||
@ -91,7 +91,7 @@ PASS tests[i](nativeJSON) is tests[i](JSON)
|
||||
function (jsonObject){
|
||||
return jsonObject.stringify({toJSON: Date.prototype.toJSON, toISOString: function(){ return {}; }});
|
||||
}
|
||||
FAIL tests[i](nativeJSON) should throw an exception. Was {}.
|
||||
PASS tests[i](nativeJSON) is tests[i].expected
|
||||
function (jsonObject){
|
||||
return jsonObject.stringify({toJSON: Date.prototype.toJSON, toISOString: function(){ throw "An exception"; }});
|
||||
}
|
||||
@ -143,7 +143,7 @@ function (jsonObject){
|
||||
jsonObject.stringify([1,2,3,4,5], function(k,v){allString = allString && (typeof k == "string"); return v});
|
||||
return allString;
|
||||
}
|
||||
FAIL tests[i](nativeJSON) should be false. Was true.
|
||||
PASS tests[i](nativeJSON) is tests[i].expected
|
||||
function (jsonObject){
|
||||
var allString = true;
|
||||
var array = [];
|
||||
@ -355,11 +355,11 @@ PASS tests[i](nativeJSON) is tests[i](JSON)
|
||||
function (jsonObject){
|
||||
return jsonObject.stringify(objectWithSideEffectGetter);
|
||||
}
|
||||
FAIL tests[i](nativeJSON) should be {"foo":1}. Was {}.
|
||||
PASS tests[i](nativeJSON) is tests[i].expected
|
||||
function (jsonObject){
|
||||
return jsonObject.stringify(objectWithSideEffectGetterAndProto);
|
||||
}
|
||||
FAIL tests[i](nativeJSON) should be {"foo":1}. Was {}.
|
||||
PASS tests[i](nativeJSON) is tests[i].expected
|
||||
function (jsonObject){
|
||||
return jsonObject.stringify(arrayWithSideEffectGetter);
|
||||
}
|
||||
@ -373,7 +373,7 @@ function (jsonObject){
|
||||
jsonObject.stringify([1,2,3,,,,4,5,6], replaceFunc);
|
||||
return replaceTracker;
|
||||
}
|
||||
FAIL tests[i](nativeJSON) should be (string)[1,2,3,null,null,null,4,5,6];0(number)1;1(number)2;2(number)3;3(number)undefined;4(number)undefined;5(number)undefined;6(number)4;7(number)5;8(number)6;. Was (string)[1,2,3,null,null,null,4,5,6];0(string)1;1(string)2;2(string)3;3(string)undefined;4(string)undefined;5(string)undefined;6(string)4;7(string)5;8(string)6;.
|
||||
PASS tests[i](nativeJSON) is tests[i].expected
|
||||
function (jsonObject){
|
||||
replaceTracker = "";
|
||||
jsonObject.stringify({a:"a", b:"b", c:"c", 3: "d", 2: "e", 1: "f"}, replaceFunc);
|
||||
@ -451,7 +451,7 @@ function (jsonObject){
|
||||
try { jsonObject.stringify(cyclicArray); } catch { cycleTracker += " -> exception" }
|
||||
return cycleTracker;
|
||||
}
|
||||
FAIL tests[i](nativeJSON) should be 0(number):[object Object]first, -> exception. Was 0(string):[object Object]first, -> exception.
|
||||
PASS tests[i](nativeJSON) is tests[i].expected
|
||||
function (jsonObject){
|
||||
getterCalls = 0;
|
||||
return jsonObject.stringify(magicObject) + " :: getter calls = " + getterCalls;
|
||||
|
Loading…
Reference in New Issue
Block a user