diff --git a/core/test/test_properties.cpp b/core/test/test_properties.cpp index f8843964..9f885a2e 100644 --- a/core/test/test_properties.cpp +++ b/core/test/test_properties.cpp @@ -5,18 +5,123 @@ using namespace moveit::task_constructor; -TEST(Property, serialContainer) { +TEST(Property, standard) { + PropertyMap props; + props.declare("double1", 1, "first"); + props.declare("double2", 2); + props.declare("double4"); + + EXPECT_EQ(props.get("double1"), 1.0); + EXPECT_EQ(props.get("double2"), 2.0); + EXPECT_THROW(props.get("double3"), std::runtime_error); + + EXPECT_THROW(props.get("double4"), std::runtime_error); + EXPECT_FALSE(props.property("double4").defined()); + EXPECT_EQ(props.get("double4", 0.0), 0.0); + + props.set("double3", 3.0); + EXPECT_EQ(props.get("double3"), 3.0); +} + +TEST(Property, redeclare) { PropertyMap props; props.declare("double1"); - props.declare("double2", 1); // avoid second declaration with different type props.declare("double1"); - ASSERT_THROW(props.declare("double1"), std::runtime_error); + EXPECT_THROW(props.declare("double1"), std::logic_error); // types not matching? - ASSERT_THROW(props.set("double1", 1), std::runtime_error); + EXPECT_THROW(props.set("double1", 1), std::logic_error); props.set("double1", 3.14); - ASSERT_EQ(props.get("double1"), 3.14); + EXPECT_EQ(props.get("double1"), 3.14); +} + +TEST(Property, reset) { + PropertyMap props; + props.declare("double1"); + + // setCurrent() only assigns temporary values + props.setCurrent("double1", 1.0); + ASSERT_EQ(props.get("double1"), 1.0); + EXPECT_TRUE(props.property("double1").defaultValue().empty()); + + // they can be reset to their defaults + props.reset(); + EXPECT_FALSE(props.property("double1").defined()); + + // set() also updates the default + props.set("double1", 1.0); + EXPECT_EQ(props.get("double1"), 1.0); + EXPECT_EQ(boost::any_cast(props.property("double1").defaultValue()), 1.0); + + props.setCurrent("double1", 2.0); + EXPECT_EQ(props.get("double1"), 2.0); + EXPECT_EQ(boost::any_cast(props.property("double1").defaultValue()), 1.0); + + // back to default + props.reset(); + EXPECT_EQ(props.get("double1"), 1.0); +} + +class InitFromTest : public ::testing::Test { +protected: + void SetUp() { + master.declare("double1", 1); + master.declare("double2", 2); + master.declare("double4", 4); + + slave.declare("double1"); + slave.declare("double2"); + slave.declare("double3"); + } + PropertyMap master; + PropertyMap slave; +}; + +TEST_F(InitFromTest, standard) { + slave.configureInitFrom(0); // init all matching vars + ASSERT_FALSE(slave.property("double1").defined()); + + slave.performInitFrom(0, master); + EXPECT_EQ(slave.get("double1"), 1.0); + EXPECT_EQ(slave.get("double2"), 2.0); + EXPECT_FALSE(slave.property("double3").defined()); + EXPECT_THROW(slave.property("double4"), std::runtime_error); +} + +TEST_F(InitFromTest, limited) { + slave.configureInitFrom(0, {"double1"}); // limit init to listed props + slave.performInitFrom(0, master); + EXPECT_EQ(slave.get("double1"), 1.0); + EXPECT_FALSE(slave.property("double2").defined()); + EXPECT_FALSE(slave.property("double3").defined()); + EXPECT_THROW(slave.property("double4"), std::runtime_error); +} + +TEST_F(InitFromTest, sourceId) { + slave.configureInitFrom(0); // init all matching vars + slave.performInitFrom(1, master); // init with wrong sourceId -> no effect + EXPECT_FALSE(slave.property("double1").defined()); + EXPECT_FALSE(slave.property("double2").defined()); + EXPECT_FALSE(slave.property("double3").defined()); + EXPECT_THROW(slave.property("double4"), std::runtime_error); +} + +TEST_F(InitFromTest, otherName) { + slave.property("double1").configureInitFrom(0, "double2"); // init double1 from double2 + slave.performInitFrom(0, master); + EXPECT_EQ(slave.get("double1"), 2.0); + EXPECT_FALSE(slave.property("double2").defined()); + EXPECT_FALSE(slave.property("double3").defined()); + EXPECT_THROW(slave.property("double4"), std::runtime_error); +} + +TEST_F(InitFromTest, function) { + slave.property("double3").configureInitFrom(0, [](const PropertyMap& other) -> boost::any { + return other.get("double1") + other.get("double2"); + }); + slave.performInitFrom(0, master); + EXPECT_EQ(slave.get("double3"), 3.0); }