3 #include <bitfield/bitfield.h>
5 START_TEST (test_large_bitmask)
7 uint64_t result = bitmask(32);
8 fail_if(result != 0xffffffff);
12 START_TEST (test_one_bit_not_swapped)
15 uint64_t result = eightbyte_get_bit_field(data, 0, 1, false);
20 START_TEST (test_one_bit)
22 uint64_t data = 0x8000000000000000;
23 uint64_t result = eightbyte_get_bit_field(data, 0, 1, false);
24 fail_unless(result == 0x1,
25 "First bit in 0x%llx was 0x%llx instead of 0x1", data, result);
29 START_TEST (test_32_bit_parse)
31 uint64_t data = 0x0402574d555a0401;
32 uint64_t result = eightbyte_get_bit_field(data, 16, 32, false);
33 uint64_t expectedValue = 0x574d555a;
34 fail_unless(result == expectedValue,
35 "Field retrieved in 0x%llx was 0x%llx instead of 0x%llx", data,
36 result, expectedValue);
40 START_TEST (test_16_bit_parse)
42 uint64_t data = 0xF34DFCFF00000000;
43 uint64_t result = eightbyte_get_bit_field(data, 16, 16, false);
44 uint64_t expectedValue = 0xFCFF;
45 fail_unless(result == expectedValue,
46 "Field retrieved in 0x%llx was 0x%llx instead of 0x%llx", data,
47 result, expectedValue);
51 START_TEST (test_one_byte)
53 uint64_t data = 0xFA00000000000000;
54 uint64_t result = eightbyte_get_bit_field(data, 0, 4, false);
55 fail_unless(result == 0xF,
56 "First nibble in 0x%llx was 0x%llx instead of 0xF", data, result);
57 result = eightbyte_get_bit_field(data, 4, 4, false);
58 fail_unless(result == 0xA,
59 "Second nibble in 0x%llx was 0x%llx instead of 0xA", data, result);
60 result = eightbyte_get_bit_field(data, 0, 8, false);
61 fail_unless(result == 0xFA,
62 "All bits in 0x%llx were 0x%llx instead of 0x%llx", data, result, data);
66 START_TEST (test_multi_byte)
68 uint64_t data = 0x12FA000000000000;
69 uint64_t result = eightbyte_get_bit_field(data, 0, 4, false);
70 fail_unless(result == 0x1,
71 "First 4 bits in 0x%llx was 0x%llx instead of 0xF", (data >> 60) & 0xF,
73 result = eightbyte_get_bit_field(data, 4, 4, false);
74 fail_unless(result == 0x2,
75 "Second 4 bits in 0x%llx was 0x%llx instead of 0xA", (data >> 56) & 0xF,
77 result = eightbyte_get_bit_field(data, 8, 4, false);
78 fail_unless(result == 0xF,
79 "First 4 bits in 0x%llx was 0x%llx instead of 0x1", (data >> 52) & 0xF,
81 result = eightbyte_get_bit_field(data, 12, 4, false);
82 fail_unless(result == 0xA,
83 "Second 4 bits in 0x%llx was 0x%llx instead of 0x2", (data >> 48) % 0xF,
88 START_TEST (test_get_multi_byte)
90 uint64_t data = 0x12FA000000000000;
91 uint64_t result = eightbyte_get_bit_field(data, 0, 9, false);
92 ck_assert_int_eq(result, 0x25);
96 START_TEST (test_get_off_byte_boundary)
98 uint64_t data = 0x000012FA00000000;
99 uint64_t result = eightbyte_get_bit_field(data, 12, 8, false);
100 ck_assert_int_eq(result, 0x01);
103 START_TEST (test_set_wont_fit)
106 fail_if(set_bit_field(&data, 100, 0, 1));
110 START_TEST (test_set_field)
113 fail_unless(set_bit_field(&data, 1, 0, 1));
114 uint64_t result = eightbyte_get_bit_field(data, 0, 1, false);
115 ck_assert_int_eq(result, 0x1);
117 fail_unless(set_bit_field(&data, 1, 1, 1));
118 result = eightbyte_get_bit_field(data, 1, 1, false);
119 ck_assert_int_eq(result, 0x1);
122 fail_unless(set_bit_field(&data, 0xf, 3, 4));
123 result = eightbyte_get_bit_field(data, 3, 4, false);
124 ck_assert_int_eq(result, 0xf);
128 START_TEST (test_set_doesnt_clobber_existing_data)
130 uint64_t data = 0xFFFC4DF300000000;
131 fail_unless(set_bit_field(&data, 0x4fc8, 16, 16));
132 uint64_t result = eightbyte_get_bit_field(data, 16, 16, false);
133 fail_unless(result == 0x4fc8,
134 "Field retrieved in 0x%llx was 0x%llx instead of 0x%x", data, result,
137 data = 0x8000000000000000;
138 fail_unless(set_bit_field(&data, 1, 21, 1));
139 fail_unless(data == 0x8000040000000000LLU,
140 "Expected combined value 0x8000040000000000 but got 0x%llx%llx",
145 START_TEST (test_set_off_byte_boundary)
147 uint64_t data = 0xFFFC4DF300000000;
148 fail_unless(set_bit_field(&data, 0x12, 12, 8));
149 uint64_t result = eightbyte_get_bit_field(data, 12, 12, false);
150 ck_assert_int_eq(result,0x12d);
154 START_TEST (test_set_odd_number_of_bits)
156 uint64_t data = 0xFFFC4DF300000000LLU;
157 fail_unless(set_bit_field(&data, 0x12, 11, 5));
158 uint64_t result = eightbyte_get_bit_field(data, 11, 5, false);
159 fail_unless(result == 0x12,
160 "Field set in 0x%llx%llx%llx%llx was 0x%llx instead of 0x%llx", data, result,
163 data = 0xFFFC4DF300000000LLU;
164 fail_unless(set_bit_field(&data, 0x2, 11, 5));
165 result = eightbyte_get_bit_field(data, 11, 5, false);
166 fail_unless(result == 0x2,
167 "Field set in 0x%llx%llx%llx%llx was 0x%llx instead of 0x%llx", data, result,
172 START_TEST(test_eightbyte_get_byte)
174 uint64_t data = 0x00000000F34DFCFF;
175 uint8_t result = eightbyte_get_byte(data, 0, false);
176 uint8_t expected = 0x0;
177 ck_assert_int_eq(result, expected);
179 result = eightbyte_get_byte(data, 4, false);
181 ck_assert_int_eq(result, expected);
183 result = eightbyte_get_byte(data, 5, false);
185 ck_assert_int_eq(result, expected);
187 result = eightbyte_get_byte(data, 6, false);
189 ck_assert_int_eq(result, expected);
191 result = eightbyte_get_byte(data, 7, false);
193 ck_assert_int_eq(result, expected);
197 START_TEST(test_eightbyte_get_nibble)
199 uint64_t data = 0x00000000F34DFCFF;
200 uint8_t result = eightbyte_get_nibble(data, 0, false);
201 uint8_t expected = 0x0;
202 ck_assert_int_eq(result, expected);
204 result = eightbyte_get_nibble(data, 2, false);
206 ck_assert_int_eq(result, expected);
208 result = eightbyte_get_nibble(data, 8, false);
210 ck_assert_int_eq(result, expected);
212 result = eightbyte_get_nibble(data, 9, false);
214 ck_assert_int_eq(result, expected);
216 result = eightbyte_get_nibble(data, 10, false);
218 ck_assert_int_eq(result, expected);
220 result = eightbyte_get_nibble(data, 13, false);
222 ck_assert_int_eq(result, expected);
226 Suite* bitfieldSuite(void) {
227 Suite* s = suite_create("bitfield");
228 TCase *tc_core = tcase_create("core");
229 tcase_add_test(tc_core, test_large_bitmask);
230 tcase_add_test(tc_core, test_one_bit);
231 tcase_add_test(tc_core, test_one_bit_not_swapped);
232 tcase_add_test(tc_core, test_one_byte);
233 tcase_add_test(tc_core, test_16_bit_parse);
234 tcase_add_test(tc_core, test_32_bit_parse);
235 tcase_add_test(tc_core, test_multi_byte);
236 tcase_add_test(tc_core, test_get_multi_byte);
237 tcase_add_test(tc_core, test_get_off_byte_boundary);
238 tcase_add_test(tc_core, test_set_wont_fit);
239 tcase_add_test(tc_core, test_set_field);
240 tcase_add_test(tc_core, test_set_doesnt_clobber_existing_data);
241 tcase_add_test(tc_core, test_set_off_byte_boundary);
242 tcase_add_test(tc_core, test_set_odd_number_of_bits);
243 tcase_add_test(tc_core, test_eightbyte_get_nibble);
244 tcase_add_test(tc_core, test_eightbyte_get_byte);
245 suite_add_tcase(s, tc_core);
252 Suite* s = bitfieldSuite();
253 SRunner *sr = srunner_create(s);
254 // Don't fork so we can actually use gdb
255 srunner_set_fork_status(sr, CK_NOFORK);
256 srunner_run_all(sr, CK_NORMAL);
257 numberFailed = srunner_ntests_failed(sr);
259 return (numberFailed == 0) ? 0 : 1;