diff --git a/libs/platform/platform_tests/CMakeLists.txt b/libs/platform/platform_tests/CMakeLists.txt index 454c2e55b..2cea6978d 100644 --- a/libs/platform/platform_tests/CMakeLists.txt +++ b/libs/platform/platform_tests/CMakeLists.txt @@ -7,6 +7,7 @@ set(SRC downloader_tests/downloader_test.cpp downloader_utils_tests.cpp get_text_by_id_tests.cpp + glaze_test.cpp jansson_test.cpp language_test.cpp local_country_file_tests.cpp @@ -24,4 +25,5 @@ target_link_libraries(${PROJECT_NAME} platform_tests_support platform cppjansson + glaze::glaze ) diff --git a/libs/platform/platform_tests/glaze_test.cpp b/libs/platform/platform_tests/glaze_test.cpp new file mode 100644 index 000000000..dd57c51b3 --- /dev/null +++ b/libs/platform/platform_tests/glaze_test.cpp @@ -0,0 +1,90 @@ +#include "testing/testing.hpp" + +#include "glaze/json.hpp" + +#include +#include + +enum class LocationSource +{ + GPS, + Network, + Unknown +}; + +// If enumeration should be represented as string instead of integer in JSON, +// then enum should be declared in the global namespace. +template <> +struct glz::meta +{ + using enum LocationSource; + static constexpr auto value = glz::enumerate(GPS, Network, Unknown); +}; + +// For our test macros. +std::string DebugPrint(LocationSource source) +{ + return std::string{glz::get_enum_name(source)}; +} + +namespace glaze_test +{ +struct Location +{ + LocationSource source; + double latitude; + double longitude; + double accuracy; + std::optional altitude; + std::optional altitudeAccuracy; +}; + +struct AccessToken +{ + Location location; + std::string accessToken; +}; + +UNIT_TEST(Glaze_Smoke) +{ + std::string_view constexpr fullJsonWithComments = R"({ + "location": { + "source": "GPS", // Where the location data comes from. + "latitude": 47.3345141, + "longitude": 8.5312839, + "accuracy": 22, + "altitude": 100.5, + "altitudeAccuracy": 5.0 + }, + /* Access token for authentication + * This token is used to access protected resources. + */ + "accessToken": "2:vC65Xv0mxMtsNVf4:hY5YSIkuFfnAU77z" +})"; + + AccessToken token; + auto error = glz::read_jsonc(token, fullJsonWithComments); + TEST(!error, (glz::format_error(error, fullJsonWithComments))); + + TEST_EQUAL(token.location.source, LocationSource::GPS, ()); + TEST_EQUAL(token.location.latitude, 47.3345141, ()); + TEST_EQUAL(token.location.longitude, 8.5312839, ()); + TEST_EQUAL(token.location.accuracy, 22.0, ()); + TEST_EQUAL(token.location.altitude, 100.5, ()); + TEST_EQUAL(token.location.altitudeAccuracy, 5.0, ()); + TEST_EQUAL(token.accessToken, "2:vC65Xv0mxMtsNVf4:hY5YSIkuFfnAU77z", ()); + + std::string_view constexpr partialJson = + R"({"location":{"source":"Network","latitude":47.3345141,"longitude":8.5312839,"accuracy":22},"accessToken":""})"; + + token.location.source = LocationSource::Network; + token.location.altitude = {}; + token.location.altitudeAccuracy = {}; + token.accessToken = {}; + + std::string buffer; + error = glz::write_json(token, buffer); + TEST(!error, (glz::format_error(error, "Failed to write JSON"))); + TEST_EQUAL(buffer, partialJson, ()); +} +} // namespace glaze_test