forked from KKoovalsky/PortableBitfields
-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_operations_on_bitfields.cpp
64 lines (51 loc) · 1.87 KB
/
test_operations_on_bitfields.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/**
* @file test_operations_on_bitfiels.cpp
* @brief Tests basic operations on bitfields.
* @author Kacper Kowalski - mailprivate
*/
#include <catch2/catch_template_test_macros.hpp>
#include <catch2/catch_test_macros.hpp>
#include "jungles/bitfields.hpp"
#include "helpers.hpp"
#include <cinttypes>
using namespace jungles;
TEST_CASE("Operations on bitfields for one byte long bitfield", "[operations]")
{
Bitfields<uint8_t, Field<Reg::field1, 3>, Field<Reg::field2, 2>, Field<Reg::field3, 3>> bf;
SECTION("Setting most-right field")
{
bf.at<Reg::field1>() = 0b010;
REQUIRE(bf.at<Reg::field1>() == 0b010);
}
SECTION("Setting field in the middle")
{
bf.at<Reg::field2>() = 0b11;
REQUIRE(bf.at<Reg::field2>() == 0b11);
}
SECTION("Bitwise OR operation")
{
bf.at<Reg::field3>() = 0b10;
bf.at<Reg::field3>() |= 0b11;
REQUIRE(bf.at<Reg::field3>() == 0b11);
}
SECTION("Bitwise bit clearing")
{
bf.at<Reg::field3>() = 0b111;
bf.at<Reg::field3>() &= ~0b010;
REQUIRE(bf.at<Reg::field3>() == 0b101);
}
}
TEST_CASE("Operations on bitfields for unsigned as underlying type", "[operations]")
{
Bitfields<unsigned, Field<Reg::field1, 30>, Field<Reg::field2, 1>, Field<Reg::field3, 1>> bf;
bf.at<Reg::field1>() = 0b11111111111111111111111111111;
bf.at<Reg::field1>() &= ~0b00010000000000000000000000000;
REQUIRE(bf.at<Reg::field1>() == 0b11101111111111111111111111111);
}
TEST_CASE("Operations on bitfields for 8-byte long bitfield", "[operations]")
{
Bitfields<uint64_t, Field<Reg::field1, 31>, Field<Reg::field2, 5>, Field<Reg::field3, 28>> bf;
bf.at<Reg::field1>() = 0b1111111111111111111111111111111;
bf.at<Reg::field1>() &= ~0b0100000000000000000000000000000;
REQUIRE(bf.at<Reg::field1>() == 0b1011111111111111111111111111111);
}