@@ -45,12 +45,14 @@ impl TryFrom<ArrayData> for ffi::ArrowArray {
4545
4646#[ cfg( test) ]  
4747mod  tests { 
48-     use  crate :: array:: { DictionaryArray ,  Int32Array ,  StringArray } ; 
48+     use  crate :: array:: { DictionaryArray ,  FixedSizeListArray ,  Int32Array ,  StringArray } ; 
49+     use  crate :: buffer:: Buffer ; 
4950    use  crate :: error:: Result ; 
51+     use  crate :: util:: bit_util; 
5052    use  crate :: { 
5153        array:: { 
52-             Array ,  ArrayData ,  BooleanArray ,  Int64Array ,   StructArray ,   UInt32Array , 
53-             UInt64Array , 
54+             Array ,  ArrayData ,  BooleanArray ,  FixedSizeBinaryArray ,   Int64Array , 
55+             StructArray ,   UInt32Array ,   UInt64Array , 
5456        } , 
5557        datatypes:: { DataType ,  Field } , 
5658        ffi:: ArrowArray , 
@@ -149,4 +151,112 @@ mod tests {
149151        let  data = array. data ( ) ; 
150152        test_round_trip ( data) 
151153    } 
154+ 
155+     #[ test]  
156+     fn  test_fixed_size_binary ( )  -> Result < ( ) >  { 
157+         let  values = vec ! [ vec![ 10 ,  10 ,  10 ] ,  vec![ 20 ,  20 ,  20 ] ,  vec![ 30 ,  30 ,  30 ] ] ; 
158+         let  array = FixedSizeBinaryArray :: try_from_iter ( values. into_iter ( ) ) ?; 
159+ 
160+         let  data = array. data ( ) ; 
161+         test_round_trip ( data) 
162+     } 
163+ 
164+     #[ test]  
165+     fn  test_fixed_size_binary_with_nulls ( )  -> Result < ( ) >  { 
166+         let  values = vec ! [ 
167+             None , 
168+             Some ( vec![ 10 ,  10 ,  10 ] ) , 
169+             None , 
170+             Some ( vec![ 20 ,  20 ,  20 ] ) , 
171+             Some ( vec![ 30 ,  30 ,  30 ] ) , 
172+             None , 
173+         ] ; 
174+         let  array = FixedSizeBinaryArray :: try_from_sparse_iter ( values. into_iter ( ) ) ?; 
175+ 
176+         let  data = array. data ( ) ; 
177+         test_round_trip ( data) 
178+     } 
179+ 
180+     #[ test]  
181+     fn  test_fixed_size_list ( )  -> Result < ( ) >  { 
182+         let  v:  Vec < i64 >  = ( 0 ..9 ) . into_iter ( ) . collect ( ) ; 
183+         let  value_data = ArrayData :: builder ( DataType :: Int64 ) 
184+             . len ( 9 ) 
185+             . add_buffer ( Buffer :: from_slice_ref ( & v) ) 
186+             . build ( ) ?; 
187+         let  list_data_type =
188+             DataType :: FixedSizeList ( Box :: new ( Field :: new ( "f" ,  DataType :: Int64 ,  false ) ) ,  3 ) ; 
189+         let  list_data = ArrayData :: builder ( list_data_type) 
190+             . len ( 3 ) 
191+             . add_child_data ( value_data) 
192+             . build ( ) ?; 
193+         let  array = FixedSizeListArray :: from ( list_data) ; 
194+ 
195+         let  data = array. data ( ) ; 
196+         test_round_trip ( data) 
197+     } 
198+ 
199+     #[ test]  
200+     fn  test_fixed_size_list_with_nulls ( )  -> Result < ( ) >  { 
201+         // 0100 0110 
202+         let  mut  validity_bits:  [ u8 ;  1 ]  = [ 0 ;  1 ] ; 
203+         bit_util:: set_bit ( & mut  validity_bits,  1 ) ; 
204+         bit_util:: set_bit ( & mut  validity_bits,  2 ) ; 
205+         bit_util:: set_bit ( & mut  validity_bits,  6 ) ; 
206+ 
207+         let  v:  Vec < i16 >  = ( 0 ..16 ) . into_iter ( ) . collect ( ) ; 
208+         let  value_data = ArrayData :: builder ( DataType :: Int16 ) 
209+             . len ( 16 ) 
210+             . add_buffer ( Buffer :: from_slice_ref ( & v) ) 
211+             . build ( ) ?; 
212+         let  list_data_type =
213+             DataType :: FixedSizeList ( Box :: new ( Field :: new ( "f" ,  DataType :: Int16 ,  false ) ) ,  2 ) ; 
214+         let  list_data = ArrayData :: builder ( list_data_type) 
215+             . len ( 8 ) 
216+             . null_bit_buffer ( Buffer :: from ( validity_bits) ) 
217+             . add_child_data ( value_data) 
218+             . build ( ) ?; 
219+         let  array = FixedSizeListArray :: from ( list_data) ; 
220+ 
221+         let  data = array. data ( ) ; 
222+         test_round_trip ( data) 
223+     } 
224+ 
225+     #[ test]  
226+     fn  test_fixed_size_list_nested ( )  -> Result < ( ) >  { 
227+         let  v:  Vec < i32 >  = ( 0 ..16 ) . into_iter ( ) . collect ( ) ; 
228+         let  value_data = ArrayData :: builder ( DataType :: Int32 ) 
229+             . len ( 16 ) 
230+             . add_buffer ( Buffer :: from_slice_ref ( & v) ) 
231+             . build ( ) ?; 
232+ 
233+         let  offsets:  Vec < i32 >  = vec ! [ 0 ,  2 ,  4 ,  6 ,  8 ,  10 ,  12 ,  14 ,  16 ] ; 
234+         let  value_offsets = Buffer :: from_slice_ref ( & offsets) ; 
235+         let  inner_list_data_type =
236+             DataType :: List ( Box :: new ( Field :: new ( "item" ,  DataType :: Int32 ,  false ) ) ) ; 
237+         let  inner_list_data = ArrayData :: builder ( inner_list_data_type. clone ( ) ) 
238+             . len ( 8 ) 
239+             . add_buffer ( value_offsets) 
240+             . add_child_data ( value_data) 
241+             . build ( ) ?; 
242+ 
243+         // 0000 0100 
244+         let  mut  validity_bits:  [ u8 ;  1 ]  = [ 0 ;  1 ] ; 
245+         bit_util:: set_bit ( & mut  validity_bits,  2 ) ; 
246+ 
247+         let  list_data_type = DataType :: FixedSizeList ( 
248+             Box :: new ( Field :: new ( "f" ,  inner_list_data_type,  false ) ) , 
249+             2 , 
250+         ) ; 
251+         let  list_data = ArrayData :: builder ( list_data_type) 
252+             . len ( 4 ) 
253+             . null_bit_buffer ( Buffer :: from ( validity_bits) ) 
254+             . add_child_data ( inner_list_data) 
255+             . build ( ) ?; 
256+ 
257+         let  array = FixedSizeListArray :: from ( list_data) ; 
258+ 
259+         let  data = array. data ( ) ; 
260+         test_round_trip ( data) 
261+     } 
152262} 
0 commit comments