Skip to content

Commit 29f8ebe

Browse files
committed
test(arreflect): expand coverage of error paths and uncovered branches
Add targeted tests for primitive set-value kinds, dictionary/list-element builder dispatch, InferGoType primitives and composites, applyTemporal / applyDecimal branch coverage, buildEmptyTyped error and happy paths, and error paths for asTime/asDuration/appendTemporalValue, appendDecimalValue, buildMapArray, buildRunEndEncodedArray (empty, nil-pointer equality, DeepEqual for non-comparable elements), AtAny InferGoType errors, and fillFixedSizeList child-type mismatches. Package coverage rises from 88.0% to 91.4% and every previously sub-80% function now exceeds 80%.
1 parent 4bb3fd9 commit 29f8ebe

5 files changed

Lines changed: 861 additions & 0 deletions

File tree

arrow/array/arreflect/reflect_arrow_to_go_test.go

Lines changed: 283 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

180315
func 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

267452
func 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

331582
func 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

613896
func TestSetDictionaryValue(t *testing.T) {

0 commit comments

Comments
 (0)