forked from DuanWeiFan/parquet-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_go18.go
105 lines (88 loc) · 2.37 KB
/
test_go18.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//go:build go1.18
package test
import (
"fmt"
"testing"
"github.com/hhoughgg/parquet-go/encoding"
)
func EncodeInt32(t *testing.T, enc encoding.Encoding, min, max int, bitWidth uint) {
t.Helper()
encode(t, enc, min, max,
encoding.Encoding.EncodeInt32,
encoding.Encoding.DecodeInt32,
func(i int) int32 {
value := int32(i)
mask := int32((1 << bitWidth) - 1)
if (i % 2) != 0 {
value = -value
}
return value & mask
},
)
}
func EncodeInt64(t *testing.T, enc encoding.Encoding, min, max int, bitWidth uint) {
t.Helper()
encode(t, enc, min, max,
encoding.Encoding.EncodeInt64,
encoding.Encoding.DecodeInt64,
func(i int) int64 {
value := int64(i)
mask := int64((1 << bitWidth) - 1)
if (i % 2) != 0 {
value = -value
}
return value & mask
},
)
}
func EncodeFloat(t *testing.T, enc encoding.Encoding, min, max int) {
t.Helper()
encode(t, enc, min, max,
encoding.Encoding.EncodeFloat,
encoding.Encoding.DecodeFloat,
func(i int) float32 { return float32(i) },
)
}
func EncodeDouble(t *testing.T, enc encoding.Encoding, min, max int) {
t.Helper()
encode(t, enc, min, max,
encoding.Encoding.EncodeDouble,
encoding.Encoding.DecodeDouble,
func(i int) float64 { return float64(i) },
)
}
type encodingFunc[T comparable] func(encoding.Encoding, []byte, []T) ([]byte, error)
type decodingFunc[T comparable] func(encoding.Encoding, []T, []byte) ([]T, error)
func encode[T comparable](t *testing.T, enc encoding.Encoding, min, max int, encode encodingFunc[T], decode decodingFunc[T], valueOf func(int) T) {
t.Helper()
for k := min; k <= max; k++ {
t.Run(fmt.Sprintf("N=%d", k), func(t *testing.T) {
src := make([]T, k)
for i := range src {
src[i] = valueOf(i)
}
buf, err := encode(enc, nil, src)
if err != nil {
t.Fatalf("encoding %d values: %v", k, err)
}
res, err := decode(enc, nil, buf)
if err != nil {
t.Fatalf("decoding %d values: %v", k, err)
}
if err := assertEqual(src, res); err != nil {
t.Fatalf("testing %d values: %v", k, err)
}
})
}
}
func assertEqual[T comparable](want, got []T) error {
if len(want) != len(got) {
return fmt.Errorf("number of values mismatch: want=%d got=%d", len(want), len(got))
}
for i := range want {
if want[i] != got[i] {
return fmt.Errorf("values at index %d/%d mismatch: want=%+v got=%+v", i, len(want), want[i], got[i])
}
}
return nil
}