|
21 | 21 | using namespace simdjson;
|
22 | 22 | using namespace simdjson::builtin;
|
23 | 23 |
|
| 24 | +#if SIMDJSON_EXCEPTIONS |
| 25 | + |
| 26 | +// bogus functions for compilation tests |
| 27 | +void process1(int ) {} |
| 28 | +void process2(int ) {} |
| 29 | +void process3(int ) {} |
| 30 | + |
| 31 | +// Do not run this, it is only meant to compile |
| 32 | +void compilation_test_1() { |
| 33 | + const padded_string bogus = ""_padded; |
| 34 | + ondemand::parser parser; |
| 35 | + auto doc = parser.iterate(bogus); |
| 36 | + for (ondemand::object my_object : doc["mykey"]) { |
| 37 | + for (auto field : my_object) { |
| 38 | + if (field.key() == "key_value1") { process1(field.value()); } |
| 39 | + else if (field.key() == "key_value2") { process2(field.value()); } |
| 40 | + else if (field.key() == "key_value3") { process3(field.value()); } |
| 41 | + } |
| 42 | + } |
| 43 | +} |
| 44 | +#endif |
| 45 | + |
24 | 46 | #define ONDEMAND_SUBTEST(NAME, JSON, TEST) \
|
25 | 47 | { \
|
26 | 48 | std::cout << "- Subtest " << (NAME) << " - JSON: " << (JSON) << " ..." << std::endl; \
|
@@ -637,6 +659,81 @@ namespace dom_api_tests {
|
637 | 659 | }
|
638 | 660 | }
|
639 | 661 |
|
| 662 | + |
| 663 | +namespace ordering_tests { |
| 664 | + using namespace std; |
| 665 | + using namespace simdjson; |
| 666 | + using namespace simdjson::dom; |
| 667 | +#if SIMDJSON_EXCEPTIONS |
| 668 | + |
| 669 | + auto json = "{\"coordinates\":[{\"x\":1.1,\"y\":2.2,\"z\":3.3}]}"_padded; |
| 670 | + |
| 671 | + bool in_order() { |
| 672 | + TEST_START(); |
| 673 | + ondemand::parser parser{}; |
| 674 | + auto doc = parser.iterate(json); |
| 675 | + double x{0}; |
| 676 | + double y{0}; |
| 677 | + double z{0}; |
| 678 | + for (ondemand::object point_object : doc["coordinates"]) { |
| 679 | + x += double(point_object["x"]); |
| 680 | + y += double(point_object["y"]); |
| 681 | + z += double(point_object["z"]); |
| 682 | + } |
| 683 | + return (x == 1.1) && (y == 2.2) && (z == 3.3); |
| 684 | + } |
| 685 | + |
| 686 | + bool out_of_order() { |
| 687 | + TEST_START(); |
| 688 | + ondemand::parser parser{}; |
| 689 | + auto doc = parser.iterate(json); |
| 690 | + double x{0}; |
| 691 | + double y{0}; |
| 692 | + double z{0}; |
| 693 | + for (ondemand::object point_object : doc["coordinates"]) { |
| 694 | + z += double(point_object["z"]); |
| 695 | + try { |
| 696 | + x += double(point_object["x"]); |
| 697 | + return false; |
| 698 | + } catch(simdjson_error&) {} |
| 699 | + try { |
| 700 | + y += double(point_object["y"]); |
| 701 | + return false; |
| 702 | + } catch(simdjson_error&) {} |
| 703 | + } |
| 704 | + return (x == 0) && (y == 0) && (z == 3.3); |
| 705 | + } |
| 706 | + |
| 707 | + bool robust_order() { |
| 708 | + TEST_START(); |
| 709 | + ondemand::parser parser{}; |
| 710 | + auto doc = parser.iterate(json); |
| 711 | + double x{0}; |
| 712 | + double y{0}; |
| 713 | + double z{0}; |
| 714 | + for (ondemand::object point_object : doc["coordinates"]) { |
| 715 | + for (auto field : point_object) { |
| 716 | + if (field.key() == "z") { z += double(field.value()); } |
| 717 | + else if (field.key() == "x") { x += double(field.value()); } |
| 718 | + else if (field.key() == "y") { y += double(field.value()); } |
| 719 | + } |
| 720 | + } |
| 721 | + return (x == 1.1) && (y == 2.2) && (z == 3.3); |
| 722 | + } |
| 723 | +#endif |
| 724 | + |
| 725 | + bool run() { |
| 726 | + return |
| 727 | +#if SIMDJSON_EXCEPTIONS |
| 728 | + in_order() && |
| 729 | + out_of_order() && |
| 730 | + robust_order() && |
| 731 | +#endif |
| 732 | + true; |
| 733 | + } |
| 734 | + |
| 735 | +} |
| 736 | + |
640 | 737 | namespace twitter_tests {
|
641 | 738 | using namespace std;
|
642 | 739 | using namespace simdjson;
|
@@ -1251,6 +1348,7 @@ int main(int argc, char *argv[]) {
|
1251 | 1348 | // twitter_tests::run() &&
|
1252 | 1349 | // number_tests::run() &&
|
1253 | 1350 | error_tests::run() &&
|
| 1351 | + ordering_tests::run() && |
1254 | 1352 | true
|
1255 | 1353 | ) {
|
1256 | 1354 | std::cout << "Basic tests are ok." << std::endl;
|
|
0 commit comments