| 
									
										
										
										
											2013-08-08 15:03:45 +03:00
										 |  |  | from test.test_json import PyTest, CTest | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-26 19:24:20 +02:00
										 |  |  | # 2007-10-05 | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  | JSONDOCS = [ | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail1.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '"A JSON payload should be an object or array, not a string."', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail2.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '["Unclosed array"', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail3.json | 
					
						
							| 
									
										
										
										
											2012-11-26 19:24:20 +02:00
										 |  |  |     '{unquoted_key: "keys must be quoted"}', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail4.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '["extra comma",]', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail5.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '["double extra comma",,]', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail6.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '[   , "<-- missing value"]', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail7.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '["Comma after the close"],', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail8.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '["Extra close"]]', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail9.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '{"Extra comma": true,}', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail10.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '{"Extra value after close": true} "misplaced quoted value"', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail11.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '{"Illegal expression": 1 + 2}', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail12.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '{"Illegal invocation": alert()}', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail13.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '{"Numbers cannot have leading zeroes": 013}', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail14.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '{"Numbers cannot be hex": 0x14}', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail15.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '["Illegal backslash escape: \\x15"]', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail16.json | 
					
						
							| 
									
										
										
										
											2012-11-26 19:24:20 +02:00
										 |  |  |     '[\\naked]', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail17.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '["Illegal backslash escape: \\017"]', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail18.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail19.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '{"Missing colon" null}', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail20.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '{"Double colon":: null}', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail21.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '{"Comma instead of colon", null}', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail22.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '["Colon instead of comma": false]', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail23.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '["Bad value", truth]', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail24.json | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     "['single quote']", | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail25.json | 
					
						
							| 
									
										
										
										
											2012-11-26 19:24:20 +02:00
										 |  |  |     '["\ttab\tcharacter\tin\tstring\t"]', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail26.json | 
					
						
							| 
									
										
										
										
											2012-11-26 19:24:20 +02:00
										 |  |  |     '["tab\\   character\\   in\\  string\\  "]', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail27.json | 
					
						
							| 
									
										
										
										
											2012-11-26 19:24:20 +02:00
										 |  |  |     '["line\nbreak"]', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail28.json | 
					
						
							| 
									
										
										
										
											2012-11-26 19:24:20 +02:00
										 |  |  |     '["line\\\nbreak"]', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail29.json | 
					
						
							| 
									
										
										
										
											2012-11-26 19:24:20 +02:00
										 |  |  |     '[0e]', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail30.json | 
					
						
							| 
									
										
										
										
											2012-11-26 19:24:20 +02:00
										 |  |  |     '[0e+]', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail31.json | 
					
						
							| 
									
										
										
										
											2012-11-26 19:24:20 +02:00
										 |  |  |     '[0e+-1]', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail32.json | 
					
						
							| 
									
										
										
										
											2012-11-26 19:24:20 +02:00
										 |  |  |     '{"Comma instead if closing brace": true,', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://json.org/JSON_checker/test/fail33.json | 
					
						
							| 
									
										
										
										
											2012-11-26 19:24:20 +02:00
										 |  |  |     '["mismatch"}', | 
					
						
							| 
									
										
										
										
											2022-09-24 14:38:53 +03:00
										 |  |  |     # https://code.google.com/archive/p/simplejson/issues/3 | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     '["A\u001FZ control characters in string"]', | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SKIPS = { | 
					
						
							|  |  |  |     1: "why not have a string payload?", | 
					
						
							|  |  |  |     18: "spec doesn't specify any nesting limitations", | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-14 06:47:51 +03:00
										 |  |  | class TestFail: | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     def test_failures(self): | 
					
						
							|  |  |  |         for idx, doc in enumerate(JSONDOCS): | 
					
						
							|  |  |  |             idx = idx + 1 | 
					
						
							|  |  |  |             if idx in SKIPS: | 
					
						
							| 
									
										
										
										
											2011-05-14 06:47:51 +03:00
										 |  |  |                 self.loads(doc) | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |                 continue | 
					
						
							|  |  |  |             try: | 
					
						
							| 
									
										
										
										
											2011-05-14 06:47:51 +03:00
										 |  |  |                 self.loads(doc) | 
					
						
							| 
									
										
										
										
											2015-01-26 13:16:30 +02:00
										 |  |  |             except self.JSONDecodeError: | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |                 pass | 
					
						
							|  |  |  |             else: | 
					
						
							| 
									
										
										
										
											2009-05-02 12:36:44 +00:00
										 |  |  |                 self.fail("Expected failure for fail{0}.json: {1!r}".format(idx, doc)) | 
					
						
							| 
									
										
										
										
											2010-07-21 12:29:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_non_string_keys_dict(self): | 
					
						
							|  |  |  |         data = {'a' : 1, (1, 2) : 2} | 
					
						
							| 
									
										
										
										
											2017-11-25 17:38:20 +02:00
										 |  |  |         with self.assertRaisesRegex(TypeError, | 
					
						
							|  |  |  |                 'keys must be str, int, float, bool or None, not tuple'): | 
					
						
							|  |  |  |             self.dumps(data) | 
					
						
							| 
									
										
										
										
											2010-07-21 12:29:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-25 17:38:20 +02:00
										 |  |  |     def test_not_serializable(self): | 
					
						
							|  |  |  |         import sys | 
					
						
							|  |  |  |         with self.assertRaisesRegex(TypeError, | 
					
						
							|  |  |  |                 'Object of type module is not JSON serializable'): | 
					
						
							|  |  |  |             self.dumps(sys) | 
					
						
							| 
									
										
										
										
											2011-05-14 06:47:51 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-03 08:44:15 +02:00
										 |  |  |     def test_truncated_input(self): | 
					
						
							|  |  |  |         test_cases = [ | 
					
						
							|  |  |  |             ('', 'Expecting value', 0), | 
					
						
							|  |  |  |             ('[', 'Expecting value', 1), | 
					
						
							|  |  |  |             ('[42', "Expecting ',' delimiter", 3), | 
					
						
							|  |  |  |             ('[42,', 'Expecting value', 4), | 
					
						
							|  |  |  |             ('["', 'Unterminated string starting at', 1), | 
					
						
							|  |  |  |             ('["spam', 'Unterminated string starting at', 1), | 
					
						
							|  |  |  |             ('["spam"', "Expecting ',' delimiter", 7), | 
					
						
							|  |  |  |             ('["spam",', 'Expecting value', 8), | 
					
						
							|  |  |  |             ('{', 'Expecting property name enclosed in double quotes', 1), | 
					
						
							|  |  |  |             ('{"', 'Unterminated string starting at', 1), | 
					
						
							|  |  |  |             ('{"spam', 'Unterminated string starting at', 1), | 
					
						
							|  |  |  |             ('{"spam"', "Expecting ':' delimiter", 7), | 
					
						
							|  |  |  |             ('{"spam":', 'Expecting value', 8), | 
					
						
							|  |  |  |             ('{"spam":42', "Expecting ',' delimiter", 10), | 
					
						
							|  |  |  |             ('{"spam":42,', 'Expecting property name enclosed in double quotes', 11), | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |         test_cases += [ | 
					
						
							|  |  |  |             ('"', 'Unterminated string starting at', 0), | 
					
						
							|  |  |  |             ('"spam', 'Unterminated string starting at', 0), | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |         for data, msg, idx in test_cases: | 
					
						
							| 
									
										
										
										
											2015-01-26 13:16:30 +02:00
										 |  |  |             with self.assertRaises(self.JSONDecodeError) as cm: | 
					
						
							|  |  |  |                 self.loads(data) | 
					
						
							|  |  |  |             err = cm.exception | 
					
						
							|  |  |  |             self.assertEqual(err.msg, msg) | 
					
						
							|  |  |  |             self.assertEqual(err.pos, idx) | 
					
						
							|  |  |  |             self.assertEqual(err.lineno, 1) | 
					
						
							|  |  |  |             self.assertEqual(err.colno, idx + 1) | 
					
						
							|  |  |  |             self.assertEqual(str(err), | 
					
						
							|  |  |  |                              '%s: line 1 column %d (char %d)' % | 
					
						
							|  |  |  |                              (msg, idx + 1, idx)) | 
					
						
							| 
									
										
										
										
											2013-01-03 08:44:15 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_unexpected_data(self): | 
					
						
							|  |  |  |         test_cases = [ | 
					
						
							|  |  |  |             ('[,', 'Expecting value', 1), | 
					
						
							|  |  |  |             ('{"spam":[}', 'Expecting value', 9), | 
					
						
							|  |  |  |             ('[42:', "Expecting ',' delimiter", 3), | 
					
						
							|  |  |  |             ('[42 "spam"', "Expecting ',' delimiter", 4), | 
					
						
							| 
									
										
										
										
											2023-12-17 12:52:26 -06:00
										 |  |  |             ('[42,]', "Illegal trailing comma before end of array", 3), | 
					
						
							| 
									
										
										
										
											2013-01-03 08:44:15 +02:00
										 |  |  |             ('{"spam":[42}', "Expecting ',' delimiter", 11), | 
					
						
							|  |  |  |             ('["]', 'Unterminated string starting at', 1), | 
					
						
							|  |  |  |             ('["spam":', "Expecting ',' delimiter", 7), | 
					
						
							| 
									
										
										
										
											2023-12-17 12:52:26 -06:00
										 |  |  |             ('["spam",]', "Illegal trailing comma before end of array", 7), | 
					
						
							| 
									
										
										
										
											2013-01-03 08:44:15 +02:00
										 |  |  |             ('{:', 'Expecting property name enclosed in double quotes', 1), | 
					
						
							|  |  |  |             ('{,', 'Expecting property name enclosed in double quotes', 1), | 
					
						
							|  |  |  |             ('{42', 'Expecting property name enclosed in double quotes', 1), | 
					
						
							|  |  |  |             ('[{]', 'Expecting property name enclosed in double quotes', 2), | 
					
						
							|  |  |  |             ('{"spam",', "Expecting ':' delimiter", 7), | 
					
						
							|  |  |  |             ('{"spam"}', "Expecting ':' delimiter", 7), | 
					
						
							|  |  |  |             ('[{"spam"]', "Expecting ':' delimiter", 8), | 
					
						
							|  |  |  |             ('{"spam":}', 'Expecting value', 8), | 
					
						
							|  |  |  |             ('[{"spam":]', 'Expecting value', 9), | 
					
						
							|  |  |  |             ('{"spam":42 "ham"', "Expecting ',' delimiter", 11), | 
					
						
							|  |  |  |             ('[{"spam":42]', "Expecting ',' delimiter", 11), | 
					
						
							| 
									
										
										
										
											2023-12-17 12:52:26 -06:00
										 |  |  |             ('{"spam":42,}', "Illegal trailing comma before end of object", 10), | 
					
						
							|  |  |  |             ('{"spam":42 , }', "Illegal trailing comma before end of object", 11), | 
					
						
							|  |  |  |             ('[123  , ]', "Illegal trailing comma before end of array", 6), | 
					
						
							| 
									
										
										
										
											2013-01-03 08:44:15 +02:00
										 |  |  |         ] | 
					
						
							|  |  |  |         for data, msg, idx in test_cases: | 
					
						
							| 
									
										
										
										
											2015-01-26 13:16:30 +02:00
										 |  |  |             with self.assertRaises(self.JSONDecodeError) as cm: | 
					
						
							|  |  |  |                 self.loads(data) | 
					
						
							|  |  |  |             err = cm.exception | 
					
						
							|  |  |  |             self.assertEqual(err.msg, msg) | 
					
						
							|  |  |  |             self.assertEqual(err.pos, idx) | 
					
						
							|  |  |  |             self.assertEqual(err.lineno, 1) | 
					
						
							|  |  |  |             self.assertEqual(err.colno, idx + 1) | 
					
						
							|  |  |  |             self.assertEqual(str(err), | 
					
						
							|  |  |  |                              '%s: line 1 column %d (char %d)' % | 
					
						
							|  |  |  |                              (msg, idx + 1, idx)) | 
					
						
							| 
									
										
										
										
											2013-01-03 08:44:15 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_extra_data(self): | 
					
						
							|  |  |  |         test_cases = [ | 
					
						
							|  |  |  |             ('[]]', 'Extra data', 2), | 
					
						
							|  |  |  |             ('{}}', 'Extra data', 2), | 
					
						
							|  |  |  |             ('[],[]', 'Extra data', 2), | 
					
						
							|  |  |  |             ('{},{}', 'Extra data', 2), | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |         test_cases += [ | 
					
						
							|  |  |  |             ('42,"spam"', 'Extra data', 2), | 
					
						
							|  |  |  |             ('"spam",42', 'Extra data', 6), | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |         for data, msg, idx in test_cases: | 
					
						
							| 
									
										
										
										
											2015-01-26 13:16:30 +02:00
										 |  |  |             with self.assertRaises(self.JSONDecodeError) as cm: | 
					
						
							|  |  |  |                 self.loads(data) | 
					
						
							|  |  |  |             err = cm.exception | 
					
						
							|  |  |  |             self.assertEqual(err.msg, msg) | 
					
						
							|  |  |  |             self.assertEqual(err.pos, idx) | 
					
						
							|  |  |  |             self.assertEqual(err.lineno, 1) | 
					
						
							|  |  |  |             self.assertEqual(err.colno, idx + 1) | 
					
						
							|  |  |  |             self.assertEqual(str(err), | 
					
						
							|  |  |  |                              '%s: line 1 column %d (char %d)' % | 
					
						
							|  |  |  |                              (msg, idx + 1, idx)) | 
					
						
							| 
									
										
										
										
											2013-01-03 08:44:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-21 20:26:52 +02:00
										 |  |  |     def test_linecol(self): | 
					
						
							|  |  |  |         test_cases = [ | 
					
						
							|  |  |  |             ('!', 1, 1, 0), | 
					
						
							|  |  |  |             (' !', 1, 2, 1), | 
					
						
							|  |  |  |             ('\n!', 2, 1, 1), | 
					
						
							|  |  |  |             ('\n  \n\n     !', 4, 6, 10), | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |         for data, line, col, idx in test_cases: | 
					
						
							| 
									
										
										
										
											2015-01-26 13:16:30 +02:00
										 |  |  |             with self.assertRaises(self.JSONDecodeError) as cm: | 
					
						
							|  |  |  |                 self.loads(data) | 
					
						
							|  |  |  |             err = cm.exception | 
					
						
							|  |  |  |             self.assertEqual(err.msg, 'Expecting value') | 
					
						
							|  |  |  |             self.assertEqual(err.pos, idx) | 
					
						
							|  |  |  |             self.assertEqual(err.lineno, line) | 
					
						
							|  |  |  |             self.assertEqual(err.colno, col) | 
					
						
							|  |  |  |             self.assertEqual(str(err), | 
					
						
							|  |  |  |                              'Expecting value: line %s column %d (char %d)' % | 
					
						
							|  |  |  |                              (line, col, idx)) | 
					
						
							| 
									
										
										
										
											2011-05-14 06:47:51 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | class TestPyFail(TestFail, PyTest): pass | 
					
						
							|  |  |  | class TestCFail(TestFail, CTest): pass |