@@ -2492,12 +2492,35 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithNoErrors) {
2492
2492
JSONTEST_ASSERT (reader.getStructuredErrors ().empty ());
2493
2493
}
2494
2494
2495
+ JSONTEST_FIXTURE_LOCAL (ReaderTest, parseComment) {
2496
+ Json::Reader reader;
2497
+ Json::Value root;
2498
+ bool ok = reader.parse (" { /*commentBeforeValue*/"
2499
+ " \" property\" : \" value\" }"
2500
+ " //commentAfterValue\n " ,
2501
+ root);
2502
+ JSONTEST_ASSERT (ok);
2503
+ JSONTEST_ASSERT (reader.getFormattedErrorMessages ().empty ());
2504
+ JSONTEST_ASSERT (reader.getStructuredErrors ().empty ());
2505
+ }
2506
+
2507
+ JSONTEST_FIXTURE_LOCAL (ReaderTest, streamParseWithNoErrors) {
2508
+ Json::Reader reader;
2509
+ std::string styled = " { \" property\" : \" value\" }" ;
2510
+ std::istringstream iss (styled);
2511
+ Json::Value root;
2512
+ bool ok = reader.parse (iss, root);
2513
+ JSONTEST_ASSERT (ok);
2514
+ JSONTEST_ASSERT (reader.getFormattedErrorMessages ().empty ());
2515
+ JSONTEST_ASSERT (reader.getStructuredErrors ().empty ());
2516
+ }
2517
+
2495
2518
JSONTEST_FIXTURE_LOCAL (ReaderTest, parseWithNoErrorsTestingOffsets) {
2496
2519
Json::Reader reader;
2497
2520
Json::Value root;
2498
2521
bool ok = reader.parse (" { \" property\" : [\" value\" , \" value2\" ], \" obj\" : "
2499
- " { \" nested\" : 123 , \" bool\" : true}, \" null\" : "
2500
- " null, \" false\" : false }" ,
2522
+ " { \" nested\" : -6.2e+15 , \" bool\" : true}, \" null\" :"
2523
+ " null, \" false\" : false }" ,
2501
2524
root);
2502
2525
JSONTEST_ASSERT (ok);
2503
2526
JSONTEST_ASSERT (reader.getFormattedErrorMessages ().empty ());
@@ -2509,17 +2532,17 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithNoErrorsTestingOffsets) {
2509
2532
JSONTEST_ASSERT (root[" property" ][1 ].getOffsetStart () == 25 );
2510
2533
JSONTEST_ASSERT (root[" property" ][1 ].getOffsetLimit () == 33 );
2511
2534
JSONTEST_ASSERT (root[" obj" ].getOffsetStart () == 44 );
2512
- JSONTEST_ASSERT (root[" obj" ].getOffsetLimit () == 76 );
2535
+ JSONTEST_ASSERT (root[" obj" ].getOffsetLimit () == 81 );
2513
2536
JSONTEST_ASSERT (root[" obj" ][" nested" ].getOffsetStart () == 57 );
2514
- JSONTEST_ASSERT (root[" obj" ][" nested" ].getOffsetLimit () == 60 );
2515
- JSONTEST_ASSERT (root[" obj" ][" bool" ].getOffsetStart () == 71 );
2516
- JSONTEST_ASSERT (root[" obj" ][" bool" ].getOffsetLimit () == 75 );
2517
- JSONTEST_ASSERT (root[" null" ].getOffsetStart () == 87 );
2518
- JSONTEST_ASSERT (root[" null" ].getOffsetLimit () == 91 );
2519
- JSONTEST_ASSERT (root[" false" ].getOffsetStart () == 103 );
2520
- JSONTEST_ASSERT (root[" false" ].getOffsetLimit () == 108 );
2537
+ JSONTEST_ASSERT (root[" obj" ][" nested" ].getOffsetLimit () == 65 );
2538
+ JSONTEST_ASSERT (root[" obj" ][" bool" ].getOffsetStart () == 76 );
2539
+ JSONTEST_ASSERT (root[" obj" ][" bool" ].getOffsetLimit () == 80 );
2540
+ JSONTEST_ASSERT (root[" null" ].getOffsetStart () == 92 );
2541
+ JSONTEST_ASSERT (root[" null" ].getOffsetLimit () == 96 );
2542
+ JSONTEST_ASSERT (root[" false" ].getOffsetStart () == 108 );
2543
+ JSONTEST_ASSERT (root[" false" ].getOffsetLimit () == 113 );
2521
2544
JSONTEST_ASSERT (root.getOffsetStart () == 0 );
2522
- JSONTEST_ASSERT (root.getOffsetLimit () == 110 );
2545
+ JSONTEST_ASSERT (root.getOffsetLimit () == 115 );
2523
2546
}
2524
2547
2525
2548
JSONTEST_FIXTURE_LOCAL (ReaderTest, parseWithOneError) {
@@ -2539,6 +2562,26 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithOneError) {
2539
2562
" Syntax error: value, object or array expected." );
2540
2563
}
2541
2564
2565
+ JSONTEST_FIXTURE_LOCAL (ReaderTest, strictModeParseNumber) {
2566
+ Json::Features feature;
2567
+ Json::Reader reader (feature.strictMode ());
2568
+ Json::Value root;
2569
+ bool ok = reader.parse (" 123" , root);
2570
+ JSONTEST_ASSERT (!ok);
2571
+ JSONTEST_ASSERT (reader.getFormattedErrorMessages () ==
2572
+ " * Line 1, Column 1\n "
2573
+ " A valid JSON document must be either an array or"
2574
+ " an object value.\n " );
2575
+ std::vector<Json::Reader::StructuredError> errors =
2576
+ reader.getStructuredErrors ();
2577
+ JSONTEST_ASSERT (errors.size () == 1 );
2578
+ JSONTEST_ASSERT (errors.at (0 ).offset_start == 0 );
2579
+ JSONTEST_ASSERT (errors.at (0 ).offset_limit == 3 );
2580
+ JSONTEST_ASSERT (errors.at (0 ).message ==
2581
+ " A valid JSON document must be either an array or"
2582
+ " an object value." );
2583
+ }
2584
+
2542
2585
JSONTEST_FIXTURE_LOCAL (ReaderTest, parseChineseWithOneError) {
2543
2586
Json::Reader reader;
2544
2587
Json::Value root;
@@ -2592,7 +2635,7 @@ JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseWithNoErrorsTestingOffsets) {
2592
2635
Json::String errs;
2593
2636
Json::Value root;
2594
2637
char const doc[] = " { \" property\" : [\" value\" , \" value2\" ], \" obj\" : "
2595
- " { \" nested\" : 123 , \" bool\" : true}, \" null\" : "
2638
+ " { \" nested\" : -6.2e+15 , \" bool\" : true}, \" null\" : "
2596
2639
" null, \" false\" : false }" ;
2597
2640
bool ok = reader->parse (doc, doc + std::strlen (doc), &root, &errs);
2598
2641
JSONTEST_ASSERT (ok);
@@ -2666,6 +2709,14 @@ JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseWithStackLimit) {
2666
2709
}
2667
2710
}
2668
2711
2712
+ JSONTEST_FIXTURE_LOCAL (CharReaderTest, testOperator) {
2713
+ const std::string styled = " { \" property\" : \" value\" }" ;
2714
+ std::istringstream iss (styled);
2715
+ Json::Value root;
2716
+ iss >> root;
2717
+ JSONTEST_ASSERT_EQUAL (" value" , root[" property" ]);
2718
+ }
2719
+
2669
2720
struct CharReaderStrictModeTest : JsonTest::TestCase {};
2670
2721
2671
2722
JSONTEST_FIXTURE_LOCAL (CharReaderStrictModeTest, dupKeys) {
@@ -2921,6 +2972,25 @@ JSONTEST_FIXTURE_LOCAL(CharReaderAllowDropNullTest, issue178) {
2921
2972
delete reader;
2922
2973
}
2923
2974
2975
+ struct CharReaderAllowNumericKeysTest : JsonTest::TestCase {};
2976
+
2977
+ JSONTEST_FIXTURE_LOCAL (CharReaderAllowNumericKeysTest, allowNumericKeys) {
2978
+ Json::CharReaderBuilder b;
2979
+ b.settings_ [" allowNumericKeys" ] = true ;
2980
+ Json::Value root;
2981
+ Json::String errs;
2982
+ Json::CharReader* reader (b.newCharReader ());
2983
+ char const doc[] = " {15:true,-16:true,12.01:true}" ;
2984
+ bool ok = reader->parse (doc, doc + std::strlen (doc), &root, &errs);
2985
+ JSONTEST_ASSERT (ok);
2986
+ JSONTEST_ASSERT_STRING_EQUAL (" " , errs);
2987
+ JSONTEST_ASSERT_EQUAL (3u , root.size ());
2988
+ JSONTEST_ASSERT_EQUAL (true , root.get (" 15" , false ));
2989
+ JSONTEST_ASSERT_EQUAL (true , root.get (" -16" , false ));
2990
+ JSONTEST_ASSERT_EQUAL (true , root.get (" 12.01" , false ));
2991
+ delete reader;
2992
+ }
2993
+
2924
2994
struct CharReaderAllowSingleQuotesTest : JsonTest::TestCase {};
2925
2995
2926
2996
JSONTEST_FIXTURE_LOCAL (CharReaderAllowSingleQuotesTest, issue182) {
@@ -3053,6 +3123,53 @@ JSONTEST_FIXTURE_LOCAL(CharReaderAllowSpecialFloatsTest, issue209) {
3053
3123
delete reader;
3054
3124
}
3055
3125
3126
+ struct EscapeSequenceTest : JsonTest::TestCase {};
3127
+
3128
+ JSONTEST_FIXTURE_LOCAL (EscapeSequenceTest, readerParseEscapeSequence) {
3129
+ Json::Reader reader;
3130
+ Json::Value root;
3131
+ bool ok = reader.parse (" [\"\\\"\" ,\"\\ /\" ,\"\\\\\" ,\"\\ b\" ,"
3132
+ " \"\\ f\" ,\"\\ n\" ,\"\\ r\" ,\"\\ t\" ,"
3133
+ " \"\\ u0278\" ,\"\\ ud852\\ udf62\" ]\n " ,
3134
+ root);
3135
+ JSONTEST_ASSERT (ok);
3136
+ JSONTEST_ASSERT (reader.getFormattedErrorMessages ().empty ());
3137
+ JSONTEST_ASSERT (reader.getStructuredErrors ().empty ());
3138
+ }
3139
+
3140
+ JSONTEST_FIXTURE_LOCAL (EscapeSequenceTest, charReaderParseEscapeSequence) {
3141
+ Json::CharReaderBuilder b;
3142
+ Json::CharReader* reader (b.newCharReader ());
3143
+ Json::Value root;
3144
+ Json::String errs;
3145
+ char const doc[] = " [\"\\\"\" ,\"\\ /\" ,\"\\\\\" ,\"\\ b\" ,"
3146
+ " \"\\ f\" ,\"\\ n\" ,\"\\ r\" ,\"\\ t\" ,"
3147
+ " \"\\ u0278\" ,\"\\ ud852\\ udf62\" ]" ;
3148
+ bool ok = reader->parse (doc, doc + std::strlen (doc), &root, &errs);
3149
+ JSONTEST_ASSERT (ok);
3150
+ JSONTEST_ASSERT (errs.empty ());
3151
+ delete reader;
3152
+ }
3153
+
3154
+ JSONTEST_FIXTURE_LOCAL (EscapeSequenceTest, writeEscapeSequence) {
3155
+ Json::FastWriter writer;
3156
+ const Json::String expected (" [\"\\\"\" ,\"\\\\\" ,\"\\ b\" ,"
3157
+ " \"\\ f\" ,\"\\ n\" ,\"\\ r\" ,\"\\ t\" ,"
3158
+ " \"\\ u0278\" ,\"\\ ud852\\ udf62\" ]\n " );
3159
+ Json::Value root;
3160
+ root[0 ] = " \" " ;
3161
+ root[1 ] = " \\ " ;
3162
+ root[2 ] = " \b " ;
3163
+ root[3 ] = " \f " ;
3164
+ root[4 ] = " \n " ;
3165
+ root[5 ] = " \r " ;
3166
+ root[6 ] = " \t " ;
3167
+ root[7 ] = " ɸ" ;
3168
+ root[8 ] = " 𤭢" ;
3169
+ const Json::String result = writer.write (root);
3170
+ JSONTEST_ASSERT_STRING_EQUAL (expected, result);
3171
+ }
3172
+
3056
3173
struct BuilderTest : JsonTest::TestCase {};
3057
3174
3058
3175
JSONTEST_FIXTURE_LOCAL (BuilderTest, settings) {
0 commit comments