Handle NaN and Infinity in JSON stringify function

Co-authored-by: Thaddeus Crews <repiteo@outlook.com>
Co-authored-by: Lukas Tenbrink <lukas.tenbrink@gmail.com>
This commit is contained in:
Aaron Franke 2025-07-21 07:49:18 -07:00
parent 534591047e
commit cc13a376c5
No known key found for this signature in database
GPG key ID: 40A1750B977E56BF
3 changed files with 35 additions and 0 deletions

View file

@ -75,7 +75,18 @@ TEST_CASE("[JSON] Stringify arrays") {
full_precision_array.push_back(0.12345678901234568);
CHECK(JSON::stringify(full_precision_array, "", true, true) == "[0.12345678901234568]");
Array non_finite_array;
non_finite_array.push_back(Math::INF);
non_finite_array.push_back(-Math::INF);
non_finite_array.push_back(Math::NaN);
ERR_PRINT_OFF
CHECK(JSON::stringify(non_finite_array) == "[1e99999,-1e99999,null]");
Array non_finite_round_trip = JSON::parse_string(JSON::stringify(non_finite_array));
CHECK(non_finite_round_trip[0] == Variant(Math::INF));
CHECK(non_finite_round_trip[1] == Variant(-Math::INF));
CHECK(non_finite_round_trip[2].get_type() == Variant::NIL);
Array self_array;
self_array.push_back(self_array);
CHECK(JSON::stringify(self_array) == "[\"[...]\"]");
@ -113,7 +124,18 @@ TEST_CASE("[JSON] Stringify dictionaries") {
full_precision_dictionary["key"] = 0.12345678901234568;
CHECK(JSON::stringify(full_precision_dictionary, "", true, true) == "{\"key\":0.12345678901234568}");
Dictionary non_finite_dictionary;
non_finite_dictionary["-inf"] = -Math::INF;
non_finite_dictionary["inf"] = Math::INF;
non_finite_dictionary["nan"] = Math::NaN;
ERR_PRINT_OFF
CHECK(JSON::stringify(non_finite_dictionary) == "{\"-inf\":-1e99999,\"inf\":1e99999,\"nan\":null}");
Dictionary non_finite_round_trip = JSON::parse_string(JSON::stringify(non_finite_dictionary));
CHECK(non_finite_round_trip["-inf"] == Variant(-Math::INF));
CHECK(non_finite_round_trip["inf"] == Variant(Math::INF));
CHECK(non_finite_round_trip["nan"].get_type() == Variant::NIL);
Dictionary self_dictionary;
self_dictionary["key"] = self_dictionary;
CHECK(JSON::stringify(self_dictionary) == "{\"key\":\"{...}\"}");