xref: /aosp_15_r20/external/libese/libese/tests/bitspec_unittests.cpp (revision 5c4dab75aa57366379dce576b1a9e082a44e2b3a)
1*5c4dab75SAndroid Build Coastguard Worker /*
2*5c4dab75SAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*5c4dab75SAndroid Build Coastguard Worker  *
4*5c4dab75SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*5c4dab75SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*5c4dab75SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*5c4dab75SAndroid Build Coastguard Worker  *
8*5c4dab75SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*5c4dab75SAndroid Build Coastguard Worker  *
10*5c4dab75SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*5c4dab75SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*5c4dab75SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*5c4dab75SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*5c4dab75SAndroid Build Coastguard Worker  * limitations under the License.
15*5c4dab75SAndroid Build Coastguard Worker  */
16*5c4dab75SAndroid Build Coastguard Worker 
17*5c4dab75SAndroid Build Coastguard Worker #include <stdint.h>
18*5c4dab75SAndroid Build Coastguard Worker 
19*5c4dab75SAndroid Build Coastguard Worker #include <ese/bit_spec.h>
20*5c4dab75SAndroid Build Coastguard Worker #include <gtest/gtest.h>
21*5c4dab75SAndroid Build Coastguard Worker 
22*5c4dab75SAndroid Build Coastguard Worker using ::testing::Test;
23*5c4dab75SAndroid Build Coastguard Worker 
24*5c4dab75SAndroid Build Coastguard Worker struct TestSpec {
25*5c4dab75SAndroid Build Coastguard Worker   struct {
26*5c4dab75SAndroid Build Coastguard Worker     struct bit_spec bit[8];
27*5c4dab75SAndroid Build Coastguard Worker   } single;
28*5c4dab75SAndroid Build Coastguard Worker   struct {
29*5c4dab75SAndroid Build Coastguard Worker     struct bit_spec high;
30*5c4dab75SAndroid Build Coastguard Worker     struct bit_spec mid;
31*5c4dab75SAndroid Build Coastguard Worker     struct bit_spec low;
32*5c4dab75SAndroid Build Coastguard Worker   } adjacent;
33*5c4dab75SAndroid Build Coastguard Worker   struct {
34*5c4dab75SAndroid Build Coastguard Worker     struct bit_spec all8;
35*5c4dab75SAndroid Build Coastguard Worker     struct bit_spec upper6;
36*5c4dab75SAndroid Build Coastguard Worker     struct bit_spec lower6;
37*5c4dab75SAndroid Build Coastguard Worker   } overlap;
38*5c4dab75SAndroid Build Coastguard Worker };
39*5c4dab75SAndroid Build Coastguard Worker 
40*5c4dab75SAndroid Build Coastguard Worker const struct TestSpec kTestSpec = {
41*5c4dab75SAndroid Build Coastguard Worker   .single = {
42*5c4dab75SAndroid Build Coastguard Worker     .bit = {
43*5c4dab75SAndroid Build Coastguard Worker       { .value = 1, .shift = 0 },
44*5c4dab75SAndroid Build Coastguard Worker       { .value = 1, .shift = 1 },
45*5c4dab75SAndroid Build Coastguard Worker       { .value = 1, .shift = 2 },
46*5c4dab75SAndroid Build Coastguard Worker       { .value = 1, .shift = 3 },
47*5c4dab75SAndroid Build Coastguard Worker       { .value = 1, .shift = 4 },
48*5c4dab75SAndroid Build Coastguard Worker       { .value = 1, .shift = 5 },
49*5c4dab75SAndroid Build Coastguard Worker       { .value = 1, .shift = 6 },
50*5c4dab75SAndroid Build Coastguard Worker       { .value = 1, .shift = 7 },
51*5c4dab75SAndroid Build Coastguard Worker     },
52*5c4dab75SAndroid Build Coastguard Worker   },
53*5c4dab75SAndroid Build Coastguard Worker   .adjacent = {
54*5c4dab75SAndroid Build Coastguard Worker     .high = { .value = 0x3, .shift = 6 },
55*5c4dab75SAndroid Build Coastguard Worker     .mid = { .value = 0xf, .shift = 2 },
56*5c4dab75SAndroid Build Coastguard Worker     .low = { .value = 0x3, .shift = 0 },
57*5c4dab75SAndroid Build Coastguard Worker   },
58*5c4dab75SAndroid Build Coastguard Worker   .overlap = {
59*5c4dab75SAndroid Build Coastguard Worker     .all8 = { .value = 0xff, .shift = 0 },
60*5c4dab75SAndroid Build Coastguard Worker     .upper6 = { .value = 0x3f, .shift = 2 },
61*5c4dab75SAndroid Build Coastguard Worker     .lower6 = { .value = 0x3f, .shift = 0 },
62*5c4dab75SAndroid Build Coastguard Worker   },
63*5c4dab75SAndroid Build Coastguard Worker };
64*5c4dab75SAndroid Build Coastguard Worker 
65*5c4dab75SAndroid Build Coastguard Worker class BitSpecTest : public virtual Test {
66*5c4dab75SAndroid Build Coastguard Worker  public:
BitSpecTest()67*5c4dab75SAndroid Build Coastguard Worker   BitSpecTest() {
68*5c4dab75SAndroid Build Coastguard Worker   }
~BitSpecTest()69*5c4dab75SAndroid Build Coastguard Worker   virtual ~BitSpecTest() { }
SetUp()70*5c4dab75SAndroid Build Coastguard Worker   virtual void SetUp() { }
TearDown()71*5c4dab75SAndroid Build Coastguard Worker   virtual void TearDown() { }
72*5c4dab75SAndroid Build Coastguard Worker };
73*5c4dab75SAndroid Build Coastguard Worker 
TEST_F(BitSpecTest,single_bits_assign_accrue)74*5c4dab75SAndroid Build Coastguard Worker TEST_F(BitSpecTest, single_bits_assign_accrue) {
75*5c4dab75SAndroid Build Coastguard Worker   uint8_t byte = 0;
76*5c4dab75SAndroid Build Coastguard Worker   uint8_t expected_byte = 0;
77*5c4dab75SAndroid Build Coastguard Worker   // Accrue bits.
78*5c4dab75SAndroid Build Coastguard Worker   for (int bit = 0; bit < 8; ++bit) {
79*5c4dab75SAndroid Build Coastguard Worker     expected_byte |= (1 << bit);
80*5c4dab75SAndroid Build Coastguard Worker     bs_assign(&byte, kTestSpec.single.bit[bit], 1);
81*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(expected_byte, byte);
82*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(1, bs_get(kTestSpec.single.bit[bit], expected_byte));
83*5c4dab75SAndroid Build Coastguard Worker   }
84*5c4dab75SAndroid Build Coastguard Worker }
85*5c4dab75SAndroid Build Coastguard Worker 
TEST_F(BitSpecTest,single_bits_assign1_individual)86*5c4dab75SAndroid Build Coastguard Worker TEST_F(BitSpecTest, single_bits_assign1_individual) {
87*5c4dab75SAndroid Build Coastguard Worker   // One bit at a time.
88*5c4dab75SAndroid Build Coastguard Worker   for (int bit = 0; bit < 8; ++bit) {
89*5c4dab75SAndroid Build Coastguard Worker     uint8_t expected_byte = (1 << bit);
90*5c4dab75SAndroid Build Coastguard Worker     uint8_t byte = bs_set(0, kTestSpec.single.bit[bit], 1);
91*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(expected_byte, byte);
92*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(1, bs_get(kTestSpec.single.bit[bit], expected_byte));
93*5c4dab75SAndroid Build Coastguard Worker   }
94*5c4dab75SAndroid Build Coastguard Worker }
95*5c4dab75SAndroid Build Coastguard Worker 
TEST_F(BitSpecTest,single_bits_assign0_individual)96*5c4dab75SAndroid Build Coastguard Worker TEST_F(BitSpecTest, single_bits_assign0_individual) {
97*5c4dab75SAndroid Build Coastguard Worker   // One bit at a time.
98*5c4dab75SAndroid Build Coastguard Worker   for (int bit = 0; bit < 8; ++bit) {
99*5c4dab75SAndroid Build Coastguard Worker     uint8_t expected_byte = 0xff ^ (1 << bit);
100*5c4dab75SAndroid Build Coastguard Worker     uint8_t byte = bs_set(0xff, kTestSpec.single.bit[bit], 0);
101*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(expected_byte, byte);
102*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(0, bs_get(kTestSpec.single.bit[bit], expected_byte));
103*5c4dab75SAndroid Build Coastguard Worker   }
104*5c4dab75SAndroid Build Coastguard Worker }
105*5c4dab75SAndroid Build Coastguard Worker 
TEST_F(BitSpecTest,single_bits_clear_individual)106*5c4dab75SAndroid Build Coastguard Worker TEST_F(BitSpecTest, single_bits_clear_individual) {
107*5c4dab75SAndroid Build Coastguard Worker   // One bit at a time.
108*5c4dab75SAndroid Build Coastguard Worker   for (int bit = 0; bit < 8; ++bit) {
109*5c4dab75SAndroid Build Coastguard Worker     uint8_t byte = 0xff;
110*5c4dab75SAndroid Build Coastguard Worker     uint8_t expected_byte = 0xff ^ (1 << bit);
111*5c4dab75SAndroid Build Coastguard Worker     byte &= bs_clear(kTestSpec.single.bit[bit]);
112*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(expected_byte, byte);
113*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(0, bs_get(kTestSpec.single.bit[bit], expected_byte));
114*5c4dab75SAndroid Build Coastguard Worker   }
115*5c4dab75SAndroid Build Coastguard Worker }
116*5c4dab75SAndroid Build Coastguard Worker 
TEST_F(BitSpecTest,adjacent_bit_assign)117*5c4dab75SAndroid Build Coastguard Worker TEST_F(BitSpecTest, adjacent_bit_assign) {
118*5c4dab75SAndroid Build Coastguard Worker   uint8_t byte = 0;
119*5c4dab75SAndroid Build Coastguard Worker   EXPECT_EQ(0, bs_get(kTestSpec.adjacent.high, byte));
120*5c4dab75SAndroid Build Coastguard Worker   EXPECT_EQ(0, bs_get(kTestSpec.adjacent.mid, byte));
121*5c4dab75SAndroid Build Coastguard Worker   EXPECT_EQ(0, bs_get(kTestSpec.adjacent.low, byte));
122*5c4dab75SAndroid Build Coastguard Worker   byte = 0xff;
123*5c4dab75SAndroid Build Coastguard Worker   EXPECT_EQ(0x3, bs_get(kTestSpec.adjacent.high, byte));
124*5c4dab75SAndroid Build Coastguard Worker   EXPECT_EQ(0xf, bs_get(kTestSpec.adjacent.mid, byte));
125*5c4dab75SAndroid Build Coastguard Worker   EXPECT_EQ(0x3, bs_get(kTestSpec.adjacent.low, byte));
126*5c4dab75SAndroid Build Coastguard Worker   for (int i = 0; i < 0xf; ++i) {
127*5c4dab75SAndroid Build Coastguard Worker     bs_assign(&byte, kTestSpec.adjacent.mid, i);
128*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(0x3, bs_get(kTestSpec.adjacent.high, byte));
129*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(i, bs_get(kTestSpec.adjacent.mid, byte));
130*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(0x3, bs_get(kTestSpec.adjacent.low, byte));
131*5c4dab75SAndroid Build Coastguard Worker   }
132*5c4dab75SAndroid Build Coastguard Worker   byte = 0xff;
133*5c4dab75SAndroid Build Coastguard Worker   for (int i = 0; i < 0x3; ++i) {
134*5c4dab75SAndroid Build Coastguard Worker     bs_assign(&byte, kTestSpec.adjacent.low, i);
135*5c4dab75SAndroid Build Coastguard Worker     bs_assign(&byte, kTestSpec.adjacent.high, i);
136*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(i, bs_get(kTestSpec.adjacent.high, byte));
137*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(0xf, bs_get(kTestSpec.adjacent.mid, byte));
138*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(i, bs_get(kTestSpec.adjacent.low, byte));
139*5c4dab75SAndroid Build Coastguard Worker   }
140*5c4dab75SAndroid Build Coastguard Worker }
141*5c4dab75SAndroid Build Coastguard Worker 
TEST_F(BitSpecTest,overlap_bit_assign)142*5c4dab75SAndroid Build Coastguard Worker TEST_F(BitSpecTest, overlap_bit_assign) {
143*5c4dab75SAndroid Build Coastguard Worker   uint8_t byte = 0;
144*5c4dab75SAndroid Build Coastguard Worker   EXPECT_EQ(0, bs_get(kTestSpec.overlap.upper6, byte));
145*5c4dab75SAndroid Build Coastguard Worker   EXPECT_EQ(0, bs_get(kTestSpec.overlap.lower6, byte));
146*5c4dab75SAndroid Build Coastguard Worker   EXPECT_EQ(0, bs_get(kTestSpec.overlap.all8, byte));
147*5c4dab75SAndroid Build Coastguard Worker   byte = 0xff;
148*5c4dab75SAndroid Build Coastguard Worker   EXPECT_EQ(0x3f, bs_get(kTestSpec.overlap.upper6, byte));
149*5c4dab75SAndroid Build Coastguard Worker   EXPECT_EQ(0x3f, bs_get(kTestSpec.overlap.lower6, byte));
150*5c4dab75SAndroid Build Coastguard Worker   EXPECT_EQ(0xff, bs_get(kTestSpec.overlap.all8, byte));
151*5c4dab75SAndroid Build Coastguard Worker 
152*5c4dab75SAndroid Build Coastguard Worker   byte = 0;
153*5c4dab75SAndroid Build Coastguard Worker   for (int i = 0; i < 0x3f; ++i) {
154*5c4dab75SAndroid Build Coastguard Worker     bs_assign(&byte, kTestSpec.overlap.lower6, i);
155*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ((i & (0x3f << 2)) >> 2, bs_get(kTestSpec.overlap.upper6, byte));
156*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(i, bs_get(kTestSpec.overlap.lower6, byte));
157*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(i, bs_get(kTestSpec.overlap.all8, byte));
158*5c4dab75SAndroid Build Coastguard Worker   }
159*5c4dab75SAndroid Build Coastguard Worker   byte = 0;
160*5c4dab75SAndroid Build Coastguard Worker   for (int i = 0; i < 0x3f; ++i) {
161*5c4dab75SAndroid Build Coastguard Worker     bs_assign(&byte, kTestSpec.overlap.upper6, i);
162*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(i, bs_get(kTestSpec.overlap.upper6, byte));
163*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ((i << 2) & 0x3f, bs_get(kTestSpec.overlap.lower6, byte));
164*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(i << 2, bs_get(kTestSpec.overlap.all8, byte));
165*5c4dab75SAndroid Build Coastguard Worker   }
166*5c4dab75SAndroid Build Coastguard Worker   byte = 0;
167*5c4dab75SAndroid Build Coastguard Worker   for (int i = 0; i < 0xff; ++i) {
168*5c4dab75SAndroid Build Coastguard Worker     bs_assign(&byte, kTestSpec.overlap.all8, i);
169*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(i >> 2, bs_get(kTestSpec.overlap.upper6, byte));
170*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(i & 0x3f, bs_get(kTestSpec.overlap.lower6, byte));
171*5c4dab75SAndroid Build Coastguard Worker     EXPECT_EQ(i, bs_get(kTestSpec.overlap.all8, byte));
172*5c4dab75SAndroid Build Coastguard Worker   }
173*5c4dab75SAndroid Build Coastguard Worker }
174