11package jsonpointer_test
22
33import (
4+ "encoding/json"
45 "fmt"
56 "testing"
67
@@ -17,66 +18,82 @@ func TestAssign(t *testing.T) {
1718 tests := []struct {
1819 ptr jsonpointer.JSONPointer
1920 value interface {}
20- err error
21- run func (v interface {})
21+ run func (v interface {}, err error )
2222 }{
23- {"/nested/str" , "strval" , nil , func (val interface {}) {
24- assert .Equal (val , r .Nested .String )
23+ {"/nested/str" , "strval" , func (val interface {}, err error ) {
24+ assert .NoError (err )
25+ assert .Equal (val , r .Nested .Str )
2526 }},
26- {"/nestedptr/str" , "x" , nil , func (val interface {}) {
27- assert .Equal (val , r .NestedPtr .String )
27+ {"/nestedptr/str" , "x" , func (val interface {}, err error ) {
28+ assert .NoError (err )
29+ assert .Equal (val , r .NestedPtr .Str )
2830 }},
29- {"/nested/entrymap/keyval/name" , "entry-name" , nil , func (v interface {}) {
31+ {"/nested/entrymap/keyval/name" , "entry-name" , func (v interface {}, err error ) {
32+ assert .NoError (err )
3033 assert .Contains (r .Nested .EntryMap , "keyval" )
3134 assert .Equal ("entry-name" , r .Nested .EntryMap ["keyval" ].Name )
3235 }},
33- {"/nested/strarray/1" , "strval" , nil , func (v interface {}) {
36+ {"/nested/strarray/1" , "strval" , func (v interface {}, err error ) {
37+ assert .NoError (err )
3438 assert .Equal (v , r .Nested .StrArray [1 ])
3539 }},
36- {"/nested/intarray/1" , 1 , nil , func (v interface {}) {
40+ {"/nested/intarray/1" , 1 , func (v interface {}, err error ) {
41+ assert .NoError (err )
3742 assert .Equal (v , r .Nested .IntArray [1 ])
3843 }},
39- {"/nested/intarray/2" , 3 , nil , func (v interface {}) {
44+ {"/nested/intarray/2" , 3 , func (v interface {}, err error ) {
45+ assert .NoError (err )
4046 assert .Equal (v , r .Nested .IntArray [2 ])
4147 }},
42- {"/nested/intarray/3" , 3 , jsonpointer .ErrOutOfRange , nil },
43- {"/nested/anon/value" , "val" , nil , func (v interface {}) {
48+ {"/nested/intarray/3" , 3 , func (v interface {}, err error ) {
49+ assert .Error (err )
50+ assert .ErrorIs (err , jsonpointer .ErrOutOfRange )
51+ ie , ok := jsonpointer .AsIndexError (err )
52+ assert .True (ok , "err is not an IndexError" )
53+ assert .Equal (3 , ie .Index ())
54+ }},
55+ {"/nested/anon/value" , "val" , func (v interface {}, err error ) {
56+ assert .NoError (err )
4457 assert .Equal (v , r .Nested .AnonStruct .Value )
4558 }},
46- {"/nested/strslice/-" , "val" , nil , func (v interface {}) {
59+ {"/nested/strslice/-" , "val" , func (v interface {}, err error ) {
60+ assert .NoError (err )
4761 assert .Len (r .Nested .StrSlice , 1 )
4862 assert .Equal (v , r .Nested .StrSlice [0 ])
4963 }},
50- {"/nested/strslice/-" , "val2" , nil , func (v interface {}) {
64+ {"/nested/strslice/-" , "val2" , func (v interface {}, err error ) {
65+ assert .NoError (err )
5166 assert .Len (r .Nested .StrSlice , 2 )
5267 assert .Equal (v , r .Nested .StrSlice [1 ])
5368 }},
54- {"/nested/custommap/key" , "val" , nil , func (v interface {}) {
69+ {"/nested/custommap/key" , "val" , func (v interface {}, err error ) {
70+ assert .NoError (err )
5571 assert .Len (r .Nested .CustomMap , 1 )
5672 assert .Contains (r .Nested .CustomMap , Key {"key" })
5773 }},
58- {"/nested/embedded/value" , "embed-val" , nil , func (v interface {}) {
74+ {"/nested/embedded/value" , "embed-val" , func (v interface {}, err error ) {
75+ assert .NoError (err )
5976 assert .Equal (v , r .Nested .Embedded .Value )
6077 }},
61- {"/nested/yield/value" , "yielded value" , nil , func (v interface {}) {
78+ {"/nested/yield/value" , "yielded value" , func (v interface {}, err error ) {
79+ assert .NoError (err )
6280 assert .Equal (v , r .Nested .Yield .Value )
6381 }},
64- {"/nested/interface/private/value" , uint (3 ), nil , func (v interface {}) {
82+ {"/nested/interface/private/value" , uint (3 ), func (v interface {}, err error ) {
83+ assert .NoError (err )
6584 assert .Equal (v , r .Nested .InterContainer .Interface .Value ())
6685 }},
6786 }
6887
6988 for i , test := range tests {
7089 fmt .Printf ("=== RUN TestAssign #%d, pointer %s\n " , i + 1 , test .ptr )
7190 err := jsonpointer .Assign (& r , test .ptr , test .value )
72- if test .err != nil {
73- assert .ErrorIs (err , test .err )
74- } else {
75- assert .NoError (err )
76- test .run (test .value )
77- }
78- fmt .Printf ("--- PASS TestAssign #%d, pointer %s\n " , i , test .ptr )
91+ test .run (test .value , err )
92+
93+ fmt .Println ("--- PASS" )
7994 }
95+ b , _ := json .MarshalIndent (r , "" , " " )
96+ fmt .Println (string (b ))
8097}
8198
8299func TestAssignAny (t * testing.T ) {
@@ -110,7 +127,6 @@ func TestAssignAny(t *testing.T) {
110127 assert .Contains (e , "value" )
111128 assert .Equal (v , e ["value" ])
112129 }},
113-
114130 {"/nested/intarray/0" , int (1 ), nil , func (v interface {}) {
115131 a := m ["nested" ].(map [string ]interface {})["intarray" ].([]interface {})
116132 assert .Len (a , 1 )
@@ -137,7 +153,45 @@ func TestAssignAny(t *testing.T) {
137153 assert .NoError (err )
138154 test .run (test .value )
139155 }
140- fmt .Printf ("--- PASS TestAssign #%d, pointer %s \n " , i , test . ptr )
156+ fmt .Println ("--- PASS" )
141157 }
142158 litter .Dump (m )
143159}
160+
161+ func TestAssignJSON (t * testing.T ) {
162+ assert := require .New (t )
163+ _ = assert
164+
165+ tests := []struct {
166+ ptr jsonpointer.JSONPointer
167+ json string
168+ value interface {}
169+ run func (v Root , err error )
170+ }{
171+ {
172+ "/nested/str" ,
173+ `{
174+ "nested": {
175+ "str": "old-value"
176+ }
177+ }` ,
178+ "new-value" ,
179+ func (r Root , err error ) {
180+ assert .NoError (err )
181+ assert .Equal ("new-value" , r .Nested .Str )
182+ },
183+ },
184+ }
185+
186+ for i , test := range tests {
187+ fmt .Printf ("=== RUN TestAssignJSON #%d, pointer %s\n " , i , test .ptr )
188+ b := []byte (test .json )
189+ err := jsonpointer .Assign (& b , test .ptr , test .value )
190+ var r Root
191+ if uerr := json .Unmarshal (b , & r ); uerr != nil {
192+ assert .Failf ("unmarshal failed: %v" , uerr .Error ())
193+ }
194+ test .run (r , err )
195+ fmt .Println ("--- PASS" )
196+ }
197+ }
0 commit comments