blob: 2e9136b08f9c6e715d3c4838edfb3524b9eb0cf1 [file] [log] [blame]
Christian Heimes90540002008-05-08 14:29:10 +00001import sys
2import decimal
3from unittest import TestCase
4
Benjamin Petersona13d4752008-10-16 21:17:24 +00005import json
Christian Heimes90540002008-05-08 14:29:10 +00006import json.decoder
7
8class TestScanString(TestCase):
9 def test_py_scanstring(self):
10 self._test_scanstring(json.decoder.py_scanstring)
11
12 def test_c_scanstring(self):
13 if json.decoder.c_scanstring is not None:
14 self._test_scanstring(json.decoder.c_scanstring)
15
16 def _test_scanstring(self, scanstring):
17 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000018 scanstring('"z\\ud834\\udd20x"', 1, True),
Christian Heimes90540002008-05-08 14:29:10 +000019 ('z\U0001d120x', 16))
20
21 if sys.maxunicode == 65535:
22 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000023 scanstring('"z\U0001d120x"', 1, True),
Christian Heimes90540002008-05-08 14:29:10 +000024 ('z\U0001d120x', 6))
25 else:
26 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000027 scanstring('"z\U0001d120x"', 1, True),
Christian Heimes90540002008-05-08 14:29:10 +000028 ('z\U0001d120x', 5))
29
30 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000031 scanstring('"\\u007b"', 1, True),
Christian Heimes90540002008-05-08 14:29:10 +000032 ('{', 8))
33
34 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000035 scanstring('"A JSON payload should be an object or array, not a string."', 1, True),
Christian Heimes90540002008-05-08 14:29:10 +000036 ('A JSON payload should be an object or array, not a string.', 60))
37
38 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000039 scanstring('["Unclosed array"', 2, True),
Christian Heimes90540002008-05-08 14:29:10 +000040 ('Unclosed array', 17))
41
42 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000043 scanstring('["extra comma",]', 2, True),
Christian Heimes90540002008-05-08 14:29:10 +000044 ('extra comma', 14))
45
46 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000047 scanstring('["double extra comma",,]', 2, True),
Christian Heimes90540002008-05-08 14:29:10 +000048 ('double extra comma', 21))
49
50 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000051 scanstring('["Comma after the close"],', 2, True),
Christian Heimes90540002008-05-08 14:29:10 +000052 ('Comma after the close', 24))
53
54 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000055 scanstring('["Extra close"]]', 2, True),
Christian Heimes90540002008-05-08 14:29:10 +000056 ('Extra close', 14))
57
58 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000059 scanstring('{"Extra comma": true,}', 2, True),
Christian Heimes90540002008-05-08 14:29:10 +000060 ('Extra comma', 14))
61
62 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000063 scanstring('{"Extra value after close": true} "misplaced quoted value"', 2, True),
Christian Heimes90540002008-05-08 14:29:10 +000064 ('Extra value after close', 26))
65
66 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000067 scanstring('{"Illegal expression": 1 + 2}', 2, True),
Christian Heimes90540002008-05-08 14:29:10 +000068 ('Illegal expression', 21))
69
70 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000071 scanstring('{"Illegal invocation": alert()}', 2, True),
Christian Heimes90540002008-05-08 14:29:10 +000072 ('Illegal invocation', 21))
73
74 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000075 scanstring('{"Numbers cannot have leading zeroes": 013}', 2, True),
Christian Heimes90540002008-05-08 14:29:10 +000076 ('Numbers cannot have leading zeroes', 37))
77
78 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000079 scanstring('{"Numbers cannot be hex": 0x14}', 2, True),
Christian Heimes90540002008-05-08 14:29:10 +000080 ('Numbers cannot be hex', 24))
81
82 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000083 scanstring('[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]', 21, True),
Christian Heimes90540002008-05-08 14:29:10 +000084 ('Too deep', 30))
85
86 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000087 scanstring('{"Missing colon" null}', 2, True),
Christian Heimes90540002008-05-08 14:29:10 +000088 ('Missing colon', 16))
89
90 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000091 scanstring('{"Double colon":: null}', 2, True),
Christian Heimes90540002008-05-08 14:29:10 +000092 ('Double colon', 15))
93
94 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000095 scanstring('{"Comma instead of colon", null}', 2, True),
Christian Heimes90540002008-05-08 14:29:10 +000096 ('Comma instead of colon', 25))
97
98 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +000099 scanstring('["Colon instead of comma": false]', 2, True),
Christian Heimes90540002008-05-08 14:29:10 +0000100 ('Colon instead of comma', 25))
101
102 self.assertEquals(
Benjamin Petersonc6b607d2009-05-02 12:36:44 +0000103 scanstring('["Bad value", truth]', 2, True),
Christian Heimes90540002008-05-08 14:29:10 +0000104 ('Bad value', 12))
Georg Brandl59682052009-05-05 07:52:05 +0000105
106 def test_overflow(self):
107 self.assertRaises(OverflowError, json.decoder.scanstring, b"xxx", sys.maxsize+1)