...
1
2
3
4
5 package uuid
6
7 import (
8 "encoding/json"
9 "reflect"
10 "testing"
11 )
12
13 var testUUID = Must(Parse("f47ac10b-58cc-0372-8567-0e02b2c3d479"))
14
15 func TestJSON(t *testing.T) {
16 type S struct {
17 ID1 UUID
18 ID2 UUID
19 }
20 s1 := S{ID1: testUUID}
21 data, err := json.Marshal(&s1)
22 if err != nil {
23 t.Fatal(err)
24 }
25 var s2 S
26 if err := json.Unmarshal(data, &s2); err != nil {
27 t.Fatal(err)
28 }
29 if !reflect.DeepEqual(&s1, &s2) {
30 t.Errorf("got %#v, want %#v", s2, s1)
31 }
32 }
33
34 func TestJSONUnmarshal(t *testing.T) {
35 type S struct {
36 ID1 UUID
37 ID2 UUID `json:"ID2,omitempty"`
38 }
39
40 testCases := map[string]struct {
41 data []byte
42 expectedError error
43 expectedResult UUID
44 }{
45 "success": {
46 data: []byte(`{"ID1": "f47ac10b-58cc-0372-8567-0e02b2c3d479"}`),
47 expectedError: nil,
48 expectedResult: testUUID,
49 },
50 "zero": {
51 data: []byte(`{"ID1": "00000000-0000-0000-0000-000000000000"}`),
52 expectedError: nil,
53 expectedResult: Nil,
54 },
55 "null": {
56 data: []byte(`{"ID1": null}`),
57 expectedError: nil,
58 expectedResult: Nil,
59 },
60 "empty": {
61 data: []byte(`{"ID1": ""}`),
62 expectedError: invalidLengthError{len: 0},
63 expectedResult: Nil,
64 },
65 "omitempty": {
66 data: []byte(`{"ID2": ""}`),
67 expectedError: invalidLengthError{len: 0},
68 expectedResult: Nil,
69 },
70 }
71
72 for name, tc := range testCases {
73 t.Run(name, func(t *testing.T) {
74 var s S
75 if err := json.Unmarshal(tc.data, &s); err != tc.expectedError {
76 t.Errorf("unexpected error: got %v, want %v", err, tc.expectedError)
77 }
78 if !reflect.DeepEqual(s.ID1, tc.expectedResult) {
79 t.Errorf("got %#v, want %#v", s.ID1, tc.expectedResult)
80 }
81 })
82 }
83 }
84
85 func BenchmarkUUID_MarshalJSON(b *testing.B) {
86 x := &struct {
87 UUID UUID `json:"uuid"`
88 }{}
89 var err error
90 x.UUID, err = Parse("f47ac10b-58cc-0372-8567-0e02b2c3d479")
91 if err != nil {
92 b.Fatal(err)
93 }
94 for i := 0; i < b.N; i++ {
95 js, err := json.Marshal(x)
96 if err != nil {
97 b.Fatalf("marshal json: %#v (%v)", js, err)
98 }
99 }
100 }
101
102 func BenchmarkUUID_UnmarshalJSON(b *testing.B) {
103 js := []byte(`{"uuid":"f47ac10b-58cc-0372-8567-0e02b2c3d479"}`)
104 var x *struct {
105 UUID UUID `json:"uuid"`
106 }
107 for i := 0; i < b.N; i++ {
108 err := json.Unmarshal(js, &x)
109 if err != nil {
110 b.Fatalf("marshal json: %#v (%v)", js, err)
111 }
112 }
113 }
114
View as plain text