Skip to content

Commit 728c262

Browse files
committed
Add tests validating the width of all possible types
1 parent 2f21458 commit 728c262

File tree

2 files changed

+46
-30
lines changed

2 files changed

+46
-30
lines changed

macros/src/generator.rs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,8 @@ pub fn expand_bitmap(input: BitmapInput) -> syn::Result<TokenStream2> {
2626
bit_index += ident.size;
2727
let setter_name = Ident::new(&format!("set_{}", ident.name), ident.name.span());
2828
let name = ident.name.to_owned();
29-
let mask = match ident.size {
30-
1 => quote! { 0b1 as #storage_ty },
31-
2 => quote! { 0b11 as #storage_ty },
32-
3 => quote! { 0b111 as #storage_ty },
33-
4 => quote! { 0b1111 as #storage_ty },
34-
5 => quote! { 0b11111 as #storage_ty },
35-
6 => quote! { 0b111111 as #storage_ty },
36-
7 => quote! { 0b1111111 as #storage_ty },
37-
_ => unreachable!(),
38-
};
29+
let size = ident.size;
30+
let mask = quote! { ((0b1 << #size) - 1) as #storage_ty };
3931
quote! {
4032
pub fn #name(&self) -> #storage_ty {
4133
(self.0 >> #index) & #mask

src/lib.rs

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,45 +5,69 @@ use macros::bitmap;
55
fn one_bit() {
66
bitmap!(
77
struct Bits {
8-
field0: u1,
8+
a: u1,
99
}
1010
);
1111
let mut bits = Bits(0b0);
12-
bits.set_field0(0b1);
13-
assert!(bits.field0() == 0b1);
12+
bits.set_a(0b1);
13+
assert_eq!(bits.a(), 0b1);
1414
}
1515

1616
#[test]
1717
fn two_bits() {
1818
bitmap!(
1919
struct Bits {
20-
field0: u1,
21-
field1: u1,
20+
a: u1,
21+
b: u1,
2222
}
2323
);
2424
let mut bits = Bits(0b10);
25-
bits.set_field0(0b1);
26-
bits.set_field1(0b0);
27-
assert!(bits.0 == 0b01);
25+
bits.set_a(0b1);
26+
bits.set_b(0b0);
27+
assert_eq!(bits.0, 0b01);
2828
}
2929

3030
#[test]
3131
fn sixty_four_bits() {
3232
bitmap!(
3333
struct Bits {
34-
field0: u1,
35-
field1: u7,
36-
field2: u7,
37-
field3: u7,
38-
field4: u7,
39-
field5: u7,
40-
field6: u7,
41-
field7: u7,
42-
field8: u7,
43-
field9: u7,
34+
a: u1,
35+
b: u7,
36+
c: u7,
37+
d: u7,
38+
e: u7,
39+
f: u7,
40+
g: u7,
41+
h: u7,
42+
i: u7,
43+
j: u7,
4444
}
4545
);
4646
let mut bits = Bits(0xFF00FF00FF00FF00);
47-
bits.set_field9(0b0000000);
48-
assert!(bits.0 == 0x0100FF00FF00FF00);
47+
bits.set_j(0b0000000);
48+
assert_eq!(bits.0, 0x0100FF00FF00FF00);
4949
}
50+
51+
macro_rules! test_width {
52+
($name:ident, $val:literal) => {
53+
#[test]
54+
fn $name() {
55+
bitmap!(
56+
struct Bits {
57+
field: $name,
58+
}
59+
);
60+
let mut bits = Bits(0);
61+
bits.set_field($val);
62+
assert_eq!(bits.field(), $val);
63+
}
64+
};
65+
}
66+
67+
test_width!(u1, 1);
68+
test_width!(u2, 3);
69+
test_width!(u3, 7);
70+
test_width!(u4, 15);
71+
test_width!(u5, 31);
72+
test_width!(u6, 63);
73+
test_width!(u7, 127);

0 commit comments

Comments
 (0)