summaryrefslogtreecommitdiff
path: root/simplejson/tests/test_for_json.py
blob: 2906bdb1451768f545267a78099698370a805f2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import unittest
import simplejson as json


class ForJson(object):
    def for_json(self):
        return {'for_json': 1}


class NestedForJson(object):
    def for_json(self):
        return {'nested': ForJson()}


class ForJsonList(object):
    def for_json(self):
        return ['list']


class DictForJson(dict):
    def for_json(self):
        return {'alpha': 1}


class ListForJson(list):
    def for_json(self):
        return ['list']


class TestForJsonWithSpeedups(unittest.TestCase):
    def setUp(self):
        if not json.encoder.c_make_encoder:
            raise unittest.SkipTest("No speedups.")

    @staticmethod
    def _dump(obj):
        return json.dumps(obj, for_json=True)

    def test_for_json_encodes_stand_alone_object(self):
        self.assertEqual(self._dump(ForJson()), '{"for_json": 1}')

    def test_for_json_encodes_object_nested_in_dict(self):
        self.assertEqual(self._dump({'hooray': ForJson()}), '{"hooray": '
                '{"for_json": 1}}')

    def test_for_json_encodes_object_nested_in_list_within_dict(self):
        self.assertEqual(self._dump({'list': [0, ForJson(), 2, 3]}),
                '{"list": [0, {"for_json": 1}, 2, 3]}')

    def test_for_json_encodes_object_nested_within_object(self):
        self.assertEqual(self._dump(NestedForJson()),
                '{"nested": {"for_json": 1}}')

    def test_for_json_encodes_list(self):
        self.assertEqual(self._dump(ForJsonList()), '["list"]')

    def test_for_json_encodes_list_within_object(self):
        self.assertEqual(self._dump({'nested': ForJsonList()}),
                '{"nested": ["list"]}')

    def test_for_json_encodes_dict_subclass(self):
        self.assertEqual(self._dump(DictForJson(a=1)), '{"alpha": 1}')

    def test_for_json_encodes_list_subclass(self):
        self.assertEqual(self._dump(ListForJson(['l'])), '["list"]')

    def tset_for_json_ignored_if_not_true_with_dict_subclass(self):
        self.assertEqual(json.dumps(DictForJson(a=1)), '{"a": 1}')

    def test_for_json_ignored_if_not_true_with_list_subclass(self):
        self.assertEqual(json.dumps(ListForJson(['l'])), '["l"]')

    def test_raises_typeerror_if_for_json_not_true_with_object(self):
        self.assertRaises(TypeError, json.dumps, ForJson())


class TestForJsonWithoutSpeedups(unittest.TestCase):
    def setUp(self):
        if json.encoder.c_make_encoder:
            json._toggle_speedups(False)

    def tearDown(self):
        if json.encoder.c_make_encoder:
            json._toggle_speedups(True)

    @staticmethod
    def _dump(obj):
        return json.dumps(obj, for_json=True)

    def test_for_json_encodes_stand_alone_object(self):
        self.assertEqual(self._dump(ForJson()), '{"for_json": 1}')

    def test_for_json_encodes_object_nested_in_dict(self):
        self.assertEqual(self._dump({'hooray': ForJson()}), '{"hooray": '
                '{"for_json": 1}}')

    def test_for_json_encodes_object_nested_in_list_within_dict(self):
        self.assertEqual(self._dump({'list': [0, ForJson(), 2, 3]}),
                '{"list": [0, {"for_json": 1}, 2, 3]}')

    def test_for_json_encodes_object_nested_within_object(self):
        self.assertEqual(self._dump(NestedForJson()),
                '{"nested": {"for_json": 1}}')

    def test_for_json_encodes_list(self):
        self.assertEqual(self._dump(ForJsonList()), '["list"]')

    def test_for_json_encodes_list_within_object(self):
        self.assertEqual(self._dump({'nested': ForJsonList()}),
                '{"nested": ["list"]}')

    def test_for_json_encodes_dict_subclass(self):
        self.assertEqual(self._dump(DictForJson(a=1)), '{"alpha": 1}')

    def test_for_json_encodes_list_subclass(self):
        self.assertEqual(self._dump(ListForJson(['l'])), '["list"]')

    def tset_for_json_ignored_if_not_true_with_dict_subclass(self):
        self.assertEqual(json.dumps(DictForJson(a=1)), '{"a": 1}')

    def test_for_json_ignored_if_not_true_with_list_subclass(self):
        self.assertEqual(json.dumps(ListForJson(['l'])), '["l"]')

    def test_raises_typeerror_if_for_json_not_true_with_object(self):
        self.assertRaises(TypeError, json.dumps, ForJson())