Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 1 | import sys |
| 2 | import decimal |
| 3 | from unittest import TestCase |
| 4 | |
Benjamin Peterson | a13d475 | 2008-10-16 21:17:24 +0000 | [diff] [blame] | 5 | import json |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 6 | import json.decoder |
| 7 | |
| 8 | class 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 Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 18 | scanstring('"z\\ud834\\udd20x"', 1, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 19 | ('z\U0001d120x', 16)) |
| 20 | |
| 21 | if sys.maxunicode == 65535: |
| 22 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 23 | scanstring('"z\U0001d120x"', 1, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 24 | ('z\U0001d120x', 6)) |
| 25 | else: |
| 26 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 27 | scanstring('"z\U0001d120x"', 1, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 28 | ('z\U0001d120x', 5)) |
| 29 | |
| 30 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 31 | scanstring('"\\u007b"', 1, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 32 | ('{', 8)) |
| 33 | |
| 34 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 35 | scanstring('"A JSON payload should be an object or array, not a string."', 1, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 36 | ('A JSON payload should be an object or array, not a string.', 60)) |
| 37 | |
| 38 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 39 | scanstring('["Unclosed array"', 2, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 40 | ('Unclosed array', 17)) |
| 41 | |
| 42 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 43 | scanstring('["extra comma",]', 2, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 44 | ('extra comma', 14)) |
| 45 | |
| 46 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 47 | scanstring('["double extra comma",,]', 2, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 48 | ('double extra comma', 21)) |
| 49 | |
| 50 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 51 | scanstring('["Comma after the close"],', 2, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 52 | ('Comma after the close', 24)) |
| 53 | |
| 54 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 55 | scanstring('["Extra close"]]', 2, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 56 | ('Extra close', 14)) |
| 57 | |
| 58 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 59 | scanstring('{"Extra comma": true,}', 2, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 60 | ('Extra comma', 14)) |
| 61 | |
| 62 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 63 | scanstring('{"Extra value after close": true} "misplaced quoted value"', 2, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 64 | ('Extra value after close', 26)) |
| 65 | |
| 66 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 67 | scanstring('{"Illegal expression": 1 + 2}', 2, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 68 | ('Illegal expression', 21)) |
| 69 | |
| 70 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 71 | scanstring('{"Illegal invocation": alert()}', 2, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 72 | ('Illegal invocation', 21)) |
| 73 | |
| 74 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 75 | scanstring('{"Numbers cannot have leading zeroes": 013}', 2, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 76 | ('Numbers cannot have leading zeroes', 37)) |
| 77 | |
| 78 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 79 | scanstring('{"Numbers cannot be hex": 0x14}', 2, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 80 | ('Numbers cannot be hex', 24)) |
| 81 | |
| 82 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 83 | scanstring('[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]', 21, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 84 | ('Too deep', 30)) |
| 85 | |
| 86 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 87 | scanstring('{"Missing colon" null}', 2, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 88 | ('Missing colon', 16)) |
| 89 | |
| 90 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 91 | scanstring('{"Double colon":: null}', 2, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 92 | ('Double colon', 15)) |
| 93 | |
| 94 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 95 | scanstring('{"Comma instead of colon", null}', 2, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 96 | ('Comma instead of colon', 25)) |
| 97 | |
| 98 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 99 | scanstring('["Colon instead of comma": false]', 2, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 100 | ('Colon instead of comma', 25)) |
| 101 | |
| 102 | self.assertEquals( |
Benjamin Peterson | c6b607d | 2009-05-02 12:36:44 +0000 | [diff] [blame] | 103 | scanstring('["Bad value", truth]', 2, True), |
Christian Heimes | 9054000 | 2008-05-08 14:29:10 +0000 | [diff] [blame] | 104 | ('Bad value', 12)) |
Georg Brandl | 5968205 | 2009-05-05 07:52:05 +0000 | [diff] [blame] | 105 | |
| 106 | def test_overflow(self): |
| 107 | self.assertRaises(OverflowError, json.decoder.scanstring, b"xxx", sys.maxsize+1) |