Skip to content

Commit 6e24f28

Browse files
author
Roman Golov
committed
Add more tests for cast.
1 parent f91d7ea commit 6e24f28

File tree

2 files changed

+295
-3
lines changed

2 files changed

+295
-3
lines changed

internal/value/cast_test.go

Lines changed: 287 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package value
33
import (
44
"reflect"
55
"testing"
6+
"time"
67

78
"github.com/stretchr/testify/require"
89

@@ -23,8 +24,14 @@ func unwrapPtr(v interface{}) interface{} {
2324
return reflect.ValueOf(v).Elem().Interface()
2425
}
2526

27+
func loadLocation(T *testing.T, name string) *time.Location {
28+
loc, err := time.LoadLocation(name)
29+
require.NoError(T, err)
30+
return loc
31+
}
32+
2633
func TestCastTo(t *testing.T) {
27-
for _, tt := range []struct {
34+
testsCases := []struct {
2835
name string
2936
value Value
3037
dst interface{}
@@ -128,7 +135,285 @@ func TestCastTo(t *testing.T) {
128135
dst: ptr[int](),
129136
err: ErrCannotCast,
130137
},
131-
} {
138+
139+
{
140+
name: xtest.CurrentFileLine(),
141+
value: JSONDocumentValue(`{"test": "text"}"`),
142+
dst: ptr[string](),
143+
exp: `{"test": "text"}"`,
144+
err: nil,
145+
},
146+
{
147+
name: xtest.CurrentFileLine(),
148+
value: JSONDocumentValue(`{"test":"text"}"`),
149+
dst: ptr[Value](),
150+
exp: JSONDocumentValue(`{"test":"text"}"`),
151+
err: nil,
152+
},
153+
{
154+
name: xtest.CurrentFileLine(),
155+
value: OptionalValue(JSONDocumentValue(`{"test": "text"}"`)),
156+
dst: ptr[*[]byte](),
157+
exp: value2ptr([]byte(`{"test": "text"}"`)),
158+
err: nil,
159+
},
160+
{
161+
name: xtest.CurrentFileLine(),
162+
value: JSONDocumentValue(`{"test":"text"}"`),
163+
dst: ptr[[]byte](),
164+
exp: []byte(`{"test":"text"}"`),
165+
err: nil,
166+
},
167+
168+
{
169+
name: xtest.CurrentFileLine(),
170+
value: BoolValue(true),
171+
dst: ptr[bool](),
172+
exp: true,
173+
err: nil,
174+
},
175+
{
176+
name: xtest.CurrentFileLine(),
177+
value: BoolValue(true),
178+
dst: ptr[Value](),
179+
exp: BoolValue(true),
180+
err: nil,
181+
},
182+
{
183+
name: xtest.CurrentFileLine(),
184+
value: OptionalValue(BoolValue(true)),
185+
dst: ptr[*bool](),
186+
exp: value2ptr(true),
187+
err: nil,
188+
},
189+
190+
{
191+
name: xtest.CurrentFileLine(),
192+
value: Int32Value(123),
193+
dst: ptr[int32](),
194+
exp: int32(123),
195+
err: nil,
196+
},
197+
{
198+
name: xtest.CurrentFileLine(),
199+
value: Int32Value(123),
200+
dst: ptr[Value](),
201+
exp: Int32Value(123),
202+
err: nil,
203+
},
204+
{
205+
name: xtest.CurrentFileLine(),
206+
value: Int32Value(123),
207+
dst: ptr[int64](),
208+
exp: int64(123),
209+
err: nil,
210+
},
211+
{
212+
name: xtest.CurrentFileLine(),
213+
value: Int32Value(123),
214+
dst: ptr[float32](),
215+
exp: float32(123),
216+
err: nil,
217+
},
218+
{
219+
name: xtest.CurrentFileLine(),
220+
value: Int32Value(123),
221+
dst: ptr[float64](),
222+
exp: float64(123),
223+
err: nil,
224+
},
225+
{
226+
name: xtest.CurrentFileLine(),
227+
value: OptionalValue(Int32Value(123)),
228+
dst: ptr[*int32](),
229+
exp: value2ptr(int32(123)),
230+
err: nil,
231+
},
232+
{
233+
name: xtest.CurrentFileLine(),
234+
value: Int32Value(123),
235+
dst: ptr[string](),
236+
exp: "123",
237+
err: nil,
238+
},
239+
{
240+
name: xtest.CurrentFileLine(),
241+
value: Int32Value(123),
242+
dst: ptr[[]byte](),
243+
exp: []byte("123"),
244+
err: nil,
245+
},
246+
247+
{
248+
name: xtest.CurrentFileLine(),
249+
value: Int64Value(123),
250+
dst: ptr[int64](),
251+
exp: int64(123),
252+
err: nil,
253+
},
254+
{
255+
name: xtest.CurrentFileLine(),
256+
value: Int64Value(123),
257+
dst: ptr[Value](),
258+
exp: Int64Value(123),
259+
err: nil,
260+
},
261+
{
262+
name: xtest.CurrentFileLine(),
263+
value: OptionalValue(Int64Value(123)),
264+
dst: ptr[*int64](),
265+
exp: value2ptr(int64(123)),
266+
err: nil,
267+
},
268+
{
269+
name: xtest.CurrentFileLine(),
270+
value: Int64Value(123),
271+
dst: ptr[float64](),
272+
exp: float64(123),
273+
err: nil,
274+
},
275+
{
276+
name: xtest.CurrentFileLine(),
277+
value: Int64Value(123),
278+
dst: ptr[string](),
279+
exp: "123",
280+
err: nil,
281+
},
282+
{
283+
name: xtest.CurrentFileLine(),
284+
value: Int64Value(123),
285+
dst: ptr[[]byte](),
286+
exp: []byte("123"),
287+
err: nil,
288+
},
289+
290+
{
291+
name: xtest.CurrentFileLine(),
292+
value: DoubleValue(1.23),
293+
dst: ptr[float64](),
294+
exp: 1.23,
295+
err: nil,
296+
},
297+
{
298+
name: xtest.CurrentFileLine(),
299+
value: DoubleValue(1.23),
300+
dst: ptr[Value](),
301+
exp: DoubleValue(1.23),
302+
err: nil,
303+
},
304+
{
305+
name: xtest.CurrentFileLine(),
306+
value: OptionalValue(DoubleValue(1.23)),
307+
dst: ptr[*float64](),
308+
exp: value2ptr(1.23),
309+
err: nil,
310+
},
311+
312+
{
313+
name: xtest.CurrentFileLine(),
314+
value: IntervalValueFromDuration(time.Second),
315+
dst: ptr[time.Duration](),
316+
exp: time.Second,
317+
err: nil,
318+
},
319+
{
320+
name: xtest.CurrentFileLine(),
321+
value: IntervalValueFromDuration(time.Second),
322+
dst: ptr[Value](),
323+
exp: IntervalValueFromDuration(time.Second),
324+
err: nil,
325+
},
326+
327+
// nanoseconds are ignored in YDB timestamps
328+
{
329+
name: xtest.CurrentFileLine(),
330+
value: TimestampValueFromTime(time.Date(2024, 1, 2, 3, 4, 5, 0, time.Local)),
331+
dst: ptr[time.Time](),
332+
exp: time.Date(2024, 1, 2, 3, 4, 5, 0, time.Local),
333+
err: nil,
334+
},
335+
{
336+
name: xtest.CurrentFileLine(),
337+
value: TimestampValueFromTime(time.Date(2024, 1, 2, 3, 4, 5, 0, time.Local)),
338+
dst: ptr[Value](),
339+
exp: TimestampValueFromTime(time.Date(2024, 1, 2, 3, 4, 5, 0, time.Local)),
340+
err: nil,
341+
},
342+
{
343+
name: xtest.CurrentFileLine(),
344+
value: TimestampValue(uint64(time.Date(2024, 1, 2, 3, 4, 5, 0, time.Local).Unix())),
345+
dst: ptr[uint64](),
346+
exp: uint64(time.Date(2024, 1, 2, 3, 4, 5, 0, time.Local).Unix()),
347+
err: nil,
348+
},
349+
350+
// nanoseconds are ignored in YDB timestamps
351+
{
352+
name: xtest.CurrentFileLine(),
353+
value: TzTimestampValue("2024-01-02T03:04:05.000000,Europe/Moscow"),
354+
dst: ptr[time.Time](),
355+
exp: time.Date(2024, 1, 2, 3, 4, 5, 0, loadLocation(t, "Europe/Moscow")),
356+
err: nil,
357+
},
358+
{
359+
name: xtest.CurrentFileLine(),
360+
value: TzTimestampValueFromTime(time.Date(2024, 1, 2, 3, 4, 5, 0, time.UTC)),
361+
dst: ptr[string](),
362+
exp: "2024-01-02T03:04:05.000000Z",
363+
err: nil,
364+
},
365+
{
366+
name: xtest.CurrentFileLine(),
367+
value: TzTimestampValueFromTime(time.Date(2024, 1, 2, 3, 4, 5, 0, time.UTC)),
368+
dst: ptr[[]byte](),
369+
exp: []byte("2024-01-02T03:04:05.000000Z"),
370+
err: nil,
371+
},
372+
{
373+
name: xtest.CurrentFileLine(),
374+
value: TzTimestampValueFromTime(time.Date(2024, 1, 2, 3, 4, 5, 0, time.UTC)),
375+
dst: ptr[Value](),
376+
exp: TzTimestampValueFromTime(time.Date(2024, 1, 2, 3, 4, 5, 0, time.UTC)),
377+
err: nil,
378+
},
379+
380+
{
381+
name: xtest.CurrentFileLine(),
382+
value: DateValue(uint32(time.Date(2024, 1, 2, 3, 4, 5, 0, time.UTC).Unix())),
383+
dst: ptr[int32](),
384+
exp: int32(time.Date(2024, 1, 2, 3, 4, 5, 0, time.UTC).Unix()),
385+
err: nil,
386+
},
387+
{
388+
name: xtest.CurrentFileLine(),
389+
value: DateValueFromTime(time.Date(2024, 1, 2, 3, 4, 5, 0, time.UTC)),
390+
dst: ptr[uint64](),
391+
exp: uint64(DateValueFromTime(time.Date(2024, 1, 2, 3, 4, 5, 0, time.UTC))),
392+
err: nil,
393+
},
394+
{
395+
name: xtest.CurrentFileLine(),
396+
value: DateValueFromTime(time.Date(2024, 1, 2, 0, 0, 0, 0, time.UTC)),
397+
dst: ptr[int64](),
398+
exp: int64(DateValueFromTime(time.Date(2024, 1, 2, 0, 0, 0, 0, time.UTC))),
399+
err: nil,
400+
},
401+
{
402+
name: xtest.CurrentFileLine(),
403+
value: DateValueFromTime(time.Date(2024, 1, 2, 0, 0, 0, 0, time.UTC)),
404+
dst: ptr[time.Time](),
405+
exp: time.Date(2024, 1, 2, 0, 0, 0, 0, time.UTC),
406+
err: nil,
407+
},
408+
{
409+
name: xtest.CurrentFileLine(),
410+
value: DateValueFromTime(time.Date(2024, 1, 2, 0, 0, 0, 0, time.UTC)),
411+
dst: ptr[Value](),
412+
exp: DateValueFromTime(time.Date(2024, 1, 2, 0, 0, 0, 0, time.UTC)),
413+
err: nil,
414+
},
415+
}
416+
for _, tt := range testsCases {
132417
t.Run(tt.name, func(t *testing.T) {
133418
if tt.err == nil {
134419
require.NoError(t, CastTo(tt.value, tt.dst))

internal/value/value.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ type dateValue uint32
364364
func (v dateValue) castTo(dst interface{}) error {
365365
switch vv := dst.(type) {
366366
case *time.Time:
367-
*vv = DateToTime(uint32(v))
367+
*vv = DateToTime(uint32(v)).UTC()
368368

369369
return nil
370370
case *uint64:
@@ -1736,6 +1736,13 @@ type tzTimestampValue string
17361736

17371737
func (v tzTimestampValue) castTo(dst interface{}) error {
17381738
switch vv := dst.(type) {
1739+
case *time.Time:
1740+
t, err := TzTimestampToTime(string(v))
1741+
if err != nil {
1742+
return err
1743+
}
1744+
*vv = t
1745+
return nil
17391746
case *string:
17401747
*vv = string(v)
17411748

0 commit comments

Comments
 (0)