17db96d56Sopenharmony_ciimport sys 27db96d56Sopenharmony_cifrom test.test_json import PyTest, CTest 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_ciclass TestScanstring: 67db96d56Sopenharmony_ci def test_scanstring(self): 77db96d56Sopenharmony_ci scanstring = self.json.decoder.scanstring 87db96d56Sopenharmony_ci self.assertEqual( 97db96d56Sopenharmony_ci scanstring('"z\U0001d120x"', 1, True), 107db96d56Sopenharmony_ci ('z\U0001d120x', 5)) 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_ci self.assertEqual( 137db96d56Sopenharmony_ci scanstring('"\\u007b"', 1, True), 147db96d56Sopenharmony_ci ('{', 8)) 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_ci self.assertEqual( 177db96d56Sopenharmony_ci scanstring('"A JSON payload should be an object or array, not a string."', 1, True), 187db96d56Sopenharmony_ci ('A JSON payload should be an object or array, not a string.', 60)) 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ci self.assertEqual( 217db96d56Sopenharmony_ci scanstring('["Unclosed array"', 2, True), 227db96d56Sopenharmony_ci ('Unclosed array', 17)) 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_ci self.assertEqual( 257db96d56Sopenharmony_ci scanstring('["extra comma",]', 2, True), 267db96d56Sopenharmony_ci ('extra comma', 14)) 277db96d56Sopenharmony_ci 287db96d56Sopenharmony_ci self.assertEqual( 297db96d56Sopenharmony_ci scanstring('["double extra comma",,]', 2, True), 307db96d56Sopenharmony_ci ('double extra comma', 21)) 317db96d56Sopenharmony_ci 327db96d56Sopenharmony_ci self.assertEqual( 337db96d56Sopenharmony_ci scanstring('["Comma after the close"],', 2, True), 347db96d56Sopenharmony_ci ('Comma after the close', 24)) 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_ci self.assertEqual( 377db96d56Sopenharmony_ci scanstring('["Extra close"]]', 2, True), 387db96d56Sopenharmony_ci ('Extra close', 14)) 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ci self.assertEqual( 417db96d56Sopenharmony_ci scanstring('{"Extra comma": true,}', 2, True), 427db96d56Sopenharmony_ci ('Extra comma', 14)) 437db96d56Sopenharmony_ci 447db96d56Sopenharmony_ci self.assertEqual( 457db96d56Sopenharmony_ci scanstring('{"Extra value after close": true} "misplaced quoted value"', 2, True), 467db96d56Sopenharmony_ci ('Extra value after close', 26)) 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ci self.assertEqual( 497db96d56Sopenharmony_ci scanstring('{"Illegal expression": 1 + 2}', 2, True), 507db96d56Sopenharmony_ci ('Illegal expression', 21)) 517db96d56Sopenharmony_ci 527db96d56Sopenharmony_ci self.assertEqual( 537db96d56Sopenharmony_ci scanstring('{"Illegal invocation": alert()}', 2, True), 547db96d56Sopenharmony_ci ('Illegal invocation', 21)) 557db96d56Sopenharmony_ci 567db96d56Sopenharmony_ci self.assertEqual( 577db96d56Sopenharmony_ci scanstring('{"Numbers cannot have leading zeroes": 013}', 2, True), 587db96d56Sopenharmony_ci ('Numbers cannot have leading zeroes', 37)) 597db96d56Sopenharmony_ci 607db96d56Sopenharmony_ci self.assertEqual( 617db96d56Sopenharmony_ci scanstring('{"Numbers cannot be hex": 0x14}', 2, True), 627db96d56Sopenharmony_ci ('Numbers cannot be hex', 24)) 637db96d56Sopenharmony_ci 647db96d56Sopenharmony_ci self.assertEqual( 657db96d56Sopenharmony_ci scanstring('[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]', 21, True), 667db96d56Sopenharmony_ci ('Too deep', 30)) 677db96d56Sopenharmony_ci 687db96d56Sopenharmony_ci self.assertEqual( 697db96d56Sopenharmony_ci scanstring('{"Missing colon" null}', 2, True), 707db96d56Sopenharmony_ci ('Missing colon', 16)) 717db96d56Sopenharmony_ci 727db96d56Sopenharmony_ci self.assertEqual( 737db96d56Sopenharmony_ci scanstring('{"Double colon":: null}', 2, True), 747db96d56Sopenharmony_ci ('Double colon', 15)) 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_ci self.assertEqual( 777db96d56Sopenharmony_ci scanstring('{"Comma instead of colon", null}', 2, True), 787db96d56Sopenharmony_ci ('Comma instead of colon', 25)) 797db96d56Sopenharmony_ci 807db96d56Sopenharmony_ci self.assertEqual( 817db96d56Sopenharmony_ci scanstring('["Colon instead of comma": false]', 2, True), 827db96d56Sopenharmony_ci ('Colon instead of comma', 25)) 837db96d56Sopenharmony_ci 847db96d56Sopenharmony_ci self.assertEqual( 857db96d56Sopenharmony_ci scanstring('["Bad value", truth]', 2, True), 867db96d56Sopenharmony_ci ('Bad value', 12)) 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci def test_surrogates(self): 897db96d56Sopenharmony_ci scanstring = self.json.decoder.scanstring 907db96d56Sopenharmony_ci def assertScan(given, expect): 917db96d56Sopenharmony_ci self.assertEqual(scanstring(given, 1, True), 927db96d56Sopenharmony_ci (expect, len(given))) 937db96d56Sopenharmony_ci 947db96d56Sopenharmony_ci assertScan('"z\\ud834\\u0079x"', 'z\ud834yx') 957db96d56Sopenharmony_ci assertScan('"z\\ud834\\udd20x"', 'z\U0001d120x') 967db96d56Sopenharmony_ci assertScan('"z\\ud834\\ud834\\udd20x"', 'z\ud834\U0001d120x') 977db96d56Sopenharmony_ci assertScan('"z\\ud834x"', 'z\ud834x') 987db96d56Sopenharmony_ci assertScan('"z\\ud834\udd20x12345"', 'z\ud834\udd20x12345') 997db96d56Sopenharmony_ci assertScan('"z\\udd20x"', 'z\udd20x') 1007db96d56Sopenharmony_ci assertScan('"z\ud834\udd20x"', 'z\ud834\udd20x') 1017db96d56Sopenharmony_ci assertScan('"z\ud834\\udd20x"', 'z\ud834\udd20x') 1027db96d56Sopenharmony_ci assertScan('"z\ud834x"', 'z\ud834x') 1037db96d56Sopenharmony_ci 1047db96d56Sopenharmony_ci def test_bad_escapes(self): 1057db96d56Sopenharmony_ci scanstring = self.json.decoder.scanstring 1067db96d56Sopenharmony_ci bad_escapes = [ 1077db96d56Sopenharmony_ci '"\\"', 1087db96d56Sopenharmony_ci '"\\x"', 1097db96d56Sopenharmony_ci '"\\u"', 1107db96d56Sopenharmony_ci '"\\u0"', 1117db96d56Sopenharmony_ci '"\\u01"', 1127db96d56Sopenharmony_ci '"\\u012"', 1137db96d56Sopenharmony_ci '"\\uz012"', 1147db96d56Sopenharmony_ci '"\\u0z12"', 1157db96d56Sopenharmony_ci '"\\u01z2"', 1167db96d56Sopenharmony_ci '"\\u012z"', 1177db96d56Sopenharmony_ci '"\\u0x12"', 1187db96d56Sopenharmony_ci '"\\u0X12"', 1197db96d56Sopenharmony_ci '"\\ud834\\"', 1207db96d56Sopenharmony_ci '"\\ud834\\u"', 1217db96d56Sopenharmony_ci '"\\ud834\\ud"', 1227db96d56Sopenharmony_ci '"\\ud834\\udd"', 1237db96d56Sopenharmony_ci '"\\ud834\\udd2"', 1247db96d56Sopenharmony_ci '"\\ud834\\uzdd2"', 1257db96d56Sopenharmony_ci '"\\ud834\\udzd2"', 1267db96d56Sopenharmony_ci '"\\ud834\\uddz2"', 1277db96d56Sopenharmony_ci '"\\ud834\\udd2z"', 1287db96d56Sopenharmony_ci '"\\ud834\\u0x20"', 1297db96d56Sopenharmony_ci '"\\ud834\\u0X20"', 1307db96d56Sopenharmony_ci ] 1317db96d56Sopenharmony_ci for s in bad_escapes: 1327db96d56Sopenharmony_ci with self.assertRaises(self.JSONDecodeError, msg=s): 1337db96d56Sopenharmony_ci scanstring(s, 1, True) 1347db96d56Sopenharmony_ci 1357db96d56Sopenharmony_ci def test_overflow(self): 1367db96d56Sopenharmony_ci with self.assertRaises(OverflowError): 1377db96d56Sopenharmony_ci self.json.decoder.scanstring(b"xxx", sys.maxsize+1) 1387db96d56Sopenharmony_ci 1397db96d56Sopenharmony_ci 1407db96d56Sopenharmony_ciclass TestPyScanstring(TestScanstring, PyTest): pass 1417db96d56Sopenharmony_ciclass TestCScanstring(TestScanstring, CTest): pass 142