Coverage Report

Created: 2024-09-23 09:09

test/zserio/BuiltInOperatorsTest.cpp
Line
Count
Source
1
#include "gtest/gtest.h"
2
#include "zserio/BuiltInOperators.h"
3
4
namespace zserio
5
{
6
7
namespace builtin
8
{
9
10
namespace
11
{
12
13
class DummyBitmask
14
{
15
public:
16
    using underlying_type = uint8_t;
17
18
    enum class Values : underlying_type
19
    {
20
        READ = 1U,
21
        WRITE = 2U,
22
        CREATE = 1U | 2U
23
    };
24
25
    constexpr DummyBitmask(Values value) noexcept :
26
            m_value(static_cast<underlying_type>(value))
27
11
    {}
28
29
    constexpr explicit DummyBitmask(underlying_type value) noexcept :
30
            m_value(value)
31
8
    {}
32
33
    constexpr underlying_type getValue() const
34
22
    {
35
22
        return m_value;
36
22
    }
37
38
private:
39
    underlying_type m_value;
40
};
41
42
inline bool operator==(const DummyBitmask& lhs, const DummyBitmask& rhs)
43
7
{
44
7
    return lhs.getValue() == rhs.getValue();
45
7
}
46
47
inline DummyBitmask operator|(DummyBitmask::Values lhs, DummyBitmask::Values rhs)
48
1
{
49
1
    return DummyBitmask(
50
1
            static_cast<DummyBitmask::underlying_type>(lhs) | static_cast<DummyBitmask::underlying_type>(rhs));
51
1
}
52
53
inline DummyBitmask operator&(DummyBitmask::Values lhs, DummyBitmask::Values rhs)
54
3
{
55
3
    return DummyBitmask(
56
3
            static_cast<DummyBitmask::underlying_type>(lhs) & static_cast<DummyBitmask::underlying_type>(rhs));
57
3
}
58
59
inline DummyBitmask operator&(const DummyBitmask& lhs, const DummyBitmask& rhs)
60
4
{
61
4
    return DummyBitmask(lhs.getValue() & rhs.getValue());
62
4
}
63
64
} // namespace
65
66
TEST(BuiltInOperatorsTest, isSet)
67
1
{
68
    // randomly mix bitmask instances with DummyBitmask::Values enum values to check that all variants work
69
1
    ASSERT_TRUE(isSet(DummyBitmask(DummyBitmask::Values::READ), DummyBitmask::Values::READ));
70
1
    ASSERT_TRUE(isSet(DummyBitmask::Values::CREATE, DummyBitmask::Values::READ));
71
1
    ASSERT_TRUE(isSet(DummyBitmask::Values::CREATE, DummyBitmask(DummyBitmask::Values::WRITE)));
72
1
    ASSERT_TRUE(isSet(DummyBitmask::Values::CREATE, DummyBitmask::Values::CREATE));
73
1
    ASSERT_TRUE(isSet(DummyBitmask::Values::CREATE, DummyBitmask::Values::READ | DummyBitmask::Values::WRITE));
74
1
    ASSERT_FALSE(isSet(DummyBitmask(DummyBitmask::Values::READ), DummyBitmask(DummyBitmask::Values::WRITE)));
75
1
    ASSERT_FALSE(isSet(DummyBitmask::Values::READ, DummyBitmask::Values::CREATE));
76
1
}
77
78
TEST(BuiltInOperatorsTest, numBits)
79
1
{
80
1
    EXPECT_EQ(0, numBits(0));
81
1
    EXPECT_EQ(1, numBits(1));
82
1
    EXPECT_EQ(1, numBits(2));
83
1
    EXPECT_EQ(2, numBits(3));
84
1
    EXPECT_EQ(2, numBits(4));
85
1
    EXPECT_EQ(3, numBits(5));
86
1
    EXPECT_EQ(3, numBits(6));
87
1
    EXPECT_EQ(3, numBits(7));
88
1
    EXPECT_EQ(3, numBits(8));
89
1
    EXPECT_EQ(4, numBits(16));
90
1
    EXPECT_EQ(5, numBits(32));
91
1
    EXPECT_EQ(6, numBits(64));
92
1
    EXPECT_EQ(7, numBits(128));
93
1
    EXPECT_EQ(8, numBits(256));
94
1
    EXPECT_EQ(9, numBits(512));
95
1
    EXPECT_EQ(10, numBits(1024));
96
1
    EXPECT_EQ(11, numBits(2048));
97
1
    EXPECT_EQ(12, numBits(4096));
98
1
    EXPECT_EQ(13, numBits(8192));
99
1
    EXPECT_EQ(14, numBits(16384));
100
1
    EXPECT_EQ(15, numBits(32768));
101
1
    EXPECT_EQ(16, numBits(65536));
102
1
    EXPECT_EQ(24, numBits(UINT64_C(1) << 24U));
103
1
    EXPECT_EQ(25, numBits((UINT64_C(1) << 24U) + 1));
104
1
    EXPECT_EQ(32, numBits(UINT64_C(1) << 32U));
105
1
    EXPECT_EQ(33, numBits((UINT64_C(1) << 32U) + 1));
106
1
    EXPECT_EQ(63, numBits(UINT64_C(1) << 63U));
107
1
    EXPECT_EQ(64, numBits((UINT64_C(1) << 63U) + 1));
108
1
}
109
110
} // namespace builtin
111
112
} // namespace zserio