-
Notifications
You must be signed in to change notification settings - Fork 3
/
float_ms_test.go
147 lines (131 loc) · 2.88 KB
/
float_ms_test.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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package epoch
import (
"encoding/json"
"errors"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
type testFloatMSValueStruct struct {
Timestamp FloatMS `json:"timestamp"`
}
type testFloatMSPointerStruct struct {
Timestamp *FloatMS `json:"timestamp"`
}
func TestFloatMS_Marshal(t *testing.T) {
const js = `{"timestamp":1136239445.999}`
t.Run("value", func(t *testing.T) {
tests := map[string]struct {
v testFloatMSValueStruct
want string
wantErr error
}{
"positive": {
v: testFloatMSValueStruct{
Timestamp: FloatMS{Time: tmsTime},
},
want: js,
},
"rounding": {
v: testFloatMSValueStruct{
Timestamp: FloatMS{Time: time.Unix(1136239445, 500999000)},
},
want: `{"timestamp":1136239445.5}`,
},
}
for name, tc := range tests {
tc := tc
t.Run(name, func(t *testing.T) {
got, err := json.Marshal(tc.v)
require.NoError(t, err)
assert.Equal(t, tc.want, string(got))
})
}
})
t.Run("pointer", func(t *testing.T) {
tests := map[string]struct {
v testFloatMSPointerStruct
want string
wantErr error
}{
"positive": {
v: testFloatMSPointerStruct{
Timestamp: &FloatMS{Time: tmsTime},
},
want: js,
},
"nil": {
v: testFloatMSPointerStruct{
Timestamp: nil,
},
want: `{"timestamp":null}`,
},
}
for name, tc := range tests {
tc := tc
t.Run(name, func(t *testing.T) {
got, err := json.Marshal(tc.v)
require.NoError(t, err)
assert.Equal(t, tc.want, string(got))
})
}
})
}
func TestFloatMS_Unmarshal(t *testing.T) {
const js = `{"timestamp":1136239445.999}`
t.Run("value", func(t *testing.T) {
tests := map[string]struct {
v string
want FloatMS
wantErr error
}{
"positive": {
v: js,
want: FloatMS{Time: tmsTime},
},
"not_int": {
v: `{"timestamp":"text"}`,
wantErr: errors.New("failed to parse epoch.FloatMS: strconv.ParseFloat: parsing \"\\\"text\\\"\": invalid syntax"),
},
}
for name, tc := range tests {
tc := tc
t.Run(name, func(t *testing.T) {
var got testFloatMSValueStruct
err := json.Unmarshal([]byte(tc.v), &got)
if tc.wantErr == nil {
require.NoError(t, err)
assert.Equal(t, tc.want, got.Timestamp)
return
}
require.EqualError(t, err, tc.wantErr.Error())
})
}
})
t.Run("pointer", func(t *testing.T) {
tests := map[string]struct {
v string
want *FloatMS
wantErr error
}{
"positive": {
v: js,
want: &FloatMS{Time: tmsTime},
},
"nil": {
v: `{"timestamp":null}`,
want: nil,
},
}
for name, tc := range tests {
tc := tc
t.Run(name, func(t *testing.T) {
var got testFloatMSPointerStruct
err := json.Unmarshal([]byte(tc.v), &got)
require.NoError(t, err)
assert.Equal(t, tc.want, got.Timestamp)
})
}
})
}