diff --git a/include/core/utils/converter.h b/include/core/utils/converter.h index 0c9502c4ec0cc12ce041611d3a86d5c035af9d09..7a266d50b2e26eb387ff03ac9ba1f94ab1c39437 100644 --- a/include/core/utils/converter.h +++ b/include/core/utils/converter.h @@ -17,6 +17,7 @@ #include <vector> #include <stack> #include <list> +#include <math.h> /** @file @@ -96,13 +97,21 @@ struct converter<utils::list<A>>{ template<> struct converter<int>{ static int convert(std::string val){ - return stod(val); + double res; + if (modf(stod(val),&res) > 0) + throw std::runtime_error("Invalid conversion to int: The number contains decimals: " + val); + return res; } }; template<> struct converter<unsigned int>{ static unsigned int convert(std::string val){ - return stod(val); + double res; + if (modf(stod(val),&res) > 0) + throw std::runtime_error("Invalid conversion to unsigned int: The number contains decimals: " + val); + if (res < 0) + throw std::runtime_error("Invalid conversion to unsigned int: The number is negative: " + val); + return res; } }; template<> @@ -114,8 +123,8 @@ struct converter<double>{ template<> struct converter<bool>{ static bool convert(std::string val){ - if(val == "true") return true; - else if (val == "false") return false; + if(val == "true" or val=="True" or val=="TRUE") return true; + else if (val == "false" or val=="False" or val=="FALSE") return false; else throw std::runtime_error("Invalid conversion to bool (Must be either \"true\" or \"false\"). String provided: " + val); } }; diff --git a/test/gtest_param_server.cpp b/test/gtest_param_server.cpp index 1f1f468360e1aa5073606f8ea32e7d82cafbc438..bf427f782f1fbb6e790a498535a8d1c03f56af55 100644 --- a/test/gtest_param_server.cpp +++ b/test/gtest_param_server.cpp @@ -9,18 +9,63 @@ using namespace wolf; std::string wolf_root = _WOLF_ROOT_DIR; -//TEST(ParamsServer, Default) -//{ -// auto parser = parse("test/yaml/params1.yaml", wolf_root); -// auto params = parser.getParams(); -// ParamsServer server = ParamsServer(params, parser.sensorsSerialization(), parser.processorsSerialization()); -// EXPECT_EQ(server.getParam<double>("should_not_exist", "2.6"), 2.6); -// EXPECT_EQ(server.getParam<bool>("my_proc_test/voting_active", "true"), false); -// EXPECT_NE(server.getParam<unsigned int>("my_proc_test/time_tolerance", "23"), 23); -// EXPECT_THROW({ server.getParam<unsigned int>("test error"); }, std::runtime_error); -// EXPECT_NE(server.getParam<unsigned int>("my_proc_test/time_tolerance"), 23); -// EXPECT_EQ(server.getParam<bool>("my_proc_test/voting_active"), false); -//} +TEST(ParamsServer, Default) +{ + ParserYaml parser = ParserYaml("test/yaml/params_basic.yaml", wolf_root); + ParamsServer server = ParamsServer(parser.getParams()); +} + +TEST(ParamsServer, getParamsOk) +{ + ParserYaml parser = ParserYaml("test/yaml/params_basic.yaml", wolf_root); + ParamsServer server = ParamsServer(parser.getParams()); + + EXPECT_EQ(server.getParam<int>("int_1"), -3); + EXPECT_EQ(server.getParam<int>("int_2"), 0); + EXPECT_EQ(server.getParam<int>("int_3"), 6); + + EXPECT_EQ(server.getParam<unsigned int>("uint_1"), 2); + EXPECT_EQ(server.getParam<unsigned int>("uint_2"), 0); + EXPECT_EQ(server.getParam<unsigned int>("uint_3"), 6); + + EXPECT_EQ(server.getParam<double>("double_1"), 3.6); + EXPECT_EQ(server.getParam<double>("double_2"), -3); + EXPECT_EQ(server.getParam<double>("double_3"), 3.6); + + EXPECT_EQ(server.getParam<std::string>("string_1"), std::string("wolf")); + EXPECT_EQ(server.getParam<std::string>("string_2"), std::string("Wolf")); + + EXPECT_EQ(server.getParam<bool>("bool_1"), true); + EXPECT_EQ(server.getParam<bool>("bool_2"), true); + EXPECT_EQ(server.getParam<bool>("bool_3"), true); + EXPECT_EQ(server.getParam<bool>("bool_4"), true); + EXPECT_EQ(server.getParam<bool>("bool_5"), false); + EXPECT_EQ(server.getParam<bool>("bool_6"), false); + EXPECT_EQ(server.getParam<bool>("bool_7"), false); + EXPECT_EQ(server.getParam<bool>("bool_8"), false); +} + +TEST(ParamsServer, getParamsWrong) +{ + ParserYaml parser = ParserYaml("test/yaml/params_basic.yaml", wolf_root); + ParamsServer server = ParamsServer(parser.getParams()); + + EXPECT_ANY_THROW({ server.getParam<double>("should_not_exist"); }); + + EXPECT_ANY_THROW({ server.getParam<int>("int_wrong_1"); }); + EXPECT_ANY_THROW({ server.getParam<int>("int_wrong_2"); }); + EXPECT_ANY_THROW({ server.getParam<int>("int_wrong_3"); }); + + EXPECT_ANY_THROW({ server.getParam<unsigned int>("uint_wrong_1"); }); + EXPECT_ANY_THROW({ server.getParam<unsigned int>("uint_wrong_2"); }); + EXPECT_ANY_THROW({ server.getParam<unsigned int>("uint_wrong_3"); }); + EXPECT_ANY_THROW({ server.getParam<unsigned int>("uint_wrong_4"); }); + + EXPECT_ANY_THROW({ server.getParam<double>("double_wrong_1"); }); + EXPECT_ANY_THROW({ server.getParam<double>("double_wrong_2"); }); + + EXPECT_ANY_THROW({ server.getParam<bool>("bool_wrong_2"); }); +} int main(int argc, char **argv) { diff --git a/test/yaml/params1.yaml b/test/yaml/params1.yaml index de23e1f71055b731663efcc424b05fcebe37f5ea..b8d6dd7b62bf8c457dd6de8ce1813d48487af0cc 100644 --- a/test/yaml/params1.yaml +++ b/test/yaml/params1.yaml @@ -39,6 +39,3 @@ config: sensor_name: "odom" plugin: "core" follow: "test/yaml/processor_odom_3d.yaml" -files: - - "/home/jcasals/workspace/wip/wolf/lib/libsensor_odo.so" - - "/home/jcasals/workspace/wip/wolf/lib/librange_bearing.so" \ No newline at end of file diff --git a/test/yaml/params2.yaml b/test/yaml/params2.yaml index 6829e2d53212689e08d8c9b90290abad6d57631b..1aadb76249e83db650ee7a3c2d55aa0b0bcce2af 100644 --- a/test/yaml/params2.yaml +++ b/test/yaml/params2.yaml @@ -36,6 +36,3 @@ config: name: "my_proc_test" sensor_name: "odom" plugin: "core" -files: - - "/home/jcasals/workspace/wip/wolf/lib/libsensor_odo.so" - - "/home/jcasals/workspace/wip/wolf/lib/librange_bearing.so" \ No newline at end of file diff --git a/test/yaml/params_basic.yaml b/test/yaml/params_basic.yaml new file mode 100644 index 0000000000000000000000000000000000000000..730381520149ef3d51a8428e4cf08778d869a4ea --- /dev/null +++ b/test/yaml/params_basic.yaml @@ -0,0 +1,35 @@ +config: + problem: + dim: 2 + + int_1: -3 + int_2: 0 + int_3: "6" + uint_1: 2 + uint_2: 0 + uint_3: "6" + double_1: 3.6 + double_2: -3 + double_3: "3.6" + string_1: wolf + string_2: "Wolf" + bool_1: true + bool_2: True + bool_3: TRUE + bool_4: "true" + bool_5: false + bool_6: False + bool_7: FALSE + bool_8: "false" + + int_wrong_1: 2.3 + int_wrong_2: "wolf" + int_wrong_3: true + uint_wrong_1: -2 + uint_wrong_2: 3.5 + uint_wrong_3: "wolf" + uint_wrong_4: true + double_wrong_1: "wolf" + double_wrong_2: true + bool_wrong: 1 +