from unittest import TestCase | |
import hjson 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.dumpsJSON(x) | |
except ValueError: | |
pass | |
else: | |
self.fail("didn't raise ValueError on list recursion") | |
x = [] | |
y = [x] | |
x.append(y) | |
try: | |
json.dumpsJSON(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.dumpsJSON(x) | |
def test_dictrecursion(self): | |
x = {} | |
x["test"] = x | |
try: | |
json.dumpsJSON(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.dumpsJSON(y) | |
def test_defaultrecursion(self): | |
enc = RecursiveJSONEncoder() | |
self.assertEqual(enc.encode(JSONTestObject), '"JSONTestObject"') | |
enc.recurse = True | |
try: | |
enc.encode(JSONTestObject) | |
except ValueError: | |
pass | |
else: | |
self.fail("didn't raise ValueError on default recursion") | |