equal
deleted
inserted
replaced
|
1 from unittest import TestCase |
|
2 |
|
3 import 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 = {} |
|
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") |