Skip to content

Commit bce754f

Browse files
committed
Amend JSON IO tests, now test that inf is loaded as NaN
1 parent 66fc69e commit bce754f

File tree

1 file changed

+43
-13
lines changed

1 file changed

+43
-13
lines changed

tests/test_cases/io/test_io.cu

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ namespace flamegpu {
1212
namespace test_io {
1313
bool validate_has_run = false;
1414
// Used by MiniSim3 where file name is required during a host function
15-
const char* current_test_file_name = nullptr;
15+
const char *current_test_file_name = "";
16+
// JSON IO converts inf to nan, so requires validation to change pre/post load
17+
bool is_loaded = false;
1618
const char *XML_FILE_NAME = "test.xml";
1719
const char *JSON_FILE_NAME = "test.json";
1820
const char *BIN_FILE_NAME = "test.bin";
@@ -52,12 +54,20 @@ FLAMEGPU_STEP_FUNCTION(VALIDATE_ENV) {
5254
// Limits
5355
EXPECT_TRUE(std::isnan(FLAMEGPU->environment.getProperty<float>("float_qnan")));
5456
EXPECT_TRUE(std::isnan(FLAMEGPU->environment.getProperty<float>("float_snan")));
55-
EXPECT_EQ(FLAMEGPU->environment.getProperty<float>("float_inf"), std::numeric_limits<float>::infinity());
56-
EXPECT_EQ(FLAMEGPU->environment.getProperty<float>("float_inf_neg"), -std::numeric_limits<float>::infinity());
5757
EXPECT_TRUE(std::isnan(FLAMEGPU->environment.getProperty<double>("double_qnan")));
5858
EXPECT_TRUE(std::isnan(FLAMEGPU->environment.getProperty<double>("double_snan")));
59-
EXPECT_EQ(FLAMEGPU->environment.getProperty<double>("double_inf"), std::numeric_limits<double>::infinity());
60-
EXPECT_EQ(FLAMEGPU->environment.getProperty<double>("double_inf_neg"), -std::numeric_limits<double>::infinity());
59+
if (std::string(current_test_file_name) == JSON_FILE_NAME && is_loaded) {
60+
// JSON spec does not support NaN/Inf, so they are all represented as Null values, which we load as nan
61+
EXPECT_TRUE(std::isnan(FLAMEGPU->environment.getProperty<float>("float_inf")));
62+
EXPECT_TRUE(std::isnan(FLAMEGPU->environment.getProperty<float>("float_inf_neg")));
63+
EXPECT_TRUE(std::isnan(FLAMEGPU->environment.getProperty<double>("double_inf")));
64+
EXPECT_TRUE(std::isnan(FLAMEGPU->environment.getProperty<double>("double_inf_neg")));
65+
} else {
66+
EXPECT_EQ(FLAMEGPU->environment.getProperty<float>("float_inf"), std::numeric_limits<float>::infinity());
67+
EXPECT_EQ(FLAMEGPU->environment.getProperty<float>("float_inf_neg"), -std::numeric_limits<float>::infinity());
68+
EXPECT_EQ(FLAMEGPU->environment.getProperty<double>("double_inf"), std::numeric_limits<double>::infinity());
69+
EXPECT_EQ(FLAMEGPU->environment.getProperty<double>("double_inf_neg"), -std::numeric_limits<double>::infinity());
70+
}
6171
}
6272
FLAMEGPU_STEP_FUNCTION(RESET_ENV) {
6373
FLAMEGPU->environment.setProperty<float>("float", {});
@@ -204,7 +214,9 @@ class MiniSim {
204214
::remove(test_file.c_str());
205215
}
206216
void run(const std::string &test_file_name) {
217+
current_test_file_name = test_file_name.c_str();
207218
this->test_file = test_file_name;
219+
is_loaded = false;
208220
// Assertions for limits
209221
ASSERT_TRUE(std::numeric_limits<float>::has_quiet_NaN);
210222
ASSERT_TRUE(std::numeric_limits<float>::has_signaling_NaN);
@@ -407,12 +419,20 @@ class MiniSim {
407419
// Limit values
408420
EXPECT_TRUE(std::isnan(agent_in.getVariable<float>("float_qnan")));
409421
EXPECT_TRUE(std::isnan(agent_in.getVariable<float>("float_snan")));
410-
EXPECT_EQ(agent_in.getVariable<float>("float_inf"), std::numeric_limits<float>::infinity());
411-
EXPECT_EQ(agent_in.getVariable<float>("float_inf_neg"), -std::numeric_limits<float>::infinity());
412422
EXPECT_TRUE(std::isnan(agent_in.getVariable<double>("double_qnan")));
413423
EXPECT_TRUE(std::isnan(agent_in.getVariable<double>("double_snan")));
414-
EXPECT_EQ(agent_in.getVariable<double>("double_inf"), std::numeric_limits<double>::infinity());
415-
EXPECT_EQ(agent_in.getVariable<double>("double_inf_neg"), -std::numeric_limits<double>::infinity());
424+
if (test_file_name == JSON_FILE_NAME) {
425+
// JSON spec does not support NaN/Inf, so they are all represented as Null values, which we load as nan
426+
EXPECT_TRUE(std::isnan(agent_in.getVariable<float>("float_inf")));
427+
EXPECT_TRUE(std::isnan(agent_in.getVariable<float>("float_inf_neg")));
428+
EXPECT_TRUE(std::isnan(agent_in.getVariable<double>("double_inf")));
429+
EXPECT_TRUE(std::isnan(agent_in.getVariable<double>("double_inf_neg")));
430+
} else {
431+
EXPECT_EQ(agent_in.getVariable<float>("float_inf"), std::numeric_limits<float>::infinity());
432+
EXPECT_EQ(agent_in.getVariable<float>("float_inf_neg"), -std::numeric_limits<float>::infinity());
433+
EXPECT_EQ(agent_in.getVariable<double>("double_inf"), std::numeric_limits<double>::infinity());
434+
EXPECT_EQ(agent_in.getVariable<double>("double_inf_neg"), -std::numeric_limits<double>::infinity());
435+
}
416436
}
417437
// Valid agent array vars
418438
ASSERT_EQ(pop_b_in.size(), pop_b_out.size());
@@ -452,6 +472,7 @@ class MiniSim {
452472
// Reload env vars from file
453473
am.SimulationConfig().input_file = test_file_name;
454474
am.applyConfig();
475+
is_loaded = true;
455476
// Step again, check they have been loaded
456477
validate_has_run = false;
457478
am.step();
@@ -477,6 +498,7 @@ class MiniSim {
477498
// Perform import
478499
const char *argv[3] = { "prog.exe", "--in", test_file_name.c_str()};
479500
EXPECT_NO_THROW(am.initialise(sizeof(argv) / sizeof(char*), argv));
501+
is_loaded = true;
480502
// Validate config matches
481503
EXPECT_EQ(am.getSimulationConfig().input_file, test_file_name);
482504
EXPECT_EQ(am.getSimulationConfig().step_log_file, "step");
@@ -515,12 +537,20 @@ class MiniSim {
515537
// Limit values
516538
EXPECT_TRUE(std::isnan(agent_in.getVariable<float>("float_qnan")));
517539
EXPECT_TRUE(std::isnan(agent_in.getVariable<float>("float_snan")));
518-
EXPECT_EQ(agent_in.getVariable<float>("float_inf"), std::numeric_limits<float>::infinity());
519-
EXPECT_EQ(agent_in.getVariable<float>("float_inf_neg"), -std::numeric_limits<float>::infinity());
520540
EXPECT_TRUE(std::isnan(agent_in.getVariable<double>("double_qnan")));
521541
EXPECT_TRUE(std::isnan(agent_in.getVariable<double>("double_snan")));
522-
EXPECT_EQ(agent_in.getVariable<double>("double_inf"), std::numeric_limits<double>::infinity());
523-
EXPECT_EQ(agent_in.getVariable<double>("double_inf_neg"), -std::numeric_limits<double>::infinity());
542+
if (test_file_name == JSON_FILE_NAME) {
543+
// JSON spec does not support NaN/Inf, so they are all represented as Null values, which we load as nan
544+
EXPECT_TRUE(std::isnan(agent_in.getVariable<float>("float_inf")));
545+
EXPECT_TRUE(std::isnan(agent_in.getVariable<float>("float_inf_neg")));
546+
EXPECT_TRUE(std::isnan(agent_in.getVariable<double>("double_inf")));
547+
EXPECT_TRUE(std::isnan(agent_in.getVariable<double>("double_inf_neg")));
548+
} else {
549+
EXPECT_EQ(agent_in.getVariable<float>("float_inf"), std::numeric_limits<float>::infinity());
550+
EXPECT_EQ(agent_in.getVariable<float>("float_inf_neg"), -std::numeric_limits<float>::infinity());
551+
EXPECT_EQ(agent_in.getVariable<double>("double_inf"), std::numeric_limits<double>::infinity());
552+
EXPECT_EQ(agent_in.getVariable<double>("double_inf_neg"), -std::numeric_limits<double>::infinity());
553+
}
524554
}
525555
// Valid agent array vars
526556
ASSERT_EQ(pop_b_in.size(), pop_b_out.size());

0 commit comments

Comments
 (0)