#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", test_ondemand_doc(json, [&](auto doc_result) { simdjson_result 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", 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", test_ondemand_doc(json, [&](auto doc_result) { simdjson_result 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", test_ondemand_doc(json, [&](auto doc_result) { simdjson_result 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", 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", test_ondemand_doc(json, [&](auto doc_result) { simdjson_result 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); }