/Lib/json/tests/test_recursion.py
Python | 67 lines | 57 code | 8 blank | 2 comment | 2 complexity | ade789e1a6c952ca7a936e485599d3bd MD5 | raw file
1from unittest import TestCase 2 3import json 4 5class JSONTestObject: 6 pass 7 8 9class RecursiveJSONEncoder(json.JSONEncoder): 10 recurse = False 11 def default(self, o): 12 if o is JSONTestObject: 13 if self.recurse: 14 return [JSONTestObject] 15 else: 16 return 'JSONTestObject' 17 return json.JSONEncoder.default(o) 18 19 20class TestRecursion(TestCase): 21 def test_listrecursion(self): 22 x = [] 23 x.append(x) 24 try: 25 json.dumps(x) 26 except ValueError: 27 pass 28 else: 29 self.fail("didn't raise ValueError on list recursion") 30 x = [] 31 y = [x] 32 x.append(y) 33 try: 34 json.dumps(x) 35 except ValueError: 36 pass 37 else: 38 self.fail("didn't raise ValueError on alternating list recursion") 39 y = [] 40 x = [y, y] 41 # ensure that the marker is cleared 42 json.dumps(x) 43 44 def test_dictrecursion(self): 45 x = {} 46 x["test"] = x 47 try: 48 json.dumps(x) 49 except ValueError: 50 pass 51 else: 52 self.fail("didn't raise ValueError on dict recursion") 53 x = {} 54 y = {"a": x, "b": x} 55 # ensure that the marker is cleared 56 json.dumps(x) 57 58 def test_defaultrecursion(self): 59 enc = RecursiveJSONEncoder() 60 self.assertEquals(enc.encode(JSONTestObject), '"JSONTestObject"') 61 enc.recurse = True 62 try: 63 enc.encode(JSONTestObject) 64 except ValueError: 65 pass 66 else: 67 self.fail("didn't raise ValueError on default recursion")