-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathmaybe_test.go
116 lines (94 loc) · 2.41 KB
/
maybe_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
package jsval_test
import (
"bytes"
"encoding/json"
"strconv"
"strings"
"testing"
"time"
"github.com/lestrrat-go/jsval"
"github.com/stretchr/testify/assert"
)
type TestMaybeStruct struct {
Name jsval.MaybeString `json:"name"`
Age int `json:"age"`
}
func TestMaybeString_Empty(t *testing.T) {
const src = `{"age": 10}`
var s TestMaybeStruct
if !assert.NoError(t, json.NewDecoder(strings.NewReader(src)).Decode(&s), "Decode works") {
return
}
v := jsval.New().SetRoot(
jsval.Object().
AddProp("name", jsval.String()).
AddProp("age", jsval.Integer()),
)
if !assert.NoError(t, v.Validate(&s), "Validate succeeds") {
return
}
}
func TestMaybeString_Populated(t *testing.T) {
const src = `{"age": 10, "name": "John Doe"}`
var s TestMaybeStruct
if !assert.NoError(t, json.NewDecoder(strings.NewReader(src)).Decode(&s), "Decode works") {
return
}
v := jsval.New().SetRoot(
jsval.Object().
AddProp("name", jsval.String()).
AddProp("age", jsval.Integer()),
)
if !assert.NoError(t, v.Validate(&s), "Validate succeeds") {
return
}
}
func TestMaybeString_EmptyDefault(t *testing.T) {
const src = `{"age": 10}`
var s TestMaybeStruct
if !assert.NoError(t, json.NewDecoder(strings.NewReader(src)).Decode(&s), "Decode works") {
return
}
v := jsval.New().SetRoot(
jsval.Object().
AddProp("name", jsval.String().Default("John Doe")).
AddProp("age", jsval.Integer()),
)
if !assert.NoError(t, v.Validate(&s), "Validate succeeds") {
return
}
if !assert.Equal(t, s.Name.Value().(string), "John Doe", "Should have default value") {
return
}
}
func TestMaybeInt(t *testing.T) {
var i jsval.MaybeInt
if !assert.NoError(t, i.Set(10), "const 10 can be set to MaybeInt (coersion takes place)") {
return
}
if !assert.NoError(t, i.Set(10.0), "const 10.0 can be set to MaybeInt (coersion takes place)") {
return
}
}
func TestMaybeTime(t *testing.T) {
var v jsval.MaybeTime
x := time.Now().Truncate(time.Second)
if !assert.NoError(t, v.Set(x), "set v to now") {
return
}
var buf bytes.Buffer
if !assert.NoError(t, json.NewEncoder(&buf).Encode(v), "json encoding works") {
return
}
if !assert.Equal(t, strconv.Quote(x.Format(time.RFC3339))+"\n", buf.String()) {
return
}
var d time.Time
if !assert.NoError(t, json.NewDecoder(&buf).Decode(&d)) {
return
}
// Use epoch time for more unambiguous comparison
if !assert.Equal(t, x.Unix(), d.Unix()) {
return
}
}