Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
32e3fdc2
Commit
32e3fdc2
authored
May 14, 2011
by
Ezio Melotti
Browse files
Options
Browse Files
Download
Plain Diff
#5723: merge with 3.2.
parents
4e03e9dc
6b60fb91
Changes
19
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
253 additions
and
218 deletions
+253
-218
Lib/json/decoder.py
Lib/json/decoder.py
+2
-2
Lib/test/json_tests/__init__.py
Lib/test/json_tests/__init__.py
+42
-4
Lib/test/json_tests/test_decode.py
Lib/test/json_tests/test_decode.py
+20
-35
Lib/test/json_tests/test_default.py
Lib/test/json_tests/test_default.py
+8
-5
Lib/test/json_tests/test_dump.py
Lib/test/json_tests/test_dump.py
+10
-7
Lib/test/json_tests/test_encode_basestring_ascii.py
Lib/test/json_tests/test_encode_basestring_ascii.py
+12
-18
Lib/test/json_tests/test_fail.py
Lib/test/json_tests/test_fail.py
+10
-8
Lib/test/json_tests/test_float.py
Lib/test/json_tests/test_float.py
+10
-7
Lib/test/json_tests/test_indent.py
Lib/test/json_tests/test_indent.py
+15
-13
Lib/test/json_tests/test_pass1.py
Lib/test/json_tests/test_pass1.py
+10
-7
Lib/test/json_tests/test_pass2.py
Lib/test/json_tests/test_pass2.py
+10
-6
Lib/test/json_tests/test_pass3.py
Lib/test/json_tests/test_pass3.py
+10
-6
Lib/test/json_tests/test_recursion.py
Lib/test/json_tests/test_recursion.py
+31
-29
Lib/test/json_tests/test_scanstring.py
Lib/test/json_tests/test_scanstring.py
+10
-19
Lib/test/json_tests/test_separators.py
Lib/test/json_tests/test_separators.py
+10
-8
Lib/test/json_tests/test_speedups.py
Lib/test/json_tests/test_speedups.py
+12
-17
Lib/test/json_tests/test_unicode.py
Lib/test/json_tests/test_unicode.py
+27
-25
Lib/test/support.py
Lib/test/support.py
+2
-2
Misc/NEWS
Misc/NEWS
+2
-0
No files found.
Lib/json/decoder.py
View file @
32e3fdc2
...
...
@@ -5,7 +5,7 @@ import re
import
sys
import
struct
from
json
.scanner
import
make_
scanner
from
json
import
scanner
try
:
from
_json
import
scanstring
as
c_scanstring
except
ImportError
:
...
...
@@ -340,7 +340,7 @@ class JSONDecoder(object):
self
.
parse_array
=
JSONArray
self
.
parse_string
=
scanstring
self
.
memo
=
{}
self
.
scan_once
=
make_scanner
(
self
)
self
.
scan_once
=
scanner
.
make_scanner
(
self
)
def
decode
(
self
,
s
,
_w
=
WHITESPACE
.
match
):
...
...
Lib/test/json_tests/__init__.py
View file @
32e3fdc2
import
os
import
sys
import
unittest
import
json
import
doctest
import
unittest
from
test
import
support
# import json with and without accelerations
cjson
=
support
.
import_fresh_module
(
'json'
,
fresh
=
[
'_json'
])
pyjson
=
support
.
import_fresh_module
(
'json'
,
blocked
=
[
'_json'
])
# create two base classes that will be used by the other tests
class
PyTest
(
unittest
.
TestCase
):
json
=
pyjson
loads
=
staticmethod
(
pyjson
.
loads
)
dumps
=
staticmethod
(
pyjson
.
dumps
)
@
unittest
.
skipUnless
(
cjson
,
'requires _json'
)
class
CTest
(
unittest
.
TestCase
):
if
cjson
is
not
None
:
json
=
cjson
loads
=
staticmethod
(
cjson
.
loads
)
dumps
=
staticmethod
(
cjson
.
dumps
)
# test PyTest and CTest checking if the functions come from the right module
class
TestPyTest
(
PyTest
):
def
test_pyjson
(
self
):
self
.
assertEqual
(
self
.
json
.
scanner
.
make_scanner
.
__module__
,
'json.scanner'
)
self
.
assertEqual
(
self
.
json
.
decoder
.
scanstring
.
__module__
,
'json.decoder'
)
self
.
assertEqual
(
self
.
json
.
encoder
.
encode_basestring_ascii
.
__module__
,
'json.encoder'
)
class
TestCTest
(
CTest
):
def
test_cjson
(
self
):
self
.
assertEqual
(
self
.
json
.
scanner
.
make_scanner
.
__module__
,
'_json'
)
self
.
assertEqual
(
self
.
json
.
decoder
.
scanstring
.
__module__
,
'_json'
)
self
.
assertEqual
(
self
.
json
.
encoder
.
c_make_encoder
.
__module__
,
'_json'
)
self
.
assertEqual
(
self
.
json
.
encoder
.
encode_basestring_ascii
.
__module__
,
'_json'
)
here
=
os
.
path
.
dirname
(
__file__
)
...
...
@@ -17,12 +56,11 @@ def test_suite():
return
suite
def
additional_tests
():
import
json
import
json.encoder
import
json.decoder
suite
=
unittest
.
TestSuite
()
for
mod
in
(
json
,
json
.
encoder
,
json
.
decoder
):
suite
.
addTest
(
doctest
.
DocTestSuite
(
mod
))
suite
.
addTest
(
TestPyTest
(
'test_pyjson'
))
suite
.
addTest
(
TestCTest
(
'test_cjson'
))
return
suite
def
main
():
...
...
Lib/test/json_tests/test_decode.py
View file @
32e3fdc2
import
decimal
from
unittest
import
TestCase
from
io
import
StringIO
from
contextlib
import
contextmanager
import
json
import
json.decoder
import
json.scanner
from
collections
import
OrderedDict
from
test.json_tests
import
PyTest
,
CTest
@
contextmanager
def
use_python_scanner
():
py_scanner
=
json
.
scanner
.
py_make_scanner
old_scanner
=
json
.
decoder
.
make_scanner
json
.
decoder
.
make_scanner
=
py_scanner
try
:
yield
finally
:
json
.
decoder
.
make_scanner
=
old_scanner
class
TestDecode
(
TestCase
):
class
TestDecode
:
def
test_decimal
(
self
):
rval
=
json
.
loads
(
'1.1'
,
parse_float
=
decimal
.
Decimal
)
rval
=
self
.
loads
(
'1.1'
,
parse_float
=
decimal
.
Decimal
)
self
.
assertTrue
(
isinstance
(
rval
,
decimal
.
Decimal
))
self
.
assertEqual
(
rval
,
decimal
.
Decimal
(
'1.1'
))
def
test_float
(
self
):
rval
=
json
.
loads
(
'1'
,
parse_int
=
float
)
rval
=
self
.
loads
(
'1'
,
parse_int
=
float
)
self
.
assertTrue
(
isinstance
(
rval
,
float
))
self
.
assertEqual
(
rval
,
1.0
)
def
test_empty_objects
(
self
):
self
.
assertEqual
(
json
.
loads
(
'{}'
),
{})
self
.
assertEqual
(
json
.
loads
(
'[]'
),
[])
self
.
assertEqual
(
json
.
loads
(
'""'
),
""
)
self
.
assertEqual
(
self
.
loads
(
'{}'
),
{})
self
.
assertEqual
(
self
.
loads
(
'[]'
),
[])
self
.
assertEqual
(
self
.
loads
(
'""'
),
""
)
def
test_object_pairs_hook
(
self
):
s
=
'{"xkd":1, "kcw":2, "art":3, "hxm":4, "qrt":5, "pad":6, "hoy":7}'
p
=
[(
"xkd"
,
1
),
(
"kcw"
,
2
),
(
"art"
,
3
),
(
"hxm"
,
4
),
(
"qrt"
,
5
),
(
"pad"
,
6
),
(
"hoy"
,
7
)]
self
.
assertEqual
(
json
.
loads
(
s
),
eval
(
s
))
self
.
assertEqual
(
json
.
loads
(
s
,
object_pairs_hook
=
lambda
x
:
x
),
p
)
self
.
assertEqual
(
json
.
load
(
StringIO
(
s
),
object_pairs_hook
=
lambda
x
:
x
),
p
)
od
=
json
.
loads
(
s
,
object_pairs_hook
=
OrderedDict
)
self
.
assertEqual
(
self
.
loads
(
s
),
eval
(
s
))
self
.
assertEqual
(
self
.
loads
(
s
,
object_pairs_hook
=
lambda
x
:
x
),
p
)
self
.
assertEqual
(
self
.
json
.
load
(
StringIO
(
s
),
object_pairs_hook
=
lambda
x
:
x
),
p
)
od
=
self
.
loads
(
s
,
object_pairs_hook
=
OrderedDict
)
self
.
assertEqual
(
od
,
OrderedDict
(
p
))
self
.
assertEqual
(
type
(
od
),
OrderedDict
)
# the object_pairs_hook takes priority over the object_hook
self
.
assertEqual
(
json
.
loads
(
s
,
object_pairs_hook
=
OrderedDict
,
self
.
assertEqual
(
self
.
loads
(
s
,
object_pairs_hook
=
OrderedDict
,
object_hook
=
lambda
x
:
None
),
OrderedDict
(
p
))
...
...
@@ -57,7 +40,7 @@ class TestDecode(TestCase):
# Several optimizations were made that skip over calls to
# the whitespace regex, so this test is designed to try and
# exercise the uncommon cases. The array cases are already covered.
rval
=
json
.
loads
(
'{ "key" : "value" , "k":"v" }'
)
rval
=
self
.
loads
(
'{ "key" : "value" , "k":"v" }'
)
self
.
assertEqual
(
rval
,
{
"key"
:
"value"
,
"k"
:
"v"
})
def
check_keys_reuse
(
self
,
source
,
loads
):
...
...
@@ -68,7 +51,9 @@ class TestDecode(TestCase):
def
test_keys_reuse
(
self
):
s
=
'[{"a_key": 1, "b_
\
xe9
": 2}, {"a_key": 3, "b_
\
xe9
": 4}]'
self
.
check_keys_reuse
(
s
,
json
.
loads
)
# Disabled: the pure Python version of json simply doesn't work
with
use_python_scanner
():
self
.
check_keys_reuse
(
s
,
json
.
decoder
.
JSONDecoder
().
decode
)
self
.
check_keys_reuse
(
s
,
self
.
loads
)
self
.
check_keys_reuse
(
s
,
self
.
json
.
decoder
.
JSONDecoder
().
decode
)
class
TestPyDecode
(
TestDecode
,
PyTest
):
pass
class
TestCDecode
(
TestDecode
,
CTest
):
pass
Lib/test/json_tests/test_default.py
View file @
32e3fdc2
from
unittest
import
TestCase
from
test.json_tests
import
PyTest
,
CTest
import
json
class
TestDefault
(
TestCase
)
:
class
TestDefault
:
def
test_default
(
self
):
self
.
assertEqual
(
json
.
dumps
(
type
,
default
=
repr
),
json
.
dumps
(
repr
(
type
)))
self
.
dumps
(
type
,
default
=
repr
),
self
.
dumps
(
repr
(
type
)))
class
TestPyDefault
(
TestDefault
,
PyTest
):
pass
class
TestCDefault
(
TestDefault
,
CTest
):
pass
Lib/test/json_tests/test_dump.py
View file @
32e3fdc2
from
unittest
import
TestCase
from
io
import
StringIO
from
test.json_tests
import
PyTest
,
CTest
import
json
class
TestDump
(
TestCase
)
:
class
TestDump
:
def
test_dump
(
self
):
sio
=
StringIO
()
json
.
dump
({},
sio
)
self
.
json
.
dump
({},
sio
)
self
.
assertEqual
(
sio
.
getvalue
(),
'{}'
)
def
test_dumps
(
self
):
self
.
assertEqual
(
json
.
dumps
({}),
'{}'
)
self
.
assertEqual
(
self
.
dumps
({}),
'{}'
)
def
test_encode_truefalse
(
self
):
self
.
assertEqual
(
json
.
dumps
(
self
.
assertEqual
(
self
.
dumps
(
{
True
:
False
,
False
:
True
},
sort_keys
=
True
),
'{"false": true, "true": false}'
)
self
.
assertEqual
(
json
.
dumps
(
self
.
assertEqual
(
self
.
dumps
(
{
2
:
3.0
,
4.0
:
5
,
False
:
1
,
6
:
True
},
sort_keys
=
True
),
'{"false": 1, "2": 3.0, "4.0": 5, "6": true}'
)
class
TestPyDump
(
TestDump
,
PyTest
):
pass
class
TestCDump
(
TestDump
,
CTest
):
pass
Lib/test/json_tests/test_encode_basestring_ascii.py
View file @
32e3fdc2
from
unittest
import
TestCase
import
json.encoder
from
json
import
dumps
from
collections
import
OrderedDict
from
test.json_tests
import
PyTest
,
CTest
CASES
=
[
(
'/
\
\
"
\
ucafe
\
ubabe
\
uab98
\
ufcde
\
ubcda
\
uef4a
\
x08
\
x0c
\
n
\
r
\
t
`1~!@#$%^&*()_+-=[]{}|;:
\
'
,./<>?'
,
'"/
\
\
\
\
\
\
"
\
\
ucafe
\
\
ubabe
\
\
uab98
\
\
ufcde
\
\
ubcda
\
\
uef4a
\
\
b
\
\
f
\
\
n
\
\
r
\
\
t`1~!@#$%^&*()_+-=[]{}|;:
\
'
,./<>?"'
),
...
...
@@ -21,19 +19,11 @@ CASES = [
(
'
\
u0123
\
u4567
\
u89ab
\
ucdef
\
uabcd
\
uef4a
'
,
'"
\
\
u0123
\
\
u4567
\
\
u89ab
\
\
ucdef
\
\
uabcd
\
\
uef4a"'
),
]
class
TestEncodeBaseStringAscii
(
TestCase
):
def
test_py_encode_basestring_ascii
(
self
):
self
.
_test_encode_basestring_ascii
(
json
.
encoder
.
py_encode_basestring_ascii
)
def
test_c_encode_basestring_ascii
(
self
):
if
not
json
.
encoder
.
c_encode_basestring_ascii
:
return
self
.
_test_encode_basestring_ascii
(
json
.
encoder
.
c_encode_basestring_ascii
)
def
_test_encode_basestring_ascii
(
self
,
encode_basestring_ascii
):
fname
=
encode_basestring_ascii
.
__name__
class
TestEncodeBasestringAscii
:
def
test_encode_basestring_ascii
(
self
):
fname
=
self
.
json
.
encoder
.
encode_basestring_ascii
.
__name__
for
input_string
,
expect
in
CASES
:
result
=
encode_basestring_ascii
(
input_string
)
result
=
self
.
json
.
encoder
.
encode_basestring_ascii
(
input_string
)
self
.
assertEqual
(
result
,
expect
,
'{0!r} != {1!r} for {2}({3!r})'
.
format
(
result
,
expect
,
fname
,
input_string
))
...
...
@@ -41,10 +31,14 @@ class TestEncodeBaseStringAscii(TestCase):
def
test_ordered_dict
(
self
):
# See issue 6105
items
=
[(
'one'
,
1
),
(
'two'
,
2
),
(
'three'
,
3
),
(
'four'
,
4
),
(
'five'
,
5
)]
s
=
json
.
dumps
(
OrderedDict
(
items
))
s
=
self
.
dumps
(
OrderedDict
(
items
))
self
.
assertEqual
(
s
,
'{"one": 1, "two": 2, "three": 3, "four": 4, "five": 5}'
)
def
test_sorted_dict
(
self
):
items
=
[(
'one'
,
1
),
(
'two'
,
2
),
(
'three'
,
3
),
(
'four'
,
4
),
(
'five'
,
5
)]
s
=
json
.
dumps
(
dict
(
items
),
sort_keys
=
True
)
s
=
self
.
dumps
(
dict
(
items
),
sort_keys
=
True
)
self
.
assertEqual
(
s
,
'{"five": 5, "four": 4, "one": 1, "three": 3, "two": 2}'
)
class
TestPyEncodeBasestringAscii
(
TestEncodeBasestringAscii
,
PyTest
):
pass
class
TestCEncodeBasestringAscii
(
TestEncodeBasestringAscii
,
CTest
):
pass
Lib/test/json_tests/test_fail.py
View file @
32e3fdc2
from
unittest
import
TestCase
import
json
from
test.json_tests
import
PyTest
,
CTest
# Fri Dec 30 18:57:26 2005
JSONDOCS
=
[
...
...
@@ -61,15 +59,15 @@ SKIPS = {
18
:
"spec doesn't specify any nesting limitations"
,
}
class
TestFail
(
TestCase
)
:
class
TestFail
:
def
test_failures
(
self
):
for
idx
,
doc
in
enumerate
(
JSONDOCS
):
idx
=
idx
+
1
if
idx
in
SKIPS
:
json
.
loads
(
doc
)
self
.
loads
(
doc
)
continue
try
:
json
.
loads
(
doc
)
self
.
loads
(
doc
)
except
ValueError
:
pass
else
:
...
...
@@ -79,7 +77,11 @@ class TestFail(TestCase):
data
=
{
'a'
:
1
,
(
1
,
2
)
:
2
}
#This is for c encoder
self
.
assertRaises
(
TypeError
,
json
.
dumps
,
data
)
self
.
assertRaises
(
TypeError
,
self
.
dumps
,
data
)
#This is for python encoder
self
.
assertRaises
(
TypeError
,
json
.
dumps
,
data
,
indent
=
True
)
self
.
assertRaises
(
TypeError
,
self
.
dumps
,
data
,
indent
=
True
)
class
TestPyFail
(
TestFail
,
PyTest
):
pass
class
TestCFail
(
TestFail
,
CTest
):
pass
Lib/test/json_tests/test_float.py
View file @
32e3fdc2
import
math
from
unittest
import
TestCase
from
test.json_tests
import
PyTest
,
CTest
import
json
class
TestFloat
(
TestCase
)
:
class
TestFloat
:
def
test_floats
(
self
):
for
num
in
[
1617161771.7650001
,
math
.
pi
,
math
.
pi
**
100
,
math
.
pi
**-
100
,
3.1
]:
self
.
assertEqual
(
float
(
json
.
dumps
(
num
)),
num
)
self
.
assertEqual
(
json
.
loads
(
json
.
dumps
(
num
)),
num
)
self
.
assertEqual
(
float
(
self
.
dumps
(
num
)),
num
)
self
.
assertEqual
(
self
.
loads
(
self
.
dumps
(
num
)),
num
)
def
test_ints
(
self
):
for
num
in
[
1
,
1
<<
32
,
1
<<
64
]:
self
.
assertEqual
(
json
.
dumps
(
num
),
str
(
num
))
self
.
assertEqual
(
int
(
json
.
dumps
(
num
)),
num
)
self
.
assertEqual
(
self
.
dumps
(
num
),
str
(
num
))
self
.
assertEqual
(
int
(
self
.
dumps
(
num
)),
num
)
class
TestPyFloat
(
TestFloat
,
PyTest
):
pass
class
TestCFloat
(
TestFloat
,
CTest
):
pass
Lib/test/json_tests/test_indent.py
View file @
32e3fdc2
from
unittest
import
TestCase
import
json
import
textwrap
from
io
import
StringIO
from
test.json_tests
import
PyTest
,
CTest
class
TestIndent
(
TestCase
)
:
class
TestIndent
:
def
test_indent
(
self
):
h
=
[[
'blorpie'
],
[
'whoops'
],
[],
'd-shtaeou'
,
'd-nthiouh'
,
'i-vhbjkhnth'
,
{
'nifty'
:
87
},
{
'field'
:
'yes'
,
'morefield'
:
False
}
]
...
...
@@ -30,14 +29,13 @@ class TestIndent(TestCase):
\
t
}
]"""
)
d1
=
self
.
dumps
(
h
)
d2
=
self
.
dumps
(
h
,
indent
=
2
,
sort_keys
=
True
,
separators
=
(
','
,
': '
))
d3
=
self
.
dumps
(
h
,
indent
=
'
\
t
'
,
sort_keys
=
True
,
separators
=
(
','
,
': '
))
d1
=
json
.
dumps
(
h
)
d2
=
json
.
dumps
(
h
,
indent
=
2
,
sort_keys
=
True
,
separators
=
(
','
,
': '
))
d3
=
json
.
dumps
(
h
,
indent
=
'
\
t
'
,
sort_keys
=
True
,
separators
=
(
','
,
': '
))
h1
=
json
.
loads
(
d1
)
h2
=
json
.
loads
(
d2
)
h3
=
json
.
loads
(
d3
)
h1
=
self
.
loads
(
d1
)
h2
=
self
.
loads
(
d2
)
h3
=
self
.
loads
(
d3
)
self
.
assertEqual
(
h1
,
h
)
self
.
assertEqual
(
h2
,
h
)
...
...
@@ -48,14 +46,18 @@ class TestIndent(TestCase):
def
test_indent0
(
self
):
h
=
{
3
:
1
}
def
check
(
indent
,
expected
):
d1
=
json
.
dumps
(
h
,
indent
=
indent
)
d1
=
self
.
dumps
(
h
,
indent
=
indent
)
self
.
assertEqual
(
d1
,
expected
)
sio
=
StringIO
()
json
.
dump
(
h
,
sio
,
indent
=
indent
)
self
.
json
.
dump
(
h
,
sio
,
indent
=
indent
)
self
.
assertEqual
(
sio
.
getvalue
(),
expected
)
# indent=0 should emit newlines
check
(
0
,
'{
\
n
"3": 1
\
n
}'
)
# indent=None is more compact
check
(
None
,
'{"3": 1}'
)
class
TestPyIndent
(
TestIndent
,
PyTest
):
pass
class
TestCIndent
(
TestIndent
,
CTest
):
pass
Lib/test/json_tests/test_pass1.py
View file @
32e3fdc2
from
unittest
import
TestCase
from
test.json_tests
import
PyTest
,
CTest
import
json
# from http://json.org/JSON_checker/test/pass1.json
JSON
=
r'''
...
...
@@ -62,15 +61,19 @@ JSON = r'''
,"rosebud"]
'''
class
TestPass1
(
TestCase
)
:
class
TestPass1
:
def
test_parse
(
self
):
# test in/out equivalence and parsing
res
=
json
.
loads
(
JSON
)
out
=
json
.
dumps
(
res
)
self
.
assertEqual
(
res
,
json
.
loads
(
out
))
res
=
self
.
loads
(
JSON
)
out
=
self
.
dumps
(
res
)
self
.
assertEqual
(
res
,
self
.
loads
(
out
))
try
:
json
.
dumps
(
res
,
allow_nan
=
False
)
self
.
dumps
(
res
,
allow_nan
=
False
)
except
ValueError
:
pass
else
:
self
.
fail
(
"23456789012E666 should be out of range"
)
class
TestPyPass1
(
TestPass1
,
PyTest
):
pass
class
TestCPass1
(
TestPass1
,
CTest
):
pass
Lib/test/json_tests/test_pass2.py
View file @
32e3fdc2
from
unittest
import
TestCase
import
json
from
test.json_tests
import
PyTest
,
CTest
# from http://json.org/JSON_checker/test/pass2.json
JSON
=
r'''
[[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]]
'''
class
TestPass2
(
TestCase
)
:
class
TestPass2
:
def
test_parse
(
self
):
# test in/out equivalence and parsing
res
=
json
.
loads
(
JSON
)
out
=
json
.
dumps
(
res
)
self
.
assertEqual
(
res
,
json
.
loads
(
out
))
res
=
self
.
loads
(
JSON
)
out
=
self
.
dumps
(
res
)
self
.
assertEqual
(
res
,
self
.
loads
(
out
))
class
TestPyPass2
(
TestPass2
,
PyTest
):
pass
class
TestCPass2
(
TestPass2
,
CTest
):
pass
Lib/test/json_tests/test_pass3.py
View file @
32e3fdc2
from
unittest
import
TestCase
from
test.json_tests
import
PyTest
,
CTest
import
json
# from http://json.org/JSON_checker/test/pass3.json
JSON
=
r'''
...
...
@@ -12,9 +11,14 @@ JSON = r'''
}
'''
class
TestPass3
(
TestCase
):
class
TestPass3
:
def
test_parse
(
self
):
# test in/out equivalence and parsing
res
=
json
.
loads
(
JSON
)
out
=
json
.
dumps
(
res
)
self
.
assertEqual
(
res
,
json
.
loads
(
out
))
res
=
self
.
loads
(
JSON
)
out
=
self
.
dumps
(
res
)
self
.
assertEqual
(
res
,
self
.
loads
(
out
))
class
TestPyPass3
(
TestPass3
,
PyTest
):
pass
class
TestCPass3
(
TestPass3
,
CTest
):
pass
Lib/test/json_tests/test_recursion.py
View file @
32e3fdc2
from
unittest
import
TestCase
from
test.json_tests
import
PyTest
,
CTest
import
json
class
JSONTestObject
:
pass
class
RecursiveJSONEncoder
(
json
.
JSONEncoder
):
recurse
=
False
def
default
(
self
,
o
):
if
o
is
JSONTestObject
:
if
self
.
recurse
:
return
[
JSONTestObject
]
else
:
return
'JSONTestObject'
return
json
.
JSONEncoder
.
default
(
o
)
class
EndlessJSONEncoder
(
json
.
JSONEncoder
):
def
default
(
self
,
o
):
"""If check_circular is False, this will keep adding another list."""
return
[
o
]
class
TestRecursion
(
TestCase
):
class
TestRecursion
:
def
test_listrecursion
(
self
):
x
=
[]
x
.
append
(
x
)
try
:
json
.
dumps
(
x
)
self
.
dumps
(
x
)
except
ValueError
:
pass
else
:
...
...
@@ -36,7 +19,7 @@ class TestRecursion(TestCase):
y
=
[
x
]
x
.
append
(
y
)
try
:
json
.
dumps
(
x
)
self
.
dumps
(
x
)
except
ValueError
:
pass
else
:
...
...
@@ -44,13 +27,13 @@ class TestRecursion(TestCase):
y
=
[]
x
=
[
y
,
y
]
# ensure that the marker is cleared
json
.
dumps
(
x
)
self
.
dumps
(
x
)
def
test_dictrecursion
(
self
):
x
=
{}
x
[
"test"
]
=
x
try
:
json
.
dumps
(
x
)
self
.
dumps
(
x
)
except
ValueError
:
pass
else
:
...
...
@@ -58,9 +41,19 @@ class TestRecursion(TestCase):
x
=
{}
y
=
{
"a"
:
x
,
"b"
:
x
}
# ensure that the marker is cleared
json
.
dumps
(
x
)
self
.
dumps
(
x
)
def
test_defaultrecursion
(
self
):
class
RecursiveJSONEncoder
(
self
.
json
.
JSONEncoder
):
recurse
=
False
def
default
(
self
,
o
):
if
o
is
JSONTestObject
:
if
self
.
recurse
:
return
[
JSONTestObject
]
else
:
return
'JSONTestObject'
return
pyjson
.
JSONEncoder
.
default
(
o
)
enc
=
RecursiveJSONEncoder
()
self
.
assertEqual
(
enc
.
encode
(
JSONTestObject
),
'"JSONTestObject"'
)
enc
.
recurse
=
True
...
...
@@ -76,11 +69,11 @@ class TestRecursion(TestCase):
# test that loading highly-nested objects doesn't segfault when C
# accelerations are used. See #12017
with
self
.
assertRaises
(
RuntimeError
):
json
.
loads
(
'{"a":'
*
100000
+
'1'
+
'}'
*
100000
)
self
.
loads
(
'{"a":'
*
100000
+
'1'
+
'}'
*
100000
)
with
self
.
assertRaises
(
RuntimeError
):
json
.
loads
(
'{"a":'
*
100000
+
'[1]'
+
'}'
*
100000
)
self
.
loads
(
'{"a":'
*
100000
+
'[1]'
+
'}'
*
100000
)
with
self
.
assertRaises
(
RuntimeError
):
json
.
loads
(
'['
*
100000
+
'1'
+
']'
*
100000
)
self
.
loads
(
'['
*
100000
+
'1'
+
']'
*
100000
)
def
test_highly_nested_objects_encoding
(
self
):
# See #12051
...
...
@@ -88,11 +81,20 @@ class TestRecursion(TestCase):
for
x
in
range
(
100000
):
l
,
d
=
[
l
],
{
'k'
:
d
}
with
self
.
assertRaises
(
RuntimeError
):
json
.
dumps
(
l
)
self
.
dumps
(
l
)
with
self
.
assertRaises
(
RuntimeError
):
json
.
dumps
(
d
)
self
.
dumps
(
d
)
def
test_endless_recursion
(
self
):
# See #12051
class
EndlessJSONEncoder
(
self
.
json
.
JSONEncoder
):
def
default
(
self
,
o
):
"""If check_circular is False, this will keep adding another list."""
return
[
o
]
with
self
.
assertRaises
(
RuntimeError
):
EndlessJSONEncoder
(
check_circular
=
False
).
encode
(
5j
)
class
TestPyRecursion
(
TestRecursion
,
PyTest
):
pass
class
TestCRecursion
(
TestRecursion
,
CTest
):
pass
Lib/test/json_tests/test_scanstring.py
View file @
32e3fdc2
import
sys
from
unittest
import
TestCase
,
skipUnless
from
test.json_tests
import
PyTest
,
CTest
import
json
import
json.decoder
try
:
import
_json
except
ImportError
:
_json
=
None
class
TestScanString
(
TestCase
):
def
test_py_scanstring
(
self
):
self
.
_test_scanstring
(
json
.
decoder
.
py_scanstring
)
@
skipUnless
(
_json
,
'test requires the _json module'
)
def
test_c_scanstring
(
self
):
if
json
.
decoder
.
c_scanstring
is
not
None
:
self
.
_test_scanstring
(
json
.
decoder
.
c_scanstring
)
def
_test_scanstring
(
self
,
scanstring
):
class
TestScanstring
:
def
test_scanstring
(
self
):
scanstring
=
self
.
json
.
decoder
.
scanstring
self
.
assertEqual
(
scanstring
(
'"z
\
\
ud834
\
\
udd20x"'
,
1
,
True
),
(
'z
\
U0001d120
x'
,
16
))
...
...
@@ -109,4 +95,9 @@ class TestScanString(TestCase):
(
'Bad value'
,
12
))
def
test_overflow
(
self
):
self
.
assertRaises
(
OverflowError
,
json
.
decoder
.
scanstring
,
b"xxx"
,
sys
.
maxsize
+
1
)
with
self
.
assertRaises
(
OverflowError
):
self
.
json
.
decoder
.
scanstring
(
b"xxx"
,
sys
.
maxsize
+
1
)
class
TestPyScanstring
(
TestScanstring
,
PyTest
):
pass
class
TestCScanstring
(
TestScanstring
,
CTest
):
pass
Lib/test/json_tests/test_separators.py
View file @
32e3fdc2
import
textwrap
from
unittest
import
TestCase
from
test.json_tests
import
PyTest
,
CTest
import
json
class
TestSeparators
(
TestCase
):
class
TestSeparators
:
def
test_separators
(
self
):
h
=
[[
'blorpie'
],
[
'whoops'
],
[],
'd-shtaeou'
,
'd-nthiouh'
,
'i-vhbjkhnth'
,
{
'nifty'
:
87
},
{
'field'
:
'yes'
,
'morefield'
:
False
}
]
...
...
@@ -31,12 +29,16 @@ class TestSeparators(TestCase):
]"""
)
d1
=
json
.
dumps
(
h
)
d2
=
json
.
dumps
(
h
,
indent
=
2
,
sort_keys
=
True
,
separators
=
(
' ,'
,
' : '
))
d1
=
self
.
dumps
(
h
)
d2
=
self
.
dumps
(
h
,
indent
=
2
,
sort_keys
=
True
,
separators
=
(
' ,'
,
' : '
))
h1
=
json
.
loads
(
d1
)
h2
=
json
.
loads
(
d2
)
h1
=
self
.
loads
(
d1
)
h2
=
self
.
loads
(
d2
)
self
.
assertEqual
(
h1
,
h
)
self
.
assertEqual
(
h2
,
h
)
self
.
assertEqual
(
d2
,
expect
)
class
TestPySeparators
(
TestSeparators
,
PyTest
):
pass
class
TestCSeparators
(
TestSeparators
,
CTest
):
pass
Lib/test/json_tests/test_speedups.py
View file @
32e3fdc2
from
unittest
import
TestCase
,
skipUnless
from
test.json_tests
import
CTest
from
json
import
decoder
,
encoder
,
scanner
try
:
import
_json
except
ImportError
:
_json
=
None
@
skipUnless
(
_json
,
'test requires the _json module'
)
class
TestSpeedups
(
TestCase
):
class
TestSpeedups
(
CTest
):
def
test_scanstring
(
self
):
self
.
assertEqual
(
decoder
.
scanstring
.
__module__
,
"_json"
)
self
.
assertIs
(
decoder
.
scanstring
,
decoder
.
c_scanstring
)
self
.
assertEqual
(
self
.
json
.
decoder
.
scanstring
.
__module__
,
"_json"
)
self
.
assertIs
(
self
.
json
.
decoder
.
scanstring
,
self
.
json
.
decoder
.
c_scanstring
)
def
test_encode_basestring_ascii
(
self
):
self
.
assertEqual
(
encoder
.
encode_basestring_ascii
.
__module__
,
"_json"
)
self
.
assertIs
(
encoder
.
encode_basestring_ascii
,
encoder
.
c_encode_basestring_ascii
)
self
.
assertEqual
(
self
.
json
.
encoder
.
encode_basestring_ascii
.
__module__
,
"_json"
)
self
.
assertIs
(
self
.
json
.
encoder
.
encode_basestring_ascii
,
self
.
json
.
encoder
.
c_encode_basestring_ascii
)
class
TestDecode
(
TestCase
):
class
TestDecode
(
CTest
):
def
test_make_scanner
(
self
):
self
.
assertRaises
(
AttributeError
,
scanner
.
c_make_scanner
,
1
)
self
.
assertRaises
(
AttributeError
,
s
elf
.
json
.
s
canner
.
c_make_scanner
,
1
)
def
test_make_encoder
(
self
):
self
.
assertRaises
(
TypeError
,
encoder
.
c_make_encoder
,
self
.
assertRaises
(
TypeError
,
self
.
json
.
encoder
.
c_make_encoder
,
(
True
,
False
),
b"
\
xCD
\
x7D
\
x3D
\
x4E
\
x12
\
x4C
\
xF9
\
x79
\
xD7
\
x52
\
xBA
\
x82
\
xF2
\
x27
\
x4A
\
x7D
\
xA0
\
xCA
\
x75
"
,
None
)
Lib/test/json_tests/test_unicode.py
View file @
32e3fdc2
from
unittest
import
TestCase
import
json
from
collections
import
OrderedDict
from
test.json_tests
import
PyTest
,
CTest
class
TestUnicode
(
TestCase
)
:
class
TestUnicode
:
# test_encoding1 and test_encoding2 from 2.x are irrelevant (only str
# is supported as input, not bytes).
def
test_encoding3
(
self
):
u
=
'
\
N{GREEK SMALL LETTER ALPHA}
\
N{GREEK CAPITAL LETTER OMEGA}
'
j
=
json
.
dumps
(
u
)
j
=
self
.
dumps
(
u
)
self
.
assertEqual
(
j
,
'"
\
\
u03b1
\
\
u03a9"'
)
def
test_encoding4
(
self
):
u
=
'
\
N{GREEK SMALL LETTER ALPHA}
\
N{GREEK CAPITAL LETTER OMEGA}
'
j
=
json
.
dumps
([
u
])
j
=
self
.
dumps
([
u
])
self
.
assertEqual
(
j
,
'["
\
\
u03b1
\
\
u03a9"]'
)
def
test_encoding5
(
self
):
u
=
'
\
N{GREEK SMALL LETTER ALPHA}
\
N{GREEK CAPITAL LETTER OMEGA}
'
j
=
json
.
dumps
(
u
,
ensure_ascii
=
False
)
j
=
self
.
dumps
(
u
,
ensure_ascii
=
False
)
self
.
assertEqual
(
j
,
'"{0}"'
.
format
(
u
))
def
test_encoding6
(
self
):
u
=
'
\
N{GREEK SMALL LETTER ALPHA}
\
N{GREEK CAPITAL LETTER OMEGA}
'
j
=
json
.
dumps
([
u
],
ensure_ascii
=
False
)
j
=
self
.
dumps
([
u
],
ensure_ascii
=
False
)
self
.
assertEqual
(
j
,
'["{0}"]'
.
format
(
u
))
def
test_big_unicode_encode
(
self
):
u
=
'
\
U0001d120
'
self
.
assertEqual
(
json
.
dumps
(
u
),
'"
\
\
ud834
\
\
udd20"'
)
self
.
assertEqual
(
json
.
dumps
(
u
,
ensure_ascii
=
False
),
'"
\
U0001d120
"'
)
self
.
assertEqual
(
self
.
dumps
(
u
),
'"
\
\
ud834
\
\
udd20"'
)
self
.
assertEqual
(
self
.
dumps
(
u
,
ensure_ascii
=
False
),
'"
\
U0001d120
"'
)
def
test_big_unicode_decode
(
self
):
u
=
'z
\
U0001d120
x'
self
.
assertEqual
(
json
.
loads
(
'"'
+
u
+
'"'
),
u
)
self
.
assertEqual
(
json
.
loads
(
'"z
\
\
ud834
\
\
udd20x"'
),
u
)
self
.
assertEqual
(
self
.
loads
(
'"'
+
u
+
'"'
),
u
)
self
.
assertEqual
(
self
.
loads
(
'"z
\
\
ud834
\
\
udd20x"'
),
u
)
def
test_unicode_decode
(
self
):
for
i
in
range
(
0
,
0xd7ff
):
u
=
chr
(
i
)
s
=
'"
\
\
u{0:04x}"'
.
format
(
i
)
self
.
assertEqual
(
json
.
loads
(
s
),
u
)
self
.
assertEqual
(
self
.
loads
(
s
),
u
)
def
test_unicode_preservation
(
self
):
self
.
assertEqual
(
type
(
json
.
loads
(
'""'
)),
str
)
self
.
assertEqual
(
type
(
json
.
loads
(
'"a"'
)),
str
)
self
.
assertEqual
(
type
(
json
.
loads
(
'["a"]'
)[
0
]),
str
)
self
.
assertEqual
(
type
(
self
.
loads
(
'""'
)),
str
)
self
.
assertEqual
(
type
(
self
.
loads
(
'"a"'
)),
str
)
self
.
assertEqual
(
type
(
self
.
loads
(
'["a"]'
)[
0
]),
str
)
def
test_bytes_encode
(
self
):
self
.
assertRaises
(
TypeError
,
json
.
dumps
,
b"hi"
)
self
.
assertRaises
(
TypeError
,
json
.
dumps
,
[
b"hi"
])
self
.
assertRaises
(
TypeError
,
self
.
dumps
,
b"hi"
)
self
.
assertRaises
(
TypeError
,
self
.
dumps
,
[
b"hi"
])
def
test_bytes_decode
(
self
):
self
.
assertRaises
(
TypeError
,
json
.
loads
,
b'"hi"'
)
self
.
assertRaises
(
TypeError
,
json
.
loads
,
b'["hi"]'
)
self
.
assertRaises
(
TypeError
,
self
.
loads
,
b'"hi"'
)
self
.
assertRaises
(
TypeError
,
self
.
loads
,
b'["hi"]'
)
def
test_object_pairs_hook_with_unicode
(
self
):
s
=
'{"xkd":1, "kcw":2, "art":3, "hxm":4, "qrt":5, "pad":6, "hoy":7}'
p
=
[(
"xkd"
,
1
),
(
"kcw"
,
2
),
(
"art"
,
3
),
(
"hxm"
,
4
),
(
"qrt"
,
5
),
(
"pad"
,
6
),
(
"hoy"
,
7
)]
self
.
assertEqual
(
json
.
loads
(
s
),
eval
(
s
))
self
.
assertEqual
(
json
.
loads
(
s
,
object_pairs_hook
=
lambda
x
:
x
),
p
)
od
=
json
.
loads
(
s
,
object_pairs_hook
=
OrderedDict
)
self
.
assertEqual
(
self
.
loads
(
s
),
eval
(
s
))
self
.
assertEqual
(
self
.
loads
(
s
,
object_pairs_hook
=
lambda
x
:
x
),
p
)
od
=
self
.
loads
(
s
,
object_pairs_hook
=
OrderedDict
)
self
.
assertEqual
(
od
,
OrderedDict
(
p
))
self
.
assertEqual
(
type
(
od
),
OrderedDict
)
# the object_pairs_hook takes priority over the object_hook
self
.
assertEqual
(
json
.
loads
(
s
,
object_pairs_hook
=
OrderedDict
,
self
.
assertEqual
(
self
.
loads
(
s
,
object_pairs_hook
=
OrderedDict
,
object_hook
=
lambda
x
:
None
),
OrderedDict
(
p
))
class
TestPyUnicode
(
TestUnicode
,
PyTest
):
pass
class
TestCUnicode
(
TestUnicode
,
CTest
):
pass
Lib/test/support.py
View file @
32e3fdc2
...
...
@@ -127,8 +127,8 @@ def import_fresh_module(name, fresh=(), blocked=(), deprecated=False):
If deprecated is True, any module or package deprecation messages
will be suppressed."""
# NOTE: test_heapq
and test_warnings include extra sanity checks to make
# sure that this utility function is working as expected
# NOTE: test_heapq
, test_json and test_warnings include extra sanity checks
#
to make
sure that this utility function is working as expected
with
_ignore_deprecated_imports
(
deprecated
):
# Keep track of modules saved for later restoration as well
# as those which just need a blocking entry removed
...
...
Misc/NEWS
View file @
32e3fdc2
...
...
@@ -659,6 +659,8 @@ Extension Modules
Tests
-----
-
Issue
#
5723
:
Improve
json
tests
to
be
executed
with
and
without
accelerations
.
-
Issue
#
12041
:
Make
test_wait3
more
robust
.
-
Issue
#
11873
:
Change
regex
in
test_compileall
to
fix
occasional
failures
when
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment