@@ -42,3 +42,116 @@ where
4242 }
4343 }
4444}
45+
46+ #[ cfg( test) ]
47+ mod tests {
48+ use vortex_buffer:: BitBuffer ;
49+ use vortex_mask:: Mask ;
50+ use vortex_vector:: bool:: BoolVectorMut ;
51+ use vortex_vector:: { VectorMutOps , VectorOps } ;
52+
53+ use super :: * ;
54+ use crate :: filter:: MaskIndices ;
55+
56+ #[ test]
57+ fn test_filter_bool_vector_with_mask ( ) {
58+ let vec = BoolVectorMut :: from_iter ( [ true , false , true , false , true ] ) . freeze ( ) ;
59+ let mask = Mask :: from_iter ( [ true , false , true , false , true ] ) ;
60+
61+ let filtered = vec. filter ( & mask) ;
62+
63+ assert_eq ! ( filtered. len( ) , 3 ) ;
64+ assert_eq ! ( filtered. validity( ) . true_count( ) , 3 ) ;
65+ assert_eq ! ( filtered. bits( ) , & BitBuffer :: from_iter( [ true , true , true ] ) ) ;
66+ }
67+
68+ #[ test]
69+ fn test_filter_bool_vector_with_mask_indices ( ) {
70+ let vec = BoolVectorMut :: from_iter ( [ true , false , true , false , true ] ) . freeze ( ) ;
71+ let indices = unsafe { MaskIndices :: new_unchecked ( & [ 0 , 2 , 4 ] ) } ;
72+
73+ let filtered = vec. filter ( & indices) ;
74+
75+ assert_eq ! ( filtered. len( ) , 3 ) ;
76+ assert_eq ! ( filtered. validity( ) . true_count( ) , 3 ) ;
77+ assert_eq ! ( filtered. bits( ) , & BitBuffer :: from_iter( [ true , true , true ] ) ) ;
78+ }
79+
80+ #[ test]
81+ fn test_filter_bool_vector_with_nulls ( ) {
82+ let vec =
83+ BoolVectorMut :: from_iter ( [ Some ( true ) , None , Some ( false ) , Some ( true ) , None ] ) . freeze ( ) ;
84+ let mask = Mask :: from_iter ( [ true , true , false , true , false ] ) ;
85+
86+ let filtered = vec. filter ( & mask) ;
87+
88+ assert_eq ! ( filtered. len( ) , 3 ) ;
89+ assert_eq ! ( filtered. validity( ) . true_count( ) , 2 ) ;
90+
91+ assert_eq ! (
92+ filtered. validity( ) . to_bit_buffer( ) ,
93+ BitBuffer :: from_iter( [ true , false , true ] )
94+ ) ;
95+ assert_eq ! ( filtered. bits( ) , & BitBuffer :: from_iter( [ true , false , true ] ) ) ;
96+ }
97+
98+ #[ test]
99+ fn test_filter_bool_vector_all_true ( ) {
100+ let vec = BoolVectorMut :: from_iter ( [ true , false , true ] ) . freeze ( ) ;
101+ let mask = Mask :: new_true ( 3 ) ;
102+
103+ let filtered = vec. filter ( & mask) ;
104+
105+ assert_eq ! ( filtered. len( ) , 3 ) ;
106+ assert_eq ! ( filtered. bits( ) , & BitBuffer :: from_iter( [ true , false , true ] ) ) ;
107+ }
108+
109+ #[ test]
110+ fn test_filter_bool_vector_all_false ( ) {
111+ let vec = BoolVectorMut :: from_iter ( [ true , false , true ] ) . freeze ( ) ;
112+ let mask = Mask :: new_false ( 3 ) ;
113+
114+ let filtered = vec. filter ( & mask) ;
115+
116+ assert_eq ! ( filtered. len( ) , 0 ) ;
117+ }
118+
119+ #[ test]
120+ fn test_filter_bool_vector_mut_with_mask ( ) {
121+ let mut vec = BoolVectorMut :: from_iter ( [ true , false , true , false , true ] ) ;
122+ let mask = Mask :: from_iter ( [ true , false , true , false , true ] ) ;
123+
124+ vec. filter ( & mask) ;
125+
126+ assert_eq ! ( vec. len( ) , 3 ) ;
127+ let frozen = vec. freeze ( ) ;
128+ assert_eq ! ( frozen. len( ) , 3 ) ;
129+ assert_eq ! ( frozen. validity( ) . true_count( ) , 3 ) ;
130+ }
131+
132+ #[ test]
133+ fn test_filter_bool_vector_mut_with_mask_indices ( ) {
134+ let mut vec = BoolVectorMut :: from_iter ( [ true , false , true , false , true ] ) ;
135+ let indices = unsafe { MaskIndices :: new_unchecked ( & [ 0 , 2 , 4 ] ) } ;
136+
137+ vec. filter ( & indices) ;
138+
139+ assert_eq ! ( vec. len( ) , 3 ) ;
140+ let frozen = vec. freeze ( ) ;
141+ assert_eq ! ( frozen. len( ) , 3 ) ;
142+ assert_eq ! ( frozen. validity( ) . true_count( ) , 3 ) ;
143+ }
144+
145+ #[ test]
146+ fn test_filter_bool_vector_mut_with_nulls ( ) {
147+ let mut vec = BoolVectorMut :: from_iter ( [ Some ( true ) , None , Some ( false ) , Some ( true ) , None ] ) ;
148+ let mask = Mask :: from_iter ( [ true , true , false , true , false ] ) ;
149+
150+ vec. filter ( & mask) ;
151+
152+ assert_eq ! ( vec. len( ) , 3 ) ;
153+ let frozen = vec. freeze ( ) ;
154+ assert_eq ! ( frozen. len( ) , 3 ) ;
155+ assert_eq ! ( frozen. validity( ) . true_count( ) , 2 ) ;
156+ }
157+ }
0 commit comments