2
2
// SPDX-License-Identifier: Apache-2.0, MIT
3
3
4
4
use std:: collections:: HashSet ;
5
- use std:: iter:: FromIterator ;
6
5
7
6
use fvm_ipld_bitfield:: { bitfield, BitField } ;
8
7
use fvm_shared:: encoding;
@@ -17,7 +16,7 @@ fn random_indices(range: u64, seed: u64) -> Vec<u64> {
17
16
#[ test]
18
17
fn bitfield_slice ( ) {
19
18
let vals = random_indices ( 10000 , 2 ) ;
20
- let bf: BitField = vals. iter ( ) . copied ( ) . collect ( ) ;
19
+ let bf = BitField :: try_from_bits ( vals. iter ( ) . copied ( ) ) . unwrap ( ) ;
21
20
22
21
let slice = bf. slice ( 600 , 500 ) . unwrap ( ) ;
23
22
let out_vals: Vec < _ > = slice. iter ( ) . collect ( ) ;
@@ -38,7 +37,7 @@ fn bitfield_slice_small() {
38
37
let vals = [ 1 , 5 , 6 , 7 , 10 , 11 , 12 , 15 ] ;
39
38
40
39
let test_permutations = |start : usize , count : usize | {
41
- let bf: BitField = vals. iter ( ) . copied ( ) . collect ( ) ;
40
+ let bf = BitField :: try_from_bits ( vals. iter ( ) . copied ( ) ) . unwrap ( ) ;
42
41
let sl = bf. slice ( start as u64 , count as u64 ) . unwrap ( ) ;
43
42
let exp = & vals[ start..start + count] ;
44
43
let out: Vec < _ > = sl. iter ( ) . collect ( ) ;
@@ -56,8 +55,8 @@ fn set_up_test_bitfields() -> (Vec<u64>, Vec<u64>, BitField, BitField) {
56
55
let a = random_indices ( 100 , 1 ) ;
57
56
let b = random_indices ( 100 , 2 ) ;
58
57
59
- let bf_a: BitField = a. iter ( ) . copied ( ) . collect ( ) ;
60
- let bf_b: BitField = b. iter ( ) . copied ( ) . collect ( ) ;
58
+ let bf_a = BitField :: try_from_bits ( a. iter ( ) . copied ( ) ) . unwrap ( ) ;
59
+ let bf_b = BitField :: try_from_bits ( b. iter ( ) . copied ( ) ) . unwrap ( ) ;
61
60
62
61
( a, b, bf_a, bf_b)
63
62
}
@@ -101,50 +100,62 @@ fn bitfield_difference() {
101
100
// Ported test from go impl (specs-actors)
102
101
#[ test]
103
102
fn subtract_more ( ) {
104
- let have = BitField :: from_iter ( vec ! [ 5 , 6 , 8 , 10 , 11 , 13 , 14 , 17 ] ) ;
105
- let s1 = & BitField :: from_iter ( vec ! [ 5 , 6 ] ) - & have;
106
- let s2 = & BitField :: from_iter ( vec ! [ 8 , 10 ] ) - & have;
107
- let s3 = & BitField :: from_iter ( vec ! [ 11 , 13 ] ) - & have;
108
- let s4 = & BitField :: from_iter ( vec ! [ 14 , 17 ] ) - & have;
103
+ let have = BitField :: try_from_bits ( vec ! [ 5 , 6 , 8 , 10 , 11 , 13 , 14 , 17 ] ) . unwrap ( ) ;
104
+ let s1 = & BitField :: try_from_bits ( vec ! [ 5 , 6 ] ) . unwrap ( ) - & have;
105
+ let s2 = & BitField :: try_from_bits ( vec ! [ 8 , 10 ] ) . unwrap ( ) - & have;
106
+ let s3 = & BitField :: try_from_bits ( vec ! [ 11 , 13 ] ) . unwrap ( ) - & have;
107
+ let s4 = & BitField :: try_from_bits ( vec ! [ 14 , 17 ] ) . unwrap ( ) - & have;
109
108
110
109
let u = BitField :: union ( & [ s1, s2, s3, s4] ) ;
111
110
assert_eq ! ( u. len( ) , 0 ) ;
112
111
}
113
112
114
113
#[ test]
115
114
fn contains_any ( ) {
116
- assert ! ( !BitField :: from_iter( vec![ 0 , 4 ] ) . contains_any( & BitField :: from_iter( vec![ 1 , 3 , 5 ] ) ) ) ;
115
+ assert ! ( !BitField :: try_from_bits( vec![ 0 , 4 ] )
116
+ . unwrap( )
117
+ . contains_any( & BitField :: try_from_bits( vec![ 1 , 3 , 5 ] ) . unwrap( ) ) ) ;
117
118
118
- assert ! ( BitField :: from_iter( vec![ 0 , 2 , 5 , 6 ] ) . contains_any( & BitField :: from_iter( vec![ 1 , 3 , 5 ] ) ) ) ;
119
+ assert ! ( BitField :: try_from_bits( vec![ 0 , 2 , 5 , 6 ] )
120
+ . unwrap( )
121
+ . contains_any( & BitField :: try_from_bits( vec![ 1 , 3 , 5 ] ) . unwrap( ) ) ) ;
119
122
120
- assert ! ( BitField :: from_iter( vec![ 1 , 2 , 3 ] ) . contains_any( & BitField :: from_iter( vec![ 1 , 2 , 3 ] ) ) ) ;
123
+ assert ! ( BitField :: try_from_bits( vec![ 1 , 2 , 3 ] )
124
+ . unwrap( )
125
+ . contains_any( & BitField :: try_from_bits( vec![ 1 , 2 , 3 ] ) . unwrap( ) ) ) ;
121
126
}
122
127
123
128
#[ test]
124
129
fn contains_all ( ) {
125
- assert ! (
126
- ! BitField :: from_iter ( vec! [ 0 , 2 , 4 ] ) . contains_all ( & BitField :: from_iter ( vec! [ 0 , 2 , 4 , 5 ] ) )
127
- ) ;
130
+ assert ! ( ! BitField :: try_from_bits ( vec! [ 0 , 2 , 4 ] )
131
+ . unwrap ( )
132
+ . contains_all ( & BitField :: try_from_bits ( vec! [ 0 , 2 , 4 , 5 ] ) . unwrap ( ) ) ) ;
128
133
129
- assert ! ( BitField :: from_iter( vec![ 0 , 2 , 4 , 5 ] ) . contains_all( & BitField :: from_iter( vec![ 0 , 2 , 4 ] ) ) ) ;
134
+ assert ! ( BitField :: try_from_bits( vec![ 0 , 2 , 4 , 5 ] )
135
+ . unwrap( )
136
+ . contains_all( & BitField :: try_from_bits( vec![ 0 , 2 , 4 ] ) . unwrap( ) ) ) ;
130
137
131
- assert ! ( BitField :: from_iter( vec![ 1 , 2 , 3 ] ) . contains_all( & BitField :: from_iter( vec![ 1 , 2 , 3 ] ) ) ) ;
138
+ assert ! ( BitField :: try_from_bits( vec![ 1 , 2 , 3 ] )
139
+ . unwrap( )
140
+ . contains_all( & BitField :: try_from_bits( vec![ 1 , 2 , 3 ] ) . unwrap( ) ) ) ;
132
141
}
133
142
134
143
#[ test]
135
144
fn bit_ops ( ) {
136
- let a = & BitField :: from_iter ( vec ! [ 1 , 2 , 3 ] ) & & BitField :: from_iter ( vec ! [ 1 , 3 , 4 ] ) ;
145
+ let a = & BitField :: try_from_bits ( vec ! [ 1 , 2 , 3 ] ) . unwrap ( )
146
+ & & BitField :: try_from_bits ( vec ! [ 1 , 3 , 4 ] ) . unwrap ( ) ;
137
147
assert_eq ! ( a. iter( ) . collect:: <Vec <_>>( ) , & [ 1 , 3 ] ) ;
138
148
139
- let mut a = BitField :: from_iter ( vec ! [ 1 , 2 , 3 ] ) ;
140
- a &= & BitField :: from_iter ( vec ! [ 1 , 3 , 4 ] ) ;
149
+ let mut a = BitField :: try_from_bits ( vec ! [ 1 , 2 , 3 ] ) . unwrap ( ) ;
150
+ a &= & BitField :: try_from_bits ( vec ! [ 1 , 3 , 4 ] ) . unwrap ( ) ;
141
151
assert_eq ! ( a. iter( ) . collect:: <Vec <_>>( ) , & [ 1 , 3 ] ) ;
142
152
143
- let a = & BitField :: from_iter ( vec ! [ 1 , 2 , 3 ] ) | & BitField :: from_iter ( vec ! [ 1 , 3 , 4 ] ) ;
153
+ let a = & BitField :: try_from_bits ( vec ! [ 1 , 2 , 3 ] ) . unwrap ( )
154
+ | & BitField :: try_from_bits ( vec ! [ 1 , 3 , 4 ] ) . unwrap ( ) ;
144
155
assert_eq ! ( a. iter( ) . collect:: <Vec <_>>( ) , & [ 1 , 2 , 3 , 4 ] ) ;
145
156
146
- let mut a = BitField :: from_iter ( vec ! [ 1 , 2 , 3 ] ) ;
147
- a |= & BitField :: from_iter ( vec ! [ 1 , 3 , 4 ] ) ;
157
+ let mut a = BitField :: try_from_bits ( vec ! [ 1 , 2 , 3 ] ) . unwrap ( ) ;
158
+ a |= & BitField :: try_from_bits ( vec ! [ 1 , 3 , 4 ] ) . unwrap ( ) ;
148
159
assert_eq ! ( a. iter( ) . collect:: <Vec <_>>( ) , & [ 1 , 2 , 3 , 4 ] ) ;
149
160
}
150
161
@@ -209,3 +220,16 @@ fn padding() {
209
220
let deserialized: BitField = encoding:: from_slice ( & cbor) . unwrap ( ) ;
210
221
assert_eq ! ( deserialized, bf) ;
211
222
}
223
+
224
+ #[ test]
225
+ fn exceeds_bitfield_range ( ) {
226
+ let mut bf = BitField :: new ( ) ;
227
+ bf. try_set ( u64:: MAX )
228
+ . expect_err ( "expected setting u64::MAX to fail" ) ;
229
+ bf. try_set ( u64:: MAX - 1 )
230
+ . expect ( "expected setting u64::MAX-1 to succeed" ) ;
231
+ BitField :: try_from_bits ( [ 0 , 1 , 4 , 99 , u64:: MAX ] )
232
+ . expect_err ( "expected setting u64::MAX to fail" ) ;
233
+ BitField :: try_from_bits ( [ 0 , 1 , 4 , 99 , u64:: MAX - 1 ] )
234
+ . expect ( "expected setting u64::MAX-1 to succeed" ) ;
235
+ }
0 commit comments