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