@@ -3,6 +3,7 @@ package value
33import (
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+
2633func 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 ))
0 commit comments