test_recursion.py 1.6 KB

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