// GNU Lesser General Public License v3.0 // Copyright (c) 2023 Bart Beumer // // This program is free software; you can redistribute it and/or modify it // under the terms of the GNU Lesser General Public License v3.0 as published by // the Free Software Foundation. // #include "MockDataSource.hpp" #include "bmrshared/IDataSource.hpp" #include "bmrshared/flexible_value.hpp" #include "bmrshared/to_tuple.hpp" #include #include #include using ::bmrshared::MockDataSource; using ::testing::An; using ::testing::ElementsAre; using ::testing::Return; using ::testing::SetArgReferee; using ::testing::Throw; TEST(ToTupleTest, Ok) { MockDataSource mockSrc; EXPECT_CALL(mockSrc, GetKeys()).WillRepeatedly(Return(std::vector{"a", "b", "c"})); EXPECT_CALL(mockSrc, Get("a", An())).WillRepeatedly(SetArgReferee<1>(42)); EXPECT_CALL(mockSrc, Get("b", An())).WillRepeatedly(SetArgReferee<1>(4.2)); EXPECT_CALL(mockSrc, Get("c", An())).WillRepeatedly(SetArgReferee<1>("test")); using TupleType = std::tuple; const std::array names{"a", "b", "c"}; const TupleType expected{42, 4.2, "test"}; TupleType result; bmrshared::to_tuple(mockSrc, names, result); EXPECT_EQ(expected, result); } TEST(ToTupleTest, MissingParameter) { MockDataSource mockSrc; EXPECT_CALL(mockSrc, GetKeys()).WillRepeatedly(Return(std::vector{"a", "c"})); EXPECT_CALL(mockSrc, Get("a", An())).WillRepeatedly(SetArgReferee<1>(42)); EXPECT_CALL(mockSrc, Get("b", An())).WillRepeatedly(Throw(std::runtime_error(""))); EXPECT_CALL(mockSrc, Get("c", An())).WillRepeatedly(SetArgReferee<1>("test")); using TupleType = std::tuple; const std::array names{"a", "b", "c"}; try { TupleType result; bmrshared::to_tuple(mockSrc, names, result); EXPECT_TRUE(false); } catch (const bmrshared::ToTupleException& e) { EXPECT_THAT(e.GetKeysMissing(), ElementsAre("b")); EXPECT_THAT(e.GetKeysNotUsed(), ElementsAre()); } } TEST(ToTupleTest, NotUsedParameter) { MockDataSource mockSrc; EXPECT_CALL(mockSrc, GetKeys()).WillRepeatedly(Return(std::vector{"a", "b", "c", "d"})); EXPECT_CALL(mockSrc, Get("a", An())).WillRepeatedly(SetArgReferee<1>(42)); EXPECT_CALL(mockSrc, Get("b", An())).WillRepeatedly(SetArgReferee<1>(4.2)); EXPECT_CALL(mockSrc, Get("c", An())).WillRepeatedly(SetArgReferee<1>("test")); using TupleType = std::tuple; const std::array names{"a", "b", "c"}; try { TupleType result; bmrshared::to_tuple(mockSrc, names, result); EXPECT_TRUE(false); } catch (const bmrshared::ToTupleException& e) { EXPECT_THAT(e.GetKeysMissing(), ElementsAre()); EXPECT_THAT(e.GetKeysNotUsed(), ElementsAre("d")); } }