1package pgtype_test
2
3import (
4	"testing"
5	"time"
6
7	"github.com/jackc/pgtype"
8	"github.com/jackc/pgtype/testutil"
9	"github.com/stretchr/testify/assert"
10	"github.com/stretchr/testify/require"
11)
12
13func TestIntervalTranscode(t *testing.T) {
14	testutil.TestSuccessfulTranscode(t, "interval", []interface{}{
15		&pgtype.Interval{Microseconds: 1, Status: pgtype.Present},
16		&pgtype.Interval{Microseconds: 1000000, Status: pgtype.Present},
17		&pgtype.Interval{Microseconds: 1000001, Status: pgtype.Present},
18		&pgtype.Interval{Microseconds: 123202800000000, Status: pgtype.Present},
19		&pgtype.Interval{Days: 1, Status: pgtype.Present},
20		&pgtype.Interval{Months: 1, Status: pgtype.Present},
21		&pgtype.Interval{Months: 12, Status: pgtype.Present},
22		&pgtype.Interval{Months: 13, Days: 15, Microseconds: 1000001, Status: pgtype.Present},
23		&pgtype.Interval{Microseconds: -1, Status: pgtype.Present},
24		&pgtype.Interval{Microseconds: -1000000, Status: pgtype.Present},
25		&pgtype.Interval{Microseconds: -1000001, Status: pgtype.Present},
26		&pgtype.Interval{Microseconds: -123202800000000, Status: pgtype.Present},
27		&pgtype.Interval{Days: -1, Status: pgtype.Present},
28		&pgtype.Interval{Months: -1, Status: pgtype.Present},
29		&pgtype.Interval{Months: -12, Status: pgtype.Present},
30		&pgtype.Interval{Months: -13, Days: -15, Microseconds: -1000001, Status: pgtype.Present},
31		&pgtype.Interval{Status: pgtype.Null},
32	})
33}
34
35func TestIntervalNormalize(t *testing.T) {
36	testutil.TestSuccessfulNormalize(t, []testutil.NormalizeTest{
37		{
38			SQL:   "select '1 second'::interval",
39			Value: &pgtype.Interval{Microseconds: 1000000, Status: pgtype.Present},
40		},
41		{
42			SQL:   "select '1.000001 second'::interval",
43			Value: &pgtype.Interval{Microseconds: 1000001, Status: pgtype.Present},
44		},
45		{
46			SQL:   "select '34223 hours'::interval",
47			Value: &pgtype.Interval{Microseconds: 123202800000000, Status: pgtype.Present},
48		},
49		{
50			SQL:   "select '1 day'::interval",
51			Value: &pgtype.Interval{Days: 1, Status: pgtype.Present},
52		},
53		{
54			SQL:   "select '1 month'::interval",
55			Value: &pgtype.Interval{Months: 1, Status: pgtype.Present},
56		},
57		{
58			SQL:   "select '1 year'::interval",
59			Value: &pgtype.Interval{Months: 12, Status: pgtype.Present},
60		},
61		{
62			SQL:   "select '-13 mon'::interval",
63			Value: &pgtype.Interval{Months: -13, Status: pgtype.Present},
64		},
65	})
66}
67
68func TestIntervalLossyConversionToDuration(t *testing.T) {
69	interval := &pgtype.Interval{Months: 1, Days: 1, Status: pgtype.Present}
70	var d time.Duration
71	err := interval.AssignTo(&d)
72	require.NoError(t, err)
73	assert.EqualValues(t, int64(2678400000000000), d.Nanoseconds())
74}
75