68 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from unittest import TestCase
 | |
| 
 | |
| import simplejson as json
 | |
| 
 | |
| class JSONTestObject:
 | |
|     pass
 | |
| 
 | |
| 
 | |
| class RecursiveJSONEncoder(json.JSONEncoder):
 | |
|     recurse = False
 | |
|     def default(self, o):
 | |
|         if o is JSONTestObject:
 | |
|             if self.recurse:
 | |
|                 return [JSONTestObject]
 | |
|             else:
 | |
|                 return 'JSONTestObject'
 | |
|         return json.JSONEncoder.default(o)
 | |
| 
 | |
| 
 | |
| class TestRecursion(TestCase):
 | |
|     def test_listrecursion(self):
 | |
|         x = []
 | |
|         x.append(x)
 | |
|         try:
 | |
|             json.dumps(x)
 | |
|         except ValueError:
 | |
|             pass
 | |
|         else:
 | |
|             self.fail("didn't raise ValueError on list recursion")
 | |
|         x = []
 | |
|         y = [x]
 | |
|         x.append(y)
 | |
|         try:
 | |
|             json.dumps(x)
 | |
|         except ValueError:
 | |
|             pass
 | |
|         else:
 | |
|             self.fail("didn't raise ValueError on alternating list recursion")
 | |
|         y = []
 | |
|         x = [y, y]
 | |
|         # ensure that the marker is cleared
 | |
|         json.dumps(x)
 | |
| 
 | |
|     def test_dictrecursion(self):
 | |
|         x = {}
 | |
|         x["test"] = x
 | |
|         try:
 | |
|             json.dumps(x)
 | |
|         except ValueError:
 | |
|             pass
 | |
|         else:
 | |
|             self.fail("didn't raise ValueError on dict recursion")
 | |
|         x = {}
 | |
|         y = {"a": x, "b": x}
 | |
|         # ensure that the marker is cleared
 | |
|         json.dumps(x)
 | |
| 
 | |
|     def test_defaultrecursion(self):
 | |
|         enc = RecursiveJSONEncoder()
 | |
|         self.assertEquals(enc.encode(JSONTestObject), '"JSONTestObject"')
 | |
|         enc.recurse = True
 | |
|         try:
 | |
|             enc.encode(JSONTestObject)
 | |
|         except ValueError:
 | |
|             pass
 | |
|         else:
 | |
|             self.fail("didn't raise ValueError on default recursion")
 | 
