a5380fe9ed
When the reviver returns undefined, the property in question must be deleted even for arrays. So far this only happened for non-array objects. Also change the property enumeration to be spec-conformant, which is observable when the reviver modifies its "this" object directly. There are a few further issues that need to be addressed in a separate CL. R=yangguo@chromium.org BUG= Review URL: https://codereview.chromium.org/1506933003 Cr-Commit-Position: refs/heads/master@{#32750}
143 lines
5.7 KiB
Plaintext
143 lines
5.7 KiB
Plaintext
# Copyright 2013 the V8 project authors. All rights reserved.
|
|
# Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions
|
|
# are met:
|
|
# 1. Redistributions of source code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
# documentation and/or other materials provided with the distribution.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
|
|
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
|
|
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
Test behaviour of JSON reviver function.
|
|
|
|
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
|
|
|
|
|
|
|
|
Ensure the holder for our array is indeed an array
|
|
PASS Array.isArray(currentHolder) is true
|
|
PASS currentHolder.length is 5
|
|
|
|
Ensure that the holder already has all the properties present at the start of filtering
|
|
PASS currentHolder[0] is "a value"
|
|
PASS currentHolder[1] is "another value"
|
|
PASS currentHolder[2] is "and another value"
|
|
PASS currentHolder[3] is "to delete"
|
|
PASS currentHolder[4] is "extra value"
|
|
|
|
Ensure the holder for our array is indeed an array
|
|
PASS Array.isArray(currentHolder) is true
|
|
PASS currentHolder.length is 5
|
|
|
|
Ensure that we always get the same holder
|
|
PASS currentHolder is lastHolder
|
|
|
|
Ensure that returning undefined has removed the property 0 from the holder during filtering.
|
|
PASS currentHolder.hasOwnProperty(0) is false
|
|
|
|
Ensure the holder for our array is indeed an array
|
|
PASS Array.isArray(currentHolder) is true
|
|
PASS currentHolder.length is 5
|
|
|
|
Ensure that we always get the same holder
|
|
PASS currentHolder is lastHolder
|
|
|
|
Ensure that changing the value of a property is reflected while filtering.
|
|
PASS currentHolder[2] is "a replaced value"
|
|
|
|
Ensure that the changed value is reflected in the arguments passed to the reviver
|
|
PASS value is currentHolder[2]
|
|
|
|
Ensure the holder for our array is indeed an array
|
|
PASS Array.isArray(currentHolder) is true
|
|
PASS currentHolder.length is 5
|
|
|
|
Ensure that we always get the same holder
|
|
PASS currentHolder is lastHolder
|
|
|
|
Ensure that we visited a value that we have deleted, and that deletion is reflected while filtering.
|
|
PASS currentHolder.hasOwnProperty(3) is false
|
|
|
|
Ensure that when visiting a deleted property value is undefined
|
|
PASS value is undefined.
|
|
|
|
Ensure the holder for our array is indeed an array
|
|
PASS Array.isArray(currentHolder) is true
|
|
PASS currentHolder.length is 4
|
|
|
|
Ensure that we always get the same holder
|
|
PASS currentHolder is lastHolder
|
|
PASS Ensured that property was visited despite Array length being reduced.
|
|
PASS value is undefined.
|
|
|
|
Ensure that we created the root holder as specified in ES5
|
|
PASS '' in lastHolder is true
|
|
PASS result is lastHolder['']
|
|
|
|
Ensure that a deleted value is revived if the reviver function returns a value
|
|
PASS result.hasOwnProperty(3) is true
|
|
|
|
Test behaviour of revivor used in conjunction with an object
|
|
PASS currentHolder != globalObject is true
|
|
|
|
Ensure that the holder already has all the properties present at the start of filtering
|
|
PASS currentHolder['a property'] is "a value"
|
|
PASS currentHolder['another property'] is "another value"
|
|
PASS currentHolder['and another property'] is "and another value"
|
|
PASS currentHolder['to delete'] is "will be deleted"
|
|
PASS currentHolder != globalObject is true
|
|
|
|
Ensure that we get the same holder object for each property
|
|
PASS currentHolder is lastHolder
|
|
|
|
Ensure that returning undefined has correctly removed the property 'a property' from the holder object
|
|
PASS currentHolder.hasOwnProperty('a property') is false
|
|
PASS currentHolder != globalObject is true
|
|
|
|
Ensure that we get the same holder object for each property
|
|
PASS currentHolder is lastHolder
|
|
Ensure that changing the value of a property is reflected while filtering.
|
|
PASS currentHolder['and another property'] is "a replaced value"
|
|
|
|
Ensure that the changed value is reflected in the arguments passed to the reviver
|
|
PASS value is "a replaced value"
|
|
PASS currentHolder != globalObject is true
|
|
|
|
Ensure that we get the same holder object for each property
|
|
PASS currentHolder is lastHolder
|
|
|
|
Ensure that we visited a value that we have deleted, and that deletion is reflected while filtering.
|
|
PASS currentHolder.hasOwnProperty('to delete') is false
|
|
|
|
Ensure that when visiting a deleted property value is undefined
|
|
PASS value is undefined.
|
|
|
|
Ensure that we created the root holder as specified in ES5
|
|
PASS lastHolder.hasOwnProperty('') is true
|
|
PASS result.hasOwnProperty('a property') is false
|
|
PASS result.hasOwnProperty('to delete') is true
|
|
PASS result is lastHolder['']
|
|
|
|
Test behaviour of revivor that introduces a cycle
|
|
PASS JSON.parse("[0,1]", reviveAddsCycle) threw exception RangeError: Maximum call stack size exceeded.
|
|
|
|
Test behaviour of revivor that introduces a new array classed object (the result of a regex)
|
|
PASS JSON.stringify(JSON.parse("[0,1]", reviveIntroducesNewArrayLikeObject)) is '[0,["a","a"]]'
|
|
PASS successfullyParsed is true
|
|
|
|
TEST COMPLETE
|
|
|