8817bb2e |
1 | from unittest import TestCase |
2 | |
3 | import simplejson as json |
4 | |
5 | class JSONTestObject: |
6 | pass |
7 | |
8 | |
9 | class 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 | |
20 | class 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 = {} |
8817bb2e |
54 | # ensure that the marker is cleared |
55 | json.dumps(x) |
56 | |
57 | def test_defaultrecursion(self): |
58 | enc = RecursiveJSONEncoder() |
59 | self.assertEquals(enc.encode(JSONTestObject), '"JSONTestObject"') |
60 | enc.recurse = True |
61 | try: |
62 | enc.encode(JSONTestObject) |
63 | except ValueError: |
64 | pass |
65 | else: |
66 | self.fail("didn't raise ValueError on default recursion") |