1010from jsonpointer import resolve_pointer , EndOfList , JsonPointerException , \
1111 JsonPointer , set_pointer
1212
13+
1314class SpecificationTests (unittest .TestCase ):
1415 """ Tests all examples from the JSON Pointer specification """
1516
@@ -73,6 +74,7 @@ def test_round_trip(self):
7374 new_ptr = JsonPointer .from_parts (parts )
7475 self .assertEqual (ptr , new_ptr )
7576
77+
7678class ComparisonTests (unittest .TestCase ):
7779
7880 def setUp (self ):
@@ -108,7 +110,6 @@ def test_contains_magic(self):
108110 self .assertTrue (self .ptr1 in self .ptr1 )
109111 self .assertFalse (self .ptr3 in self .ptr1 )
110112
111-
112113class WrongInputTests (unittest .TestCase ):
113114
114115 def test_no_start_slash (self ):
@@ -192,42 +193,52 @@ def test_set(self):
192193
193194 self .assertRaises (JsonPointerException , set_pointer , doc , "" , 9 )
194195
196+
195197class AltTypesTests (unittest .TestCase ):
196198
197- def test_alttypes (self ):
198- JsonPointer .alttypes = True
199+ class Node (object ):
200+ def __init__ (self , name , parent = None ):
201+ self .name = name
202+ self .parent = parent
203+ self .left = None
204+ self .right = None
199205
200- class Node (object ):
201- def __init__ (self , name , parent = None ):
202- self .name = name
203- self .parent = parent
204- self .left = None
205- self .right = None
206+ def set_left (self , node ):
207+ node .parent = self
208+ self .left = node
206209
207- def set_left (self , node ):
208- node .parent = self
209- self .left = node
210+ def set_right (self , node ):
211+ node .parent = self
212+ self .right = node
210213
211- def set_right (self , node ):
212- node .parent = self
213- self .right = node
214+ def __getitem__ (self , key ):
215+ if key == 'left' :
216+ return self .left
217+ if key == 'right' :
218+ return self .right
214219
215- def __getitem__ (self , key ):
216- if key == 'left' :
217- return self .left
218- if key == 'right' :
219- return self .right
220+ raise KeyError ("Only left and right supported" )
220221
221- raise KeyError ("Only left and right supported" )
222+ def __setitem__ (self , key , val ):
223+ if key == 'left' :
224+ return self .set_left (val )
225+ if key == 'right' :
226+ return self .set_right (val )
222227
223- def __setitem__ (self , key , val ):
224- if key == 'left' :
225- return self .set_left (val )
226- if key == 'right' :
227- return self .set_right (val )
228+ raise KeyError ("Only left and right supported: %s" % key )
228229
229- raise KeyError ("Only left and right supported: %s" % key )
230+ class mdict (object ):
231+ def __init__ (self , d ):
232+ self ._d = d
233+ def __getitem__ (self , item ):
234+ return self ._d [item ]
230235
236+ mdict = mdict ({'root' : {'1' : {'2' : '3' }}})
237+ Node = Node
238+
239+
240+ def test_alttypes (self ):
241+ Node = self .Node
231242
232243 root = Node ('root' )
233244 root .set_left (Node ('a' ))
@@ -249,6 +260,39 @@ def __setitem__(self, key, val):
249260 set_pointer (root , '/left/right' , Node ('AB' ))
250261 self .assertEqual (resolve_pointer (root , '/left/right' ).name , 'AB' )
251262
263+ def test_mock_dict_sanity (self ):
264+ doc = self .mdict
265+ default = None
266+
267+ # TODO: Generate this automatically for any given object
268+ path_to_expected_value = {
269+ '/root/1' : {'2' : '3' },
270+ '/root' : {'1' : {'2' : '3' }},
271+ '/root/1/2' : '3' ,
272+ }
273+
274+ for path , expected_value in iter (path_to_expected_value .items ()):
275+ self .assertEqual (resolve_pointer (doc , path , default ), expected_value )
276+
277+ def test_mock_dict_returns_default (self ):
278+ doc = self .mdict
279+ default = None
280+
281+ path_to_expected_value = {
282+ '/foo' : default ,
283+ '/x/y/z/d' : default
284+ }
285+
286+ for path , expected_value in iter (path_to_expected_value .items ()):
287+ self .assertEqual (resolve_pointer (doc , path , default ), expected_value )
288+
289+ def test_mock_dict_raises_key_error (self ):
290+ doc = self .mdict
291+ self .assertRaises (JsonPointerException , resolve_pointer , doc , '/foo' )
292+ self .assertRaises (JsonPointerException , resolve_pointer , doc , '/root/1/2/3/4' )
293+
294+
295+
252296suite = unittest .TestSuite ()
253297suite .addTest (unittest .makeSuite (SpecificationTests ))
254298suite .addTest (unittest .makeSuite (ComparisonTests ))
0 commit comments