PageRenderTime 20ms CodeModel.GetById 15ms app.highlight 3ms RepoModel.GetById 1ms app.codeStats 0ms

/Lib/json/tests/test_recursion.py

http://unladen-swallow.googlecode.com/
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")