168 lines
4.9 KiB
C++
168 lines
4.9 KiB
C++
#include "simdjson.h"
|
|
#include "test_ondemand.h"
|
|
|
|
using namespace simdjson;
|
|
|
|
namespace ordering_tests {
|
|
using namespace std;
|
|
|
|
#if SIMDJSON_EXCEPTIONS
|
|
|
|
auto json = "{\"coordinates\":[{\"x\":1.1,\"y\":2.2,\"z\":3.3}]}"_padded;
|
|
|
|
bool in_order_object_index() {
|
|
TEST_START();
|
|
ondemand::parser parser{};
|
|
auto doc = parser.iterate(json);
|
|
double x{0};
|
|
double y{0};
|
|
double z{0};
|
|
for (ondemand::object point_object : doc["coordinates"]) {
|
|
x += double(point_object["x"]);
|
|
y += double(point_object["y"]);
|
|
z += double(point_object["z"]);
|
|
}
|
|
return (x == 1.1) && (y == 2.2) && (z == 3.3);
|
|
}
|
|
|
|
bool in_order_object_find_field_unordered() {
|
|
TEST_START();
|
|
ondemand::parser parser{};
|
|
auto doc = parser.iterate(json);
|
|
double x{0};
|
|
double y{0};
|
|
double z{0};
|
|
for (ondemand::object point_object : doc["coordinates"]) {
|
|
x += double(point_object.find_field_unordered("x"));
|
|
y += double(point_object.find_field_unordered("y"));
|
|
z += double(point_object.find_field_unordered("z"));
|
|
}
|
|
return (x == 1.1) && (y == 2.2) && (z == 3.3);
|
|
}
|
|
|
|
bool in_order_object_find_field() {
|
|
TEST_START();
|
|
ondemand::parser parser{};
|
|
auto doc = parser.iterate(json);
|
|
double x{0};
|
|
double y{0};
|
|
double z{0};
|
|
for (ondemand::object point_object : doc["coordinates"]) {
|
|
x += double(point_object.find_field("x"));
|
|
y += double(point_object.find_field("y"));
|
|
z += double(point_object.find_field("z"));
|
|
}
|
|
return (x == 1.1) && (y == 2.2) && (z == 3.3);
|
|
}
|
|
|
|
bool out_of_order_object_index() {
|
|
TEST_START();
|
|
ondemand::parser parser{};
|
|
auto doc = parser.iterate(json);
|
|
double x{0};
|
|
double y{0};
|
|
double z{0};
|
|
for (ondemand::object point_object : doc["coordinates"]) {
|
|
z += double(point_object["z"]);
|
|
x += double(point_object["x"]);
|
|
y += double(point_object["y"]);
|
|
}
|
|
return (x == 1.1) && (y == 2.2) && (z == 3.3);
|
|
}
|
|
|
|
bool out_of_order_object_find_field_unordered() {
|
|
TEST_START();
|
|
ondemand::parser parser{};
|
|
auto doc = parser.iterate(json);
|
|
double x{0};
|
|
double y{0};
|
|
double z{0};
|
|
for (ondemand::object point_object : doc["coordinates"]) {
|
|
z += double(point_object.find_field_unordered("z"));
|
|
x += double(point_object.find_field_unordered("x"));
|
|
y += double(point_object.find_field_unordered("y"));
|
|
}
|
|
return (x == 1.1) && (y == 2.2) && (z == 3.3);
|
|
}
|
|
|
|
bool out_of_order_object_find_field() {
|
|
TEST_START();
|
|
ondemand::parser parser{};
|
|
auto doc = parser.iterate(json);
|
|
double x{0};
|
|
double y{0};
|
|
double z{0};
|
|
for (ondemand::object point_object : doc["coordinates"]) {
|
|
z += double(point_object.find_field("z"));
|
|
ASSERT_ERROR( point_object.find_field("x"), NO_SUCH_FIELD );
|
|
ASSERT_ERROR( point_object.find_field("y"), NO_SUCH_FIELD );
|
|
}
|
|
return (x == 0) && (y == 0) && (z == 3.3);
|
|
}
|
|
|
|
bool foreach_object_field_lookup() {
|
|
TEST_START();
|
|
ondemand::parser parser{};
|
|
auto doc = parser.iterate(json);
|
|
double x{0};
|
|
double y{0};
|
|
double z{0};
|
|
for (auto point_object : doc["coordinates"]) {
|
|
for (auto field : point_object.get_object()) {
|
|
if (field.key() == "z") { z += double(field.value()); }
|
|
else if (field.key() == "x") { x += double(field.value()); }
|
|
else if (field.key() == "y") { y += double(field.value()); }
|
|
}
|
|
}
|
|
return (x == 1.1) && (y == 2.2) && (z == 3.3);
|
|
}
|
|
|
|
bool use_values_out_of_order_after_array() {
|
|
TEST_START();
|
|
ondemand::parser parser{};
|
|
auto doc = parser.iterate(json);
|
|
simdjson_result<ondemand::value> x{}, y{}, z{};
|
|
for (auto point_object : doc["coordinates"]) {
|
|
x = point_object["x"];
|
|
y = point_object["y"];
|
|
z = point_object["z"];
|
|
}
|
|
return (double(x) == 1.1) && (double(z) == 3.3) && (double(y) == 2.2);
|
|
}
|
|
|
|
bool use_object_multiple_times_out_of_order() {
|
|
TEST_START();
|
|
ondemand::parser parser{};
|
|
auto json2 = "{\"coordinates\":{\"x\":1.1,\"y\":2.2,\"z\":3.3}}"_padded;
|
|
auto doc = parser.iterate(json2);
|
|
auto x = doc["coordinates"]["x"];
|
|
auto y = doc["coordinates"]["y"];
|
|
auto z = doc["coordinates"]["z"];
|
|
return (double(x) == 1.1) && (double(z) == 3.3) && (double(y) == 2.2);
|
|
}
|
|
|
|
#endif // SIMDJSON_EXCEPTIONS
|
|
|
|
bool run() {
|
|
return
|
|
#if SIMDJSON_EXCEPTIONS
|
|
in_order_object_index() &&
|
|
in_order_object_find_field_unordered() &&
|
|
in_order_object_find_field() &&
|
|
out_of_order_object_index() &&
|
|
out_of_order_object_find_field_unordered() &&
|
|
out_of_order_object_find_field() &&
|
|
foreach_object_field_lookup() &&
|
|
use_values_out_of_order_after_array() &&
|
|
use_object_multiple_times_out_of_order() &&
|
|
#endif // SIMDJSON_EXCEPTIONS
|
|
true;
|
|
}
|
|
|
|
} // namespace ordering_tests
|
|
|
|
|
|
int main(int argc, char *argv[]) {
|
|
return test_main(argc, argv, ordering_tests::run);
|
|
}
|