1# Copyright (C) 2008 John Paulett (john -at- paulett.org)
2# Copyright (C) 2009-2018 David Aguilar (davvid -at- gmail.com)
3# All rights reserved.
4#
5# This software is licensed as described in the file COPYING, which
6# you should have received as part of this distribution.
7
8from __future__ import absolute_import, division, unicode_literals
9import unittest
10import doctest
11import time
12
13from jsonpickle import compat
14from jsonpickle import util
15
16
17class Thing(object):
18    def __init__(self, name):
19        self.name = name
20        self.child = None
21
22
23class DictSubclass(dict):
24    pass
25
26
27class ListSubclass(list):
28    pass
29
30
31class MethodTestClass(object):
32    @staticmethod
33    def static_method():
34        pass
35
36    @classmethod
37    def class_method(cls):
38        pass
39
40    def bound_method(self):
41        pass
42
43    variable = None
44
45
46class MethodTestSubclass(MethodTestClass):
47    pass
48
49
50class MethodTestOldStyle:
51    def bound_method(self):
52        pass
53
54
55class UtilTestCase(unittest.TestCase):
56    @unittest.skipIf(not compat.PY2, 'Python 2-specific Base85 test')
57    def test_b85encode_crashes_on_python2(self):
58        with self.assertRaises(NotImplementedError):
59            util.b85encode(b'')
60
61    @unittest.skipIf(not compat.PY2, 'Python 2-specific Base85 test')
62    def test_b85decode_crashes_on_python2(self):
63        with self.assertRaises(NotImplementedError):
64            util.b85decode(u'RC2?pb0AN3baKO~')
65
66    def test_is_primitive_int(self):
67        self.assertTrue(util.is_primitive(0))
68        self.assertTrue(util.is_primitive(3))
69        self.assertTrue(util.is_primitive(-3))
70
71    def test_is_primitive_float(self):
72        self.assertTrue(util.is_primitive(0))
73        self.assertTrue(util.is_primitive(3.5))
74        self.assertTrue(util.is_primitive(-3.5))
75        self.assertTrue(util.is_primitive(float(3)))
76
77    def test_is_primitive_long(self):
78        self.assertTrue(util.is_primitive(2 ** 64))
79
80    def test_is_primitive_bool(self):
81        self.assertTrue(util.is_primitive(True))
82        self.assertTrue(util.is_primitive(False))
83
84    def test_is_primitive_None(self):
85        self.assertTrue(util.is_primitive(None))
86
87    def test_is_primitive_bytes(self):
88        self.assertFalse(util.is_primitive(b'hello'))
89        self.assertFalse(util.is_primitive('foo'.encode('utf-8')))
90        self.assertTrue(util.is_primitive('foo'))
91
92    def test_is_primitive_unicode(self):
93        self.assertTrue(util.is_primitive(compat.ustr('')))
94        self.assertTrue(util.is_primitive('hello'))
95
96    def test_is_primitive_list(self):
97        self.assertFalse(util.is_primitive([]))
98        self.assertFalse(util.is_primitive([4, 4]))
99
100    def test_is_primitive_dict(self):
101        self.assertFalse(util.is_primitive({'key': 'value'}))
102        self.assertFalse(util.is_primitive({}))
103
104    def test_is_primitive_tuple(self):
105        self.assertFalse(util.is_primitive((1, 3)))
106        self.assertFalse(util.is_primitive((1,)))
107
108    def test_is_primitive_set(self):
109        self.assertFalse(util.is_primitive({1, 3}))
110
111    def test_is_primitive_object(self):
112        self.assertFalse(util.is_primitive(Thing('test')))
113
114    def test_is_list_list(self):
115        self.assertTrue(util.is_list([1, 2]))
116
117    def test_is_list_set(self):
118        self.assertTrue(util.is_set({1, 2}))
119
120    def test_is_list_tuple(self):
121        self.assertTrue(util.is_tuple((1, 2)))
122
123    def test_is_list_dict(self):
124        self.assertFalse(util.is_list({'key': 'value'}))
125        self.assertFalse(util.is_set({'key': 'value'}))
126        self.assertFalse(util.is_tuple({'key': 'value'}))
127
128    def test_is_list_other(self):
129        self.assertFalse(util.is_list(1))
130        self.assertFalse(util.is_set(1))
131        self.assertFalse(util.is_tuple(1))
132
133    def test_is_sequence_various(self):
134        self.assertTrue(util.is_sequence([]))
135        self.assertTrue(util.is_sequence(tuple()))
136        self.assertTrue(util.is_sequence(set()))
137
138    def test_is_dictionary_dict(self):
139        self.assertTrue(util.is_dictionary({}))
140
141    def test_is_dicitonary_sequences(self):
142        self.assertFalse(util.is_dictionary([]))
143        self.assertFalse(util.is_dictionary(set()))
144
145    def test_is_dictionary_tuple(self):
146        self.assertFalse(util.is_dictionary(tuple()))
147
148    def test_is_dictionary_primitive(self):
149        self.assertFalse(util.is_dictionary(int()))
150        self.assertFalse(util.is_dictionary(None))
151        self.assertFalse(util.is_dictionary(str()))
152
153    def test_is_dictionary_subclass_dict(self):
154        self.assertFalse(util.is_dictionary_subclass({}))
155
156    def test_is_dictionary_subclass_subclass(self):
157        self.assertTrue(util.is_dictionary_subclass(DictSubclass()))
158
159    def test_is_sequence_subclass_subclass(self):
160        self.assertTrue(util.is_sequence_subclass(ListSubclass()))
161
162    def test_is_sequence_subclass_list(self):
163        self.assertFalse(util.is_sequence_subclass([]))
164
165    def test_is_noncomplex_time_struct(self):
166        t = time.struct_time('123456789')
167        self.assertTrue(util.is_noncomplex(t))
168
169    def test_is_noncomplex_other(self):
170        self.assertFalse(util.is_noncomplex('a'))
171
172    def test_is_function_builtins(self):
173        self.assertTrue(util.is_function(globals))
174
175    def test_is_function_lambda(self):
176        self.assertTrue(util.is_function(lambda: False))
177
178    def test_is_function_instance_method(self):
179        class Foo(object):
180            def method(self):
181                pass
182
183            @staticmethod
184            def staticmethod():
185                pass
186
187            @classmethod
188            def classmethod(cls):
189                pass
190
191        f = Foo()
192        self.assertTrue(util.is_function(f.method))
193        self.assertTrue(util.is_function(f.staticmethod))
194        self.assertTrue(util.is_function(f.classmethod))
195
196    def test_itemgetter(self):
197        expect = '0'
198        actual = util.itemgetter((0, 'zero'))
199        self.assertEqual(expect, actual)
200
201    def test_has_method(self):
202        instance = MethodTestClass()
203        x = 1
204        has_method = util.has_method
205
206        # no attribute
207        self.assertFalse(has_method(instance, 'foo'))
208
209        # builtin method type
210        self.assertFalse(has_method(int, '__getnewargs__'))
211        self.assertTrue(has_method(x, '__getnewargs__'))
212
213        # staticmethod
214        self.assertTrue(has_method(instance, 'static_method'))
215        self.assertTrue(has_method(MethodTestClass, 'static_method'))
216
217        # not a method
218        self.assertFalse(has_method(instance, 'variable'))
219        self.assertFalse(has_method(MethodTestClass, 'variable'))
220
221        # classmethod
222        self.assertTrue(has_method(instance, 'class_method'))
223        self.assertTrue(has_method(MethodTestClass, 'class_method'))
224
225        # bound method
226        self.assertTrue(has_method(instance, 'bound_method'))
227        self.assertFalse(has_method(MethodTestClass, 'bound_method'))
228
229        # subclass bound method
230        sub_instance = MethodTestSubclass()
231        self.assertTrue(has_method(sub_instance, 'bound_method'))
232        self.assertFalse(has_method(MethodTestSubclass, 'bound_method'))
233
234        # old style object
235        old_instance = MethodTestOldStyle()
236        self.assertTrue(has_method(old_instance, 'bound_method'))
237        self.assertFalse(has_method(MethodTestOldStyle, 'bound_method'))
238
239
240def suite():
241    suite = unittest.TestSuite()
242    suite.addTest(unittest.makeSuite(UtilTestCase))
243    suite.addTest(doctest.DocTestSuite(util))
244    return suite
245
246
247if __name__ == '__main__':
248    unittest.main(defaultTest='suite')
249