blob: a61ff1bd886626819ee26ec18df94e1686baf3d2 [file] [log] [blame]
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +01001#include "utils/conversion.hpp"
2
3#include <gmock/gmock.h>
4
5using namespace testing;
6
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +00007class TestConversion : public Test
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +01008{
9 public:
10 enum class Enum
11 {
12 zero = 0,
13 one,
14 two
15 };
16
17 Enum toEnum(int x)
18 {
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010019 return utils::toEnum<Enum, utils::minEnumValue(convDataEnum),
20 utils::maxEnumValue(convDataEnum)>(x);
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +010021 }
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +000022
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010023 Enum toEnum(const std::string& value)
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +000024 {
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010025 return utils::toEnum(convDataEnum, value);
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +000026 }
27
28 std::string enumToString(Enum value)
29 {
30 return std::string(utils::enumToString(convDataEnum, value));
31 }
32
33 static constexpr std::array<std::pair<std::string_view, Enum>, 3>
34 convDataEnum = {
35 {std::make_pair<std::string_view, Enum>("zero", Enum::zero),
36 std::make_pair<std::string_view, Enum>("one", Enum::one),
37 std::make_pair<std::string_view, Enum>("two", Enum::two)}};
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +010038};
39
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +000040TEST_F(TestConversion, passValueInRangeExpectToGetValidOutput)
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +010041{
42 EXPECT_EQ(toEnum(0), Enum::zero);
43 EXPECT_EQ(toEnum(2), Enum::two);
44}
45
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +000046TEST_F(TestConversion, passInvalidValueExpectToThrowOutOfRangeException)
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +010047{
48 EXPECT_THROW(toEnum(-1), std::out_of_range);
49 EXPECT_THROW(toEnum(3), std::out_of_range);
50}
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +000051
52TEST_F(TestConversion, convertsToUnderlyingType)
53{
54 EXPECT_THAT(utils::toUnderlying(Enum::one), Eq(1));
55 EXPECT_THAT(utils::toUnderlying(Enum::two), Eq(2));
56 EXPECT_THAT(utils::toUnderlying(Enum::zero), Eq(0));
57}
58
59TEST_F(TestConversion, convertsEnumToString)
60{
61 EXPECT_THAT(enumToString(Enum::one), Eq("one"));
62 EXPECT_THAT(enumToString(Enum::two), Eq("two"));
63 EXPECT_THAT(enumToString(Enum::zero), Eq("zero"));
64}
65
66TEST_F(TestConversion, convertsStringToEnum)
67{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010068 EXPECT_THAT(toEnum("one"), Eq(Enum::one));
69 EXPECT_THAT(toEnum("two"), Eq(Enum::two));
70 EXPECT_THAT(toEnum("zero"), Eq(Enum::zero));
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +000071}
72
73TEST_F(TestConversion, enumToStringThrowsWhenUknownEnumPassed)
74{
75 EXPECT_THROW(enumToString(static_cast<Enum>(77)), std::out_of_range);
76}
77
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010078TEST_F(TestConversion, toEnumThrowsWhenUknownStringPassed)
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +000079{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010080 EXPECT_THROW(toEnum("four"), std::out_of_range);
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +000081}