192 lines
8.2 KiB
C++
192 lines
8.2 KiB
C++
#include "simdjson.h"
|
|
#include "test_ondemand.h"
|
|
|
|
using namespace simdjson;
|
|
|
|
namespace object_tests {
|
|
using namespace std;
|
|
using simdjson::ondemand::json_type;
|
|
|
|
bool object_find_field_unordered() {
|
|
TEST_START();
|
|
auto json = R"({ "a": 1, "b": 2, "c/d": 3})"_padded;
|
|
SUBTEST("ondemand::object", test_ondemand_doc(json, [&](auto doc_result) {
|
|
ondemand::object object;
|
|
ASSERT_SUCCESS( doc_result.get(object) );
|
|
|
|
ASSERT_EQUAL( object.find_field_unordered("a").get_uint64().value_unsafe(), 1 );
|
|
ASSERT_EQUAL( object.find_field_unordered("b").get_uint64().value_unsafe(), 2 );
|
|
ASSERT_EQUAL( object.find_field_unordered("c/d").get_uint64().value_unsafe(), 3 );
|
|
|
|
ASSERT_EQUAL( object.find_field_unordered("a").get_uint64().value_unsafe(), 1 );
|
|
ASSERT_ERROR( object.find_field_unordered("d"), NO_SUCH_FIELD );
|
|
return true;
|
|
}));
|
|
SUBTEST("simdjson_result<ondemand::object>", test_ondemand_doc(json, [&](auto doc_result) {
|
|
simdjson_result<ondemand::object> object;
|
|
object = doc_result.get_object();
|
|
|
|
ASSERT_EQUAL( object.find_field_unordered("a").get_uint64().value_unsafe(), 1 );
|
|
ASSERT_EQUAL( object.find_field_unordered("b").get_uint64().value_unsafe(), 2 );
|
|
ASSERT_EQUAL( object.find_field_unordered("c/d").get_uint64().value_unsafe(), 3 );
|
|
|
|
ASSERT_EQUAL( object.find_field_unordered("a").get_uint64().value_unsafe(), 1 );
|
|
ASSERT_ERROR( object.find_field_unordered("d"), NO_SUCH_FIELD );
|
|
return true;
|
|
}));
|
|
TEST_SUCCEED();
|
|
}
|
|
|
|
bool document_object_find_field_unordered() {
|
|
TEST_START();
|
|
auto json = R"({ "a": 1, "b": 2, "c/d": 3})"_padded;
|
|
SUBTEST("ondemand::document", test_ondemand_doc(json, [&](auto doc_result) {
|
|
ondemand::document doc;
|
|
ASSERT_SUCCESS( std::move(doc_result).get(doc) );
|
|
ASSERT_EQUAL( doc.find_field_unordered("a").get_uint64().value_unsafe(), 1 );
|
|
ASSERT_EQUAL( doc.find_field_unordered("b").get_uint64().value_unsafe(), 2 );
|
|
ASSERT_EQUAL( doc.find_field_unordered("c/d").get_uint64().value_unsafe(), 3 );
|
|
|
|
ASSERT_EQUAL( doc.find_field_unordered("a").get_uint64().value_unsafe(), 1 );
|
|
ASSERT_ERROR( doc.find_field_unordered("d"), NO_SUCH_FIELD );
|
|
return true;
|
|
}));
|
|
SUBTEST("simdjson_result<ondemand::document>", test_ondemand_doc(json, [&](auto doc_result) {
|
|
ASSERT_EQUAL( doc_result.find_field_unordered("a").get_uint64().value_unsafe(), 1 );
|
|
ASSERT_EQUAL( doc_result.find_field_unordered("b").get_uint64().value_unsafe(), 2 );
|
|
ASSERT_EQUAL( doc_result.find_field_unordered("c/d").get_uint64().value_unsafe(), 3 );
|
|
|
|
ASSERT_EQUAL( doc_result.find_field_unordered("a").get_uint64().value_unsafe(), 1 );
|
|
ASSERT_ERROR( doc_result.find_field_unordered("d"), NO_SUCH_FIELD );
|
|
return true;
|
|
}));
|
|
TEST_SUCCEED();
|
|
}
|
|
|
|
bool value_object_find_field_unordered() {
|
|
TEST_START();
|
|
auto json = R"({ "outer": { "a": 1, "b": 2, "c/d": 3 } })"_padded;
|
|
SUBTEST("ondemand::value", test_ondemand_doc(json, [&](auto doc_result) {
|
|
ondemand::value object;
|
|
ASSERT_SUCCESS( doc_result.find_field_unordered("outer").get(object) );
|
|
ASSERT_EQUAL( object.find_field_unordered("a").get_uint64().value_unsafe(), 1 );
|
|
ASSERT_EQUAL( object.find_field_unordered("b").get_uint64().value_unsafe(), 2 );
|
|
ASSERT_EQUAL( object.find_field_unordered("c/d").get_uint64().value_unsafe(), 3 );
|
|
|
|
ASSERT_EQUAL( object.find_field_unordered("a").get_uint64().value_unsafe(), 1 );
|
|
ASSERT_ERROR( object.find_field_unordered("d"), NO_SUCH_FIELD );
|
|
return true;
|
|
}));
|
|
SUBTEST("simdjson_result<ondemand::value>", test_ondemand_doc(json, [&](auto doc_result) {
|
|
simdjson_result<ondemand::value> object = doc_result.find_field_unordered("outer");
|
|
ASSERT_EQUAL( object.find_field_unordered("a").get_uint64().value_unsafe(), 1 );
|
|
ASSERT_EQUAL( object.find_field_unordered("b").get_uint64().value_unsafe(), 2 );
|
|
ASSERT_EQUAL( object.find_field_unordered("c/d").get_uint64().value_unsafe(), 3 );
|
|
|
|
ASSERT_EQUAL( object.find_field_unordered("a").get_uint64().value_unsafe(), 1 );
|
|
ASSERT_ERROR( object.find_field_unordered("d"), NO_SUCH_FIELD );
|
|
return true;
|
|
}));
|
|
TEST_SUCCEED();
|
|
}
|
|
|
|
bool object_find_field() {
|
|
TEST_START();
|
|
auto json = R"({ "a": 1, "b": 2, "c/d": 3})"_padded;
|
|
SUBTEST("ondemand::object", test_ondemand_doc(json, [&](auto doc_result) {
|
|
ondemand::object object;
|
|
ASSERT_SUCCESS( doc_result.get(object) );
|
|
|
|
ASSERT_EQUAL( object.find_field("a").get_uint64().value_unsafe(), 1 );
|
|
ASSERT_EQUAL( object.find_field("b").get_uint64().value_unsafe(), 2 );
|
|
ASSERT_EQUAL( object.find_field("c/d").get_uint64().value_unsafe(), 3 );
|
|
|
|
ASSERT_ERROR( object.find_field("a"), NO_SUCH_FIELD );
|
|
ASSERT_ERROR( object.find_field("d"), NO_SUCH_FIELD );
|
|
return true;
|
|
}));
|
|
SUBTEST("simdjson_result<ondemand::object>", test_ondemand_doc(json, [&](auto doc_result) {
|
|
simdjson_result<ondemand::object> object;
|
|
object = doc_result.get_object();
|
|
|
|
ASSERT_EQUAL( object.find_field("a").get_uint64().value_unsafe(), 1 );
|
|
ASSERT_EQUAL( object.find_field("b").get_uint64().value_unsafe(), 2 );
|
|
ASSERT_EQUAL( object.find_field("c/d").get_uint64().value_unsafe(), 3 );
|
|
|
|
ASSERT_ERROR( object.find_field("a"), NO_SUCH_FIELD );
|
|
ASSERT_ERROR( object.find_field("d"), NO_SUCH_FIELD );
|
|
return true;
|
|
}));
|
|
TEST_SUCCEED();
|
|
}
|
|
|
|
bool document_object_find_field() {
|
|
TEST_START();
|
|
auto json = R"({ "a": 1, "b": 2, "c/d": 3})"_padded;
|
|
SUBTEST("ondemand::document", test_ondemand_doc(json, [&](auto doc_result) {
|
|
ondemand::document doc;
|
|
ASSERT_SUCCESS( std::move(doc_result).get(doc) );
|
|
ASSERT_EQUAL( doc.find_field("a").get_uint64().value_unsafe(), 1 );
|
|
ASSERT_EQUAL( doc.find_field("b").get_uint64().value_unsafe(), 2 );
|
|
ASSERT_EQUAL( doc.find_field("c/d").get_uint64().value_unsafe(), 3 );
|
|
|
|
ASSERT_ERROR( doc.find_field("a"), NO_SUCH_FIELD );
|
|
ASSERT_ERROR( doc.find_field("d"), NO_SUCH_FIELD );
|
|
return true;
|
|
}));
|
|
SUBTEST("simdjson_result<ondemand::document>", test_ondemand_doc(json, [&](auto doc_result) {
|
|
ASSERT_EQUAL( doc_result.find_field("a").get_uint64().value_unsafe(), 1 );
|
|
ASSERT_EQUAL( doc_result.find_field("b").get_uint64().value_unsafe(), 2 );
|
|
ASSERT_EQUAL( doc_result.find_field("c/d").get_uint64().value_unsafe(), 3 );
|
|
|
|
ASSERT_ERROR( doc_result.find_field("a"), NO_SUCH_FIELD );
|
|
ASSERT_ERROR( doc_result.find_field("d"), NO_SUCH_FIELD );
|
|
return true;
|
|
}));
|
|
TEST_SUCCEED();
|
|
}
|
|
|
|
bool value_object_find_field() {
|
|
TEST_START();
|
|
auto json = R"({ "outer": { "a": 1, "b": 2, "c/d": 3 } })"_padded;
|
|
SUBTEST("ondemand::value", test_ondemand_doc(json, [&](auto doc_result) {
|
|
ondemand::value object;
|
|
ASSERT_SUCCESS( doc_result.find_field("outer").get(object) );
|
|
ASSERT_EQUAL( object.find_field("a").get_uint64().value_unsafe(), 1 );
|
|
ASSERT_EQUAL( object.find_field("b").get_uint64().value_unsafe(), 2 );
|
|
ASSERT_EQUAL( object.find_field("c/d").get_uint64().value_unsafe(), 3 );
|
|
|
|
ASSERT_ERROR( object.find_field("a"), NO_SUCH_FIELD );
|
|
ASSERT_ERROR( object.find_field("d"), NO_SUCH_FIELD );
|
|
return true;
|
|
}));
|
|
SUBTEST("simdjson_result<ondemand::value>", test_ondemand_doc(json, [&](auto doc_result) {
|
|
simdjson_result<ondemand::value> object = doc_result.find_field("outer");
|
|
ASSERT_EQUAL( object.find_field("a").get_uint64().value_unsafe(), 1 );
|
|
ASSERT_EQUAL( object.find_field("b").get_uint64().value_unsafe(), 2 );
|
|
ASSERT_EQUAL( object.find_field("c/d").get_uint64().value_unsafe(), 3 );
|
|
|
|
ASSERT_ERROR( object.find_field("a"), NO_SUCH_FIELD );
|
|
ASSERT_ERROR( object.find_field("d"), NO_SUCH_FIELD );
|
|
return true;
|
|
}));
|
|
TEST_SUCCEED();
|
|
}
|
|
|
|
bool run() {
|
|
return
|
|
object_find_field_unordered() &&
|
|
document_object_find_field_unordered() &&
|
|
value_object_find_field_unordered() &&
|
|
object_find_field() &&
|
|
document_object_find_field() &&
|
|
value_object_find_field() &&
|
|
true;
|
|
}
|
|
|
|
} // namespace object_tests
|
|
|
|
int main(int argc, char *argv[]) {
|
|
return test_main(argc, argv, object_tests::run);
|
|
}
|