From c250ce1c3dcb61dd50e1cc799fb59c45680479b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Vallv=C3=A9=20Navarro?= <jvallve@iri.upc.edu> Date: Thu, 4 Feb 2021 11:10:00 +0100 Subject: [PATCH] bad param type in yaml throwing runtime_error --- include/core/utils/converter.h | 17 +++++++-- test/gtest_param_server.cpp | 69 ++++++++++++++++++++++++++++------ test/yaml/params1.yaml | 3 -- test/yaml/params2.yaml | 3 -- test/yaml/params_basic.yaml | 35 +++++++++++++++++ 5 files changed, 105 insertions(+), 22 deletions(-) create mode 100644 test/yaml/params_basic.yaml diff --git a/include/core/utils/converter.h b/include/core/utils/converter.h index 0c9502c4e..7a266d50b 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 1f1f46836..bf427f782 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 de23e1f71..b8d6dd7b6 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 6829e2d53..1aadb7624 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 000000000..730381520 --- /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 + -- GitLab