Coverage Report

Created: 2025-07-31 16:33

test/zserio/BuiltInOperatorsTest.cpp
Line
Count
Source
1
#include "gtest/gtest.h"
2
#include "zserio/BuiltInOperators.h"
3
#include "zserio/Enums.h"
4
#include "zserio/Types.h"
5
6
namespace zserio
7
{
8
9
namespace
10
{
11
12
enum class Color : UInt8::ValueType
13
{
14
    NONE = UINT8_C(0),
15
    RED = UINT8_C(2),
16
    BLUE = UINT8_C(3),
17
    BLACK = UINT8_C(7)
18
};
19
20
} // namespace
21
22
template <>
23
struct EnumTraits<Color>
24
{
25
    using ZserioType = UInt8;
26
};
27
28
namespace builtin
29
{
30
31
namespace
32
{
33
34
class DummyBitmask
35
{
36
public:
37
    using ZserioType = UInt8;
38
39
    enum class Values : ZserioType::ValueType
40
    {
41
        READ = 1U,
42
        WRITE = 2U,
43
        CREATE = 1U | 2U
44
    };
45
46
    constexpr DummyBitmask(Values value) noexcept :
47
25
            m_value(static_cast<ZserioType::ValueType>(value))
48
25
    {}
49
50
    constexpr explicit DummyBitmask(ZserioType value) noexcept :
51
8
            m_value(value)
52
8
    {}
53
54
    constexpr ZserioType getValue() const
55
36
    {
56
36
        return m_value;
57
36
    }
58
59
private:
60
    ZserioType m_value;
61
};
62
63
inline bool operator==(const DummyBitmask& lhs, const DummyBitmask& rhs)
64
7
{
65
7
    return lhs.getValue() == rhs.getValue();
66
7
}
67
68
inline DummyBitmask operator|(const DummyBitmask& lhs, const DummyBitmask& rhs)
69
1
{
70
1
    return DummyBitmask(lhs.getValue() | rhs.getValue());
71
1
}
72
73
inline DummyBitmask operator|(DummyBitmask::Values lhs, DummyBitmask::Values rhs)
74
1
{
75
1
    return DummyBitmask(lhs) | DummyBitmask(rhs);
76
1
}
77
78
inline DummyBitmask operator&(const DummyBitmask& lhs, const DummyBitmask& rhs)
79
7
{
80
7
    return DummyBitmask(lhs.getValue() & rhs.getValue());
81
7
}
82
83
inline DummyBitmask operator&(DummyBitmask::Values lhs, DummyBitmask::Values rhs)
84
3
{
85
3
    return DummyBitmask(lhs) & DummyBitmask(rhs);
86
3
}
87
88
} // namespace
89
90
TEST(BuiltInOperatorsTest, isSet)
91
1
{
92
    // randomly mix bitmask instances with DummyBitmask::Values enum values to check that all variants work
93
1
    ASSERT_TRUE(isSet(DummyBitmask(DummyBitmask::Values::READ), DummyBitmask::Values::READ));
94
1
    ASSERT_TRUE(isSet(DummyBitmask::Values::CREATE, DummyBitmask::Values::READ));
95
1
    ASSERT_TRUE(isSet(DummyBitmask::Values::CREATE, DummyBitmask(DummyBitmask::Values::WRITE)));
96
1
    ASSERT_TRUE(isSet(DummyBitmask::Values::CREATE, DummyBitmask::Values::CREATE));
97
1
    ASSERT_TRUE(isSet(DummyBitmask::Values::CREATE, DummyBitmask::Values::READ | DummyBitmask::Values::WRITE));
98
1
    ASSERT_FALSE(isSet(DummyBitmask(DummyBitmask::Values::READ), DummyBitmask(DummyBitmask::Values::WRITE)));
99
1
    ASSERT_FALSE(isSet(DummyBitmask::Values::READ, DummyBitmask::Values::CREATE));
100
1
}
101
102
TEST(BuiltInOperatorsTest, numBits)
103
1
{
104
1
    EXPECT_EQ(0, numBits(0));
105
1
    EXPECT_EQ(1, numBits(1));
106
1
    EXPECT_EQ(1, numBits(2));
107
1
    EXPECT_EQ(2, numBits(3));
108
1
    EXPECT_EQ(2, numBits(4));
109
1
    EXPECT_EQ(3, numBits(5));
110
1
    EXPECT_EQ(3, numBits(6));
111
1
    EXPECT_EQ(3, numBits(7));
112
1
    EXPECT_EQ(3, numBits(8));
113
1
    EXPECT_EQ(4, numBits(16));
114
1
    EXPECT_EQ(5, numBits(32));
115
1
    EXPECT_EQ(6, numBits(64));
116
1
    EXPECT_EQ(7, numBits(128));
117
1
    EXPECT_EQ(8, numBits(256));
118
1
    EXPECT_EQ(9, numBits(512));
119
1
    EXPECT_EQ(10, numBits(1024));
120
1
    EXPECT_EQ(11, numBits(2048));
121
1
    EXPECT_EQ(12, numBits(4096));
122
1
    EXPECT_EQ(13, numBits(8192));
123
1
    EXPECT_EQ(14, numBits(16384));
124
1
    EXPECT_EQ(15, numBits(32768));
125
1
    EXPECT_EQ(16, numBits(65536));
126
1
    EXPECT_EQ(24, numBits(UINT64_C(1) << 24U));
127
1
    EXPECT_EQ(25, numBits((UINT64_C(1) << 24U) + 1));
128
1
    EXPECT_EQ(32, numBits(UINT64_C(1) << 32U));
129
1
    EXPECT_EQ(33, numBits((UINT64_C(1) << 32U) + 1));
130
1
    EXPECT_EQ(63, numBits(UINT64_C(1) << 63U));
131
1
    EXPECT_EQ(64, numBits((UINT64_C(1) << 63U) + 1));
132
1
}
133
134
TEST(BuiltinOperatorsTest, valueOf)
135
1
{
136
1
    EXPECT_EQ(DummyBitmask(DummyBitmask::Values::READ).getValue(),
137
1
            valueOf(DummyBitmask(DummyBitmask::Values::READ)));
138
1
    EXPECT_EQ(DummyBitmask(DummyBitmask::Values::WRITE).getValue(),
139
1
            valueOf(DummyBitmask(DummyBitmask::Values::WRITE)));
140
1
    EXPECT_EQ(DummyBitmask(DummyBitmask::Values::CREATE).getValue(),
141
1
            valueOf(DummyBitmask(DummyBitmask::Values::CREATE)));
142
143
1
    EXPECT_EQ(enumToValue(Color::NONE), valueOf(Color::NONE));
144
1
    EXPECT_EQ(enumToValue(Color::RED), valueOf(Color::RED));
145
1
    EXPECT_EQ(enumToValue(Color::BLUE), valueOf(Color::BLUE));
146
1
    EXPECT_EQ(enumToValue(Color::BLACK), valueOf(Color::BLACK));
147
1
}
148
149
} // namespace builtin
150
151
} // namespace zserio