@@ -175,6 +175,141 @@ func TestSetPrimitiveValue(t *testing.T) {
175175 err := setPrimitiveValue (reflect .ValueOf (& got ).Elem (), arr , 0 )
176176 assert .Error (t , err , "expected error for int32→float64 mismatch" )
177177 })
178+
179+ t .Run ("int8" , func (t * testing.T ) {
180+ b := array .NewInt8Builder (mem )
181+ defer b .Release ()
182+ b .Append (- 42 )
183+ arr := b .NewArray ().(* array.Int8 )
184+ defer arr .Release ()
185+
186+ var got int8
187+ require .NoError (t , setPrimitiveValue (reflect .ValueOf (& got ).Elem (), arr , 0 ))
188+ assert .Equal (t , int8 (- 42 ), got )
189+
190+ var bad float32
191+ assert .ErrorIs (t , setPrimitiveValue (reflect .ValueOf (& bad ).Elem (), arr , 0 ), ErrTypeMismatch )
192+ })
193+
194+ t .Run ("int16" , func (t * testing.T ) {
195+ b := array .NewInt16Builder (mem )
196+ defer b .Release ()
197+ b .Append (- 1234 )
198+ arr := b .NewArray ().(* array.Int16 )
199+ defer arr .Release ()
200+
201+ var got int16
202+ require .NoError (t , setPrimitiveValue (reflect .ValueOf (& got ).Elem (), arr , 0 ))
203+ assert .Equal (t , int16 (- 1234 ), got )
204+
205+ var bad float32
206+ assert .ErrorIs (t , setPrimitiveValue (reflect .ValueOf (& bad ).Elem (), arr , 0 ), ErrTypeMismatch )
207+ })
208+
209+ t .Run ("int64 mismatch" , func (t * testing.T ) {
210+ b := array .NewInt64Builder (mem )
211+ defer b .Release ()
212+ b .Append (1 )
213+ arr := b .NewArray ().(* array.Int64 )
214+ defer arr .Release ()
215+
216+ var bad string
217+ assert .ErrorIs (t , setPrimitiveValue (reflect .ValueOf (& bad ).Elem (), arr , 0 ), ErrTypeMismatch )
218+ })
219+
220+ t .Run ("uint16" , func (t * testing.T ) {
221+ b := array .NewUint16Builder (mem )
222+ defer b .Release ()
223+ b .Append (65535 )
224+ arr := b .NewArray ().(* array.Uint16 )
225+ defer arr .Release ()
226+
227+ var got uint16
228+ require .NoError (t , setPrimitiveValue (reflect .ValueOf (& got ).Elem (), arr , 0 ))
229+ assert .Equal (t , uint16 (65535 ), got )
230+
231+ var bad int32
232+ assert .ErrorIs (t , setPrimitiveValue (reflect .ValueOf (& bad ).Elem (), arr , 0 ), ErrTypeMismatch )
233+ })
234+
235+ t .Run ("uint32" , func (t * testing.T ) {
236+ b := array .NewUint32Builder (mem )
237+ defer b .Release ()
238+ b .Append (4_000_000_000 )
239+ arr := b .NewArray ().(* array.Uint32 )
240+ defer arr .Release ()
241+
242+ var got uint32
243+ require .NoError (t , setPrimitiveValue (reflect .ValueOf (& got ).Elem (), arr , 0 ))
244+ assert .Equal (t , uint32 (4_000_000_000 ), got )
245+
246+ var bad int32
247+ assert .ErrorIs (t , setPrimitiveValue (reflect .ValueOf (& bad ).Elem (), arr , 0 ), ErrTypeMismatch )
248+ })
249+
250+ t .Run ("uint64" , func (t * testing.T ) {
251+ b := array .NewUint64Builder (mem )
252+ defer b .Release ()
253+ b .Append (1 << 63 )
254+ arr := b .NewArray ().(* array.Uint64 )
255+ defer arr .Release ()
256+
257+ var got uint64
258+ require .NoError (t , setPrimitiveValue (reflect .ValueOf (& got ).Elem (), arr , 0 ))
259+ assert .Equal (t , uint64 (1 << 63 ), got )
260+
261+ var bad float64
262+ assert .ErrorIs (t , setPrimitiveValue (reflect .ValueOf (& bad ).Elem (), arr , 0 ), ErrTypeMismatch )
263+ })
264+
265+ t .Run ("uint8 mismatch" , func (t * testing.T ) {
266+ b := array .NewUint8Builder (mem )
267+ defer b .Release ()
268+ b .Append (1 )
269+ arr := b .NewArray ().(* array.Uint8 )
270+ defer arr .Release ()
271+
272+ var bad int8
273+ assert .ErrorIs (t , setPrimitiveValue (reflect .ValueOf (& bad ).Elem (), arr , 0 ), ErrTypeMismatch )
274+ })
275+
276+ t .Run ("float32" , func (t * testing.T ) {
277+ b := array .NewFloat32Builder (mem )
278+ defer b .Release ()
279+ b .Append (2.5 )
280+ arr := b .NewArray ().(* array.Float32 )
281+ defer arr .Release ()
282+
283+ var got float32
284+ require .NoError (t , setPrimitiveValue (reflect .ValueOf (& got ).Elem (), arr , 0 ))
285+ assert .Equal (t , float32 (2.5 ), got )
286+
287+ var bad int32
288+ assert .ErrorIs (t , setPrimitiveValue (reflect .ValueOf (& bad ).Elem (), arr , 0 ), ErrTypeMismatch )
289+ })
290+
291+ t .Run ("float64 mismatch" , func (t * testing.T ) {
292+ b := array .NewFloat64Builder (mem )
293+ defer b .Release ()
294+ b .Append (1.0 )
295+ arr := b .NewArray ().(* array.Float64 )
296+ defer arr .Release ()
297+
298+ var bad int32
299+ assert .ErrorIs (t , setPrimitiveValue (reflect .ValueOf (& bad ).Elem (), arr , 0 ), ErrTypeMismatch )
300+ })
301+
302+ t .Run ("unsupported primitive type returns error" , func (t * testing.T ) {
303+ b := array .NewBooleanBuilder (mem )
304+ defer b .Release ()
305+ b .Append (true )
306+ arr := b .NewArray ().(* array.Boolean )
307+ defer arr .Release ()
308+
309+ var got bool
310+ err := setPrimitiveValue (reflect .ValueOf (& got ).Elem (), arr , 0 )
311+ assert .ErrorIs (t , err , ErrUnsupportedType )
312+ })
178313}
179314
180315func TestSetTemporalValue (t * testing.T ) {
@@ -262,6 +397,56 @@ func TestSetTemporalValue(t *testing.T) {
262397 assert .True (t , got .Hour () == 10 && got .Minute () == 30 && got .Second () == 0 && got .Nanosecond () == 123456789 ,
263398 "time64: got %v, want 10:30:00.123456789" , got )
264399 })
400+
401+ t .Run ("date64" , func (t * testing.T ) {
402+ b := array .NewDate64Builder (mem )
403+ defer b .Release ()
404+ ms := int64 (1705276800000 )
405+ b .Append (arrow .Date64 (ms ))
406+ arr := b .NewArray ().(* array.Date64 )
407+ defer arr .Release ()
408+
409+ got := setValueAt [time.Time ](t , arr , 0 )
410+ expected := arrow .Date64 (ms ).ToTime ()
411+ assert .True (t , got .Equal (expected ), "date64: expected %v, got %v" , expected , got )
412+ })
413+
414+ t .Run ("type mismatch into non-time returns error" , func (t * testing.T ) {
415+ b := array .NewTimestampBuilder (mem , & arrow.TimestampType {Unit : arrow .Second })
416+ defer b .Release ()
417+ b .Append (arrow .Timestamp (0 ))
418+ arr := b .NewArray ().(* array.Timestamp )
419+ defer arr .Release ()
420+
421+ var bad int64
422+ err := setTemporalValue (reflect .ValueOf (& bad ).Elem (), arr , 0 )
423+ assert .ErrorIs (t , err , ErrTypeMismatch )
424+ })
425+
426+ t .Run ("duration into non-duration returns error" , func (t * testing.T ) {
427+ dt := & arrow.DurationType {Unit : arrow .Second }
428+ b := array .NewDurationBuilder (mem , dt )
429+ defer b .Release ()
430+ b .Append (arrow .Duration (1 ))
431+ arr := b .NewArray ().(* array.Duration )
432+ defer arr .Release ()
433+
434+ var bad int64
435+ err := setTemporalValue (reflect .ValueOf (& bad ).Elem (), arr , 0 )
436+ assert .ErrorIs (t , err , ErrTypeMismatch )
437+ })
438+
439+ t .Run ("unsupported temporal type returns error" , func (t * testing.T ) {
440+ b := array .NewInt32Builder (mem )
441+ defer b .Release ()
442+ b .Append (1 )
443+ arr := b .NewArray ().(* array.Int32 )
444+ defer arr .Release ()
445+
446+ var got time.Time
447+ err := setTemporalValue (reflect .ValueOf (& got ).Elem (), arr , 0 )
448+ assert .ErrorIs (t , err , ErrUnsupportedType )
449+ })
265450}
266451
267452func TestSetDecimalValue (t * testing.T ) {
@@ -326,6 +511,72 @@ func TestSetDecimalValue(t *testing.T) {
326511 got := setValueAt [decimal.Decimal64 ](t , arr , 0 )
327512 assert .Equal (t , num , got )
328513 })
514+
515+ t .Run ("type mismatch into wrong decimal kind returns error" , func (t * testing.T ) {
516+ b128 := array .NewDecimal128Builder (mem , & arrow.Decimal128Type {Precision : 10 , Scale : 2 })
517+ defer b128 .Release ()
518+ b128 .Append (decimal128 .New (0 , 1 ))
519+ arr128 := b128 .NewDecimal128Array ()
520+ defer arr128 .Release ()
521+
522+ var got256 decimal256.Num
523+ assert .ErrorIs (t , setDecimalValue (reflect .ValueOf (& got256 ).Elem (), arr128 , 0 ), ErrTypeMismatch )
524+
525+ var got32 decimal.Decimal32
526+ assert .ErrorIs (t , setDecimalValue (reflect .ValueOf (& got32 ).Elem (), arr128 , 0 ), ErrTypeMismatch )
527+
528+ b256 := array .NewDecimal256Builder (mem , & arrow.Decimal256Type {Precision : 20 , Scale : 4 })
529+ defer b256 .Release ()
530+ b256 .Append (decimal256 .New (0 , 0 , 0 , 1 ))
531+ arr256 := b256 .NewDecimal256Array ()
532+ defer arr256 .Release ()
533+
534+ var got128 decimal128.Num
535+ assert .ErrorIs (t , setDecimalValue (reflect .ValueOf (& got128 ).Elem (), arr256 , 0 ), ErrTypeMismatch )
536+
537+ b32 := array .NewDecimal32Builder (mem , & arrow.Decimal32Type {Precision : 9 , Scale : 2 })
538+ defer b32 .Release ()
539+ b32 .Append (decimal .Decimal32 (1 ))
540+ arr32 := b32 .NewArray ().(* array.Decimal32 )
541+ defer arr32 .Release ()
542+
543+ var got64 decimal.Decimal64
544+ assert .ErrorIs (t , setDecimalValue (reflect .ValueOf (& got64 ).Elem (), arr32 , 0 ), ErrTypeMismatch )
545+
546+ b64 := array .NewDecimal64Builder (mem , & arrow.Decimal64Type {Precision : 18 , Scale : 3 })
547+ defer b64 .Release ()
548+ b64 .Append (decimal .Decimal64 (1 ))
549+ arr64 := b64 .NewArray ().(* array.Decimal64 )
550+ defer arr64 .Release ()
551+
552+ var badF float64
553+ assert .ErrorIs (t , setDecimalValue (reflect .ValueOf (& badF ).Elem (), arr64 , 0 ), ErrTypeMismatch )
554+ })
555+
556+ t .Run ("unsupported decimal type returns error" , func (t * testing.T ) {
557+ b := array .NewInt32Builder (mem )
558+ defer b .Release ()
559+ b .Append (1 )
560+ arr := b .NewArray ().(* array.Int32 )
561+ defer arr .Release ()
562+
563+ var got decimal128.Num
564+ err := setDecimalValue (reflect .ValueOf (& got ).Elem (), arr , 0 )
565+ assert .ErrorIs (t , err , ErrUnsupportedType )
566+ })
567+ }
568+
569+ func TestAssertArrayTypeMismatch (t * testing.T ) {
570+ mem := checkedMem (t )
571+ b := array .NewInt32Builder (mem )
572+ defer b .Release ()
573+ b .Append (1 )
574+ arr := b .NewInt32Array ()
575+ defer arr .Release ()
576+
577+ _ , err := assertArray [array.Float64 ](arr )
578+ require .Error (t , err )
579+ assert .ErrorIs (t , err , ErrTypeMismatch )
329580}
330581
331582func TestSetStructValue (t * testing.T ) {
@@ -608,6 +859,38 @@ func TestSetFixedSizeListValue(t *testing.T) {
608859 err := setValue (reflect .ValueOf (& got ).Elem (), arr , 0 )
609860 assert .Error (t , err , "expected error for size mismatch" )
610861 })
862+
863+ t .Run ("child element type mismatch errors" , func (t * testing.T ) {
864+ b := array .NewFixedSizeListBuilder (mem , 3 , arrow .PrimitiveTypes .Int32 )
865+ defer b .Release ()
866+ vb := b .ValueBuilder ().(* array.Int32Builder )
867+ b .Append (true )
868+ vb .AppendValues ([]int32 {1 , 2 , 3 }, nil )
869+
870+ arr := b .NewArray ().(* array.FixedSizeList )
871+ defer arr .Release ()
872+
873+ var got [3 ]string
874+ err := setValue (reflect .ValueOf (& got ).Elem (), arr , 0 )
875+ require .Error (t , err )
876+ assert .ErrorIs (t , err , ErrTypeMismatch )
877+ })
878+
879+ t .Run ("child element type mismatch on slice errors" , func (t * testing.T ) {
880+ b := array .NewFixedSizeListBuilder (mem , 2 , arrow .PrimitiveTypes .Int32 )
881+ defer b .Release ()
882+ vb := b .ValueBuilder ().(* array.Int32Builder )
883+ b .Append (true )
884+ vb .AppendValues ([]int32 {10 , 20 }, nil )
885+
886+ arr := b .NewArray ().(* array.FixedSizeList )
887+ defer arr .Release ()
888+
889+ var got []string
890+ err := setValue (reflect .ValueOf (& got ).Elem (), arr , 0 )
891+ require .Error (t , err )
892+ assert .ErrorIs (t , err , ErrTypeMismatch )
893+ })
611894}
612895
613896func TestSetDictionaryValue (t * testing.T ) {
0 commit comments