Chromium Code Reviews| Index: test/mjsunit/json.js |
| diff --git a/test/mjsunit/json.js b/test/mjsunit/json.js |
| index 1c55959d5fcd86a67898d3922ff1d4ee958dcfa3..f0631b2a4ceaa2a09d67fa27ec66ce79d9036f8b 100644 |
| --- a/test/mjsunit/json.js |
| +++ b/test/mjsunit/json.js |
| @@ -25,45 +25,6 @@ |
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| -function GenericToJSONChecks(Constructor, value, alternative) { |
| - var n1 = new Constructor(value); |
| - n1.valueOf = function () { return alternative; }; |
| - assertEquals(alternative, n1.toJSON()); |
| - var n2 = new Constructor(value); |
| - n2.valueOf = null; |
| - assertThrows(function () { n2.toJSON(); }, TypeError); |
| - var n3 = new Constructor(value); |
| - n3.valueOf = function () { return {}; }; |
| - assertThrows(function () { n3.toJSON(); }, TypeError, 'result_not_primitive'); |
| - var n4 = new Constructor(value); |
| - n4.valueOf = function () { |
| - assertEquals(0, arguments.length); |
| - assertEquals(this, n4); |
| - return null; |
| - }; |
| - assertEquals(null, n4.toJSON()); |
| -} |
| - |
| -// Number toJSON |
| -assertEquals(3, (3).toJSON()); |
| -assertEquals(3, (3).toJSON(true)); |
| -assertEquals(4, (new Number(4)).toJSON()); |
| -GenericToJSONChecks(Number, 5, 6); |
| - |
| -// Boolean toJSON |
| -assertEquals(true, (true).toJSON()); |
| -assertEquals(true, (true).toJSON(false)); |
| -assertEquals(false, (false).toJSON()); |
| -assertEquals(true, (new Boolean(true)).toJSON()); |
| -GenericToJSONChecks(Boolean, true, false); |
| -GenericToJSONChecks(Boolean, false, true); |
| - |
| -// String toJSON |
| -assertEquals("flot", "flot".toJSON()); |
| -assertEquals("flot", "flot".toJSON(3)); |
| -assertEquals("tolf", (new String("tolf")).toJSON()); |
| -GenericToJSONChecks(String, "x", "y"); |
| - |
| // Date toJSON |
| assertEquals("1970-01-01T00:00:00.000Z", new Date(0).toJSON()); |
| assertEquals("1979-01-11T08:00:00.000Z", new Date("1979-01-11 08:00 GMT").toJSON()); |
| @@ -74,9 +35,6 @@ assertEquals("foo", n1.toJSON()); |
| var n2 = new Date(10001); |
| n2.toISOString = null; |
| assertThrows(function () { n2.toJSON(); }, TypeError); |
| -var n3 = new Date(10002); |
| -n3.toISOString = function () { return {}; }; |
| -assertThrows(function () { n3.toJSON(); }, TypeError, "result_not_primitive"); |
| var n4 = new Date(10003); |
| n4.toISOString = function () { |
| assertEquals(0, arguments.length); |
| @@ -88,6 +46,39 @@ assertEquals(null, n4.toJSON()); |
| assertTrue(Object.prototype === JSON.__proto__); |
| assertEquals("[object JSON]", Object.prototype.toString.call(JSON)); |
| +//Test Date.prototype.toJSON as generic function. |
| +var d = {toJSON: Date.prototype.toJSON, |
| + toISOString: function() { return 42; }}; |
| +assertEquals(42, d.toJSON()); |
| + |
| +var d2 = {toJSON: Date.prototype.toJSON, |
| + valueOf: function() { return Infinity; }, |
| + toISOString: function() { return 42; }}; |
| +assertEquals(null, d2.toJSON()); |
| + |
| +var d3 = {toJSON: Date.prototype.toJSON, |
| + valueOf: "not callable", |
| + toString: function() { return Infinity; }, |
| + toISOString: function() { return 42; }}; |
| + |
| +assertEquals(null, d3.toJSON()); |
| + |
| +var d4 = {toJSON: Date.prototype.toJSON, |
| + valueOf: "not callable", |
| + toString: "not callable either", |
| + toISOString: function() { return 42; }}; |
| +assertThrows("d4.toJSON()"); // ToPrimitive throws. |
| + |
| +var d5 = {toJSON: Date.prototype.toJSON, |
| + valueOf: "not callable", |
| + toString: function() { return "Infinity"; }, |
| + toISOString: function() { return 42; }}; |
| +assertEquals(42, d5.toJSON()); |
| + |
| +var d6 = {toJSON: Date.prototype.toJSON, |
| + toISOString: function() { return ["not primitive"]; }}; |
| +assertEquals(["not primitive"], d6.toJSON()); |
| + |
|
Rico
2010/12/15 09:17:04
Add a test that we throw an exception if we have a
Lasse Reichstein
2010/12/15 09:29:41
Added test:
var d7 = {toJSON: Date.prototype.toJS
|
| // DontEnum |
| for (var p in this) |
| assertFalse(p == "JSON"); |
| @@ -286,7 +277,7 @@ assertEquals('["10"]', JSON.stringify(array)); |
| // The gap is capped at ten characters if specified as string. |
| assertEquals('{\n "a": "b",\n "c": "d"\n}', |
| - JSON.stringify({a:"b",c:"d"}, null, |
| + JSON.stringify({a:"b",c:"d"}, null, |
| " /*characters after 10th*/")); |
| //The gap is capped at ten characters if specified as number. |
| @@ -301,16 +292,16 @@ assertEquals('{"x":true}', JSON.stringify({x: Boolean}, newx)); |
| assertEquals(undefined, JSON.stringify(undefined)); |
| assertEquals(undefined, JSON.stringify(function () { })); |
| -// Arrays with missing, undefined or function elements have those elements |
| +// Arrays with missing, undefined or function elements have those elements |
| // replaced by null. |
| -assertEquals("[null,null,null]", |
| +assertEquals("[null,null,null]", |
| JSON.stringify([undefined,,function(){}])); |
| // Objects with undefined or function properties (including replaced properties) |
| // have those properties ignored. |
| -assertEquals('{}', |
| +assertEquals('{}', |
| JSON.stringify({a: undefined, b: function(){}, c: 42, d: 42}, |
| - function(k, v) { if (k == "c") return undefined; |
| + function(k, v) { if (k == "c") return undefined; |
| if (k == "d") return function(){}; |
| return v; })); |
| @@ -334,7 +325,7 @@ for (var i = 0; i < 65536; i++) { |
| // Step 2.a |
| expected = '\\' + string; |
| } else if ("\b\t\n\r\f".indexOf(string) >= 0) { |
| - // Step 2.b |
| + // Step 2.b |
| if (string == '\b') expected = '\\b'; |
| else if (string == '\t') expected = '\\t'; |
| else if (string == '\n') expected = '\\n'; |
| @@ -349,6 +340,73 @@ for (var i = 0; i < 65536; i++) { |
| } |
| } else { |
| expected = string; |
| - } |
| + } |
| assertEquals('"' + expected + '"', encoded, "Codepoint " + i); |
| -} |
| +} |
| + |
| + |
| +// Ensure that wrappers and callables are handled correctly. |
| +var num37 = new Number(42); |
| +num37.valueOf = function() { return 37; }; |
| + |
| +var numFoo = new Number(42); |
| +numFoo.valueOf = "not callable"; |
| +numFoo.toString = function() { return "foo"; }; |
| + |
| +var numTrue = new Number(42); |
| +numTrue.valueOf = function() { return true; } |
| + |
| +var strFoo = new String("bar"); |
| +strFoo.toString = function() { return "foo"; }; |
| + |
| +var str37 = new String("bar"); |
| +str37.toString = "not callable"; |
| +str37.valueOf = function() { return 37; }; |
| + |
| +var strTrue = new String("bar"); |
| +strTrue.toString = function() { return true; } |
| + |
| +var func = function() { /* Is callable */ }; |
| + |
| +var funcJSON = function() { /* Is callable */ }; |
| +funcJSON.toJSON = function() { return "has toJSON"; }; |
| + |
| +var re = /Is callable/; |
| + |
| +var reJSON = /Is callable/; |
| +reJSON.toJSON = function() { return "has toJSON"; }; |
| + |
| +assertEquals( |
| + '[37,null,1,"foo","37","true",null,"has toJSON",null,"has toJSON"]', |
| + JSON.stringify([num37, numFoo, numTrue, |
| + strFoo, str37, strTrue, |
| + func, funcJSON, re, reJSON])); |
| + |
| + |
| +var oddball = Object(42); |
| +oddball.__proto__ = { __proto__: null, toString: function() { return true; } }; |
| +assertEquals('1', JSON.stringify(oddball)); |
| + |
| +var getCount = 0; |
| +var callCount = 0; |
| +var counter = { get toJSON() { getCount++; |
| + return function() { callCount++; |
| + return 42; }; } }; |
| +assertEquals('42', JSON.stringify(counter)); |
| +assertEquals(1, getCount); |
| +assertEquals(1, callCount); |
| + |
| +var oddball2 = Object(42); |
| +var oddball3 = Object("foo"); |
| +oddball3.__proto__ = { __proto__: null, |
| + toString: "not callable", |
| + valueOf: function() { return true; } }; |
| +oddball2.__proto__ = { __proto__: null, |
| + toJSON: function () { return oddball3; } } |
| +assertEquals('"true"', JSON.stringify(oddball2)); |
| + |
| + |
| +var falseNum = Object("37"); |
| +falseNum.__proto__ = Number.prototype; |
| +falseNum.toString = function() { return 42; }; |
| +assertEquals('"42"', JSON.stringify(falseNum)); |