From 4a2f62aed7b172a19d09e72443ecdb66725cb928 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Sat, 17 Feb 2024 13:37:27 +0100 Subject: [PATCH] fix #488: Use Value constructor for numbers in jsonToValue() --- src/internal/reader_common.h | 13 +-------- test/load_project/load_project_test.cpp | 25 +++++++++++++++--- .../488_scientific_notation_conversion.sb3 | Bin 0 -> 797 bytes 3 files changed, 23 insertions(+), 15 deletions(-) create mode 100644 test/regtest_projects/488_scientific_notation_conversion.sb3 diff --git a/src/internal/reader_common.h b/src/internal/reader_common.h index 09815d01..840a1aa3 100644 --- a/src/internal/reader_common.h +++ b/src/internal/reader_common.h @@ -13,18 +13,7 @@ Value jsonToValue(nlohmann::json value) { if (value.is_string()) return value.get(); - else if (value.is_number()) { - // Set locale to C to avoid conversion issues - std::string oldLocale = std::setlocale(LC_NUMERIC, nullptr); - std::setlocale(LC_NUMERIC, "C"); - - double converted = std::stod(value.dump()); - - // Restore old locale - std::setlocale(LC_NUMERIC, oldLocale.c_str()); - - return converted; - } else if (value.is_boolean()) + else if (value.is_boolean()) return value.get(); else return value.dump(); diff --git a/test/load_project/load_project_test.cpp b/test/load_project/load_project_test.cpp index dbacec3d..767a5feb 100644 --- a/test/load_project/load_project_test.cpp +++ b/test/load_project/load_project_test.cpp @@ -231,7 +231,8 @@ TEST(LoadProjectTest, LoadTestProject) // Stage: lists ASSERT_LIST(stage, "list1"); - ASSERT_EQ(GET_LIST(stage, "list1")->toString(), "3 1 4 8 7 6 7 7 2 4"); + ASSERT_EQ(GET_LIST(stage, "list1")->size(), 10); + ASSERT_EQ(GET_LIST(stage, "list1")->toString(), "3148767724"); // Sprite1 ASSERT_NE(engine->findTarget("Sprite1"), -1); @@ -282,7 +283,8 @@ TEST(LoadProjectTest, LoadTestProject) // Sprite1: lists ASSERT_LIST(sprite1, "list2"); - ASSERT_EQ(GET_LIST(sprite1, "list2")->toString(), "9 6 3 8 0 4 4 2 9 7"); + ASSERT_EQ(GET_LIST(sprite1, "list2")->size(), 10); + ASSERT_EQ(GET_LIST(sprite1, "list2")->toString(), "9638044297"); // Sprite1: blocks ASSERT_EQ(sprite1->greenFlagBlocks().size(), 1); @@ -445,7 +447,8 @@ TEST(LoadProjectTest, LoadTestProject) // Balloon1: lists ASSERT_LIST(sprite2, "list2"); - ASSERT_EQ(GET_LIST(sprite2, "list2")->toString(), "0 4 3 4 1 5 6 9 4 8"); + ASSERT_EQ(GET_LIST(sprite2, "list2")->size(), 10); + ASSERT_EQ(GET_LIST(sprite2, "list2")->toString(), "0434156948"); // Monitors const auto &monitors = engine->monitors(); @@ -740,3 +743,19 @@ TEST(LoadProjectTest, LoadDoubleValue) std::setlocale(LC_NUMERIC, oldLocale.c_str()); } + +TEST(LoadProjectTest, LoadScientificNotationNumber) +{ + // Regtest for #488 + std::string name = "regtest_projects/488_scientific_notation_conversion.sb3"; + Project p(name); + ASSERT_TRUE(p.load()); + + auto stage = p.engine()->stage(); + ASSERT_TRUE(stage); + ASSERT_VAR(stage, "test1"); + ASSERT_EQ(GET_VAR(stage, "test1")->value().toDouble(), 5000); + + ASSERT_VAR(stage, "test2"); + ASSERT_EQ(GET_VAR(stage, "test2")->value().toDouble(), 0); +} diff --git a/test/regtest_projects/488_scientific_notation_conversion.sb3 b/test/regtest_projects/488_scientific_notation_conversion.sb3 new file mode 100644 index 0000000000000000000000000000000000000000..1c9001fc0ace918a6dceb356f69219cd7472cd98 GIT binary patch literal 797 zcmWIWW@Zs#U|`^2(9H>q;1Sd}uVG|h2xDSk-~oyj6y;~7CYR`C73b&m2Ki=78w%|G z9==7GiT9??t@V%IE!9<&Z*}4`RLtZk(doUrHhj{=E!}6!{#UzY&vx?Px!3%&$>%gT zW|k6dF1c6F8Kvsw3tR)(uLm-*nI_*jF7)D}>5h!ft;~OZ6>t3)^)Gjx|GMk(cIURG z-+_@DOy=tLcO%ZVN89Kch0m@3_aQ(&)KWz?R;2Qyk=g|_ zyI+zLdUIS=Kg#E?jgjB5C2F!|TFP^o&EBt_#bdiQW_+mIa#)9ZO7_z?ZMlty8m?c< zMJ(Sl&FloSLWvWzNh-OpL1%H{FWWc<(E!o1Zv6!Ft8&NmZvJ+sIbYCeyqPTP|OnS@JPb zaq@