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