|  | // Copyright 2016 the V8 project authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | (function testBasic() { | 
|  | var stack = []; | 
|  | var object = {a: false}; | 
|  | var replaced = {a: false, replaced: true}; | 
|  |  | 
|  | function replacer(key, value) { | 
|  | stack.push({ holder: this, key, value }); | 
|  | if (stack.length === 1) return replaced; | 
|  | if (key === "a") return true; | 
|  | return value; | 
|  | } | 
|  |  | 
|  | assertEquals(`{"a":true,"replaced":true}`, JSON.stringify(object, replacer)); | 
|  |  | 
|  | assertEquals([ | 
|  | { | 
|  | holder: { "": { a: false } }, | 
|  | key: "", | 
|  | value: { a: false } | 
|  | }, | 
|  | { | 
|  | holder: { a: false, replaced: true }, | 
|  | key: "a", | 
|  | value: false | 
|  | }, | 
|  | { | 
|  | holder: { a: false, replaced: true }, | 
|  | key: "replaced", | 
|  | value: true | 
|  | } | 
|  | ], stack); | 
|  |  | 
|  | assertSame(stack[0].holder[""], object); | 
|  | assertSame(stack[0].value, object); | 
|  | assertSame(stack[1].holder, replaced); | 
|  | assertSame(stack[2].holder, replaced); | 
|  | })(); | 
|  |  | 
|  | (function testToJSON() { | 
|  | var stack = []; | 
|  | var object = {a: false, toJSON }; | 
|  | var nested = { toJSON: nestedToJSON }; | 
|  | var replaced = {a: false, replaced: true, nested }; | 
|  | var toJSONd = {a: false, toJSONd: true } | 
|  | var nestedToJSONd = { nestedToJSONd: true }; | 
|  |  | 
|  | function toJSON(key, value) { | 
|  | return toJSONd; | 
|  | } | 
|  |  | 
|  | function nestedToJSON(key, value) { | 
|  | return nestedToJSONd; | 
|  | } | 
|  |  | 
|  | function replacer(key, value) { | 
|  | stack.push({ holder: this, key, value }); | 
|  | if (stack.length === 1) return replaced; | 
|  | if (key === "a") return true; | 
|  | return value; | 
|  | } | 
|  |  | 
|  | assertEquals(`{"a":true,"replaced":true,"nested":{"nestedToJSONd":true}}`, | 
|  | JSON.stringify(object, replacer)); | 
|  |  | 
|  | assertEquals([ | 
|  | { | 
|  | holder: { "": { a: false, toJSON: toJSON } }, | 
|  | key: "", | 
|  | value: { a: false, toJSONd: true } | 
|  | }, | 
|  | { | 
|  | holder: { a: false, replaced: true, nested: { toJSON: nestedToJSON } }, | 
|  | key: "a", | 
|  | value: false | 
|  | }, | 
|  | { | 
|  | holder: { a: false, replaced: true, nested: { toJSON: nestedToJSON } }, | 
|  | key: "replaced", | 
|  | value: true | 
|  | }, | 
|  | { | 
|  | holder: { a: false, replaced: true, nested: { toJSON: nestedToJSON } }, | 
|  | key: "nested", | 
|  | value: { nestedToJSONd: true } | 
|  | }, | 
|  | { | 
|  | holder: { nestedToJSONd: true }, | 
|  | key: "nestedToJSONd", | 
|  | value: true | 
|  | } | 
|  | ], stack); | 
|  |  | 
|  | assertSame(stack[0].holder[""], object); | 
|  | assertSame(stack[0].value, toJSONd); | 
|  | assertSame(stack[1].holder, replaced); | 
|  | assertSame(stack[2].holder, replaced); | 
|  | assertSame(stack[3].holder, replaced); | 
|  | assertSame(stack[3].value, nestedToJSONd); | 
|  | assertSame(stack[4].holder, nestedToJSONd); | 
|  | })(); |