1 # Apache License, Version 2.0
3 # ./blender.bin --background -noaudio --python tests/python/bl_pyapi_idprop.py -- --verbose
7 from array import array
17 self._id = bpy.context.scene
18 assert(len(self._id.keys()) == 0)
21 for key in list(self._id.keys()):
24 def assertAlmostEqualSeq(self, list1, list2):
25 self.assertEqual(len(list1), len(list2))
26 for v1, v2 in zip(list1, list2):
27 self.assertAlmostEqual(v1, v2, places=5)
30 class TestIdPropertyCreation(TestHelper, unittest.TestCase):
32 def test_name_empty(self):
34 self.assertEqual(self.id[""], 4)
36 def test_name_too_long(self):
37 with self.assertRaises(KeyError):
38 self.id["name" * 30] = 4
42 self.assertEqual(self.id["a"], 2)
43 self.assertTrue(isinstance(self.id["a"], int))
45 with self.assertRaises(OverflowError):
46 self.id["a"] = 2 ** 31 # integer <= 2 ** 31-1
48 def test_double(self):
50 self.assertEqual(self.id["a"], 2.5)
51 self.assertTrue(isinstance(self.id["a"], float))
53 def test_unicode(self):
54 self.id["a"] = "Hello World"
55 self.assertEqual(self.id["a"], "Hello World")
56 self.assertTrue(isinstance(self.id["a"], str))
59 self.id["a"] = b"Hello World"
60 self.assertEqual(self.id["a"], b"Hello World")
61 self.assertTrue(isinstance(self.id["a"], bytes))
63 def test_sequence_double_list(self):
64 mylist = [1.2, 3.4, 5.6]
66 self.assertEqual(self.id["a"].to_list(), mylist)
67 self.assertEqual(self.id["a"].typecode, "d")
69 def test_sequence_int_list(self):
72 self.assertEqual(self.id["a"].to_list(), mylist)
73 self.assertEqual(self.id["a"].typecode, "i")
75 def test_sequence_float_array(self):
76 mylist = [1.2, 3.4, 5.6]
77 self.id["a"] = array("f", mylist)
78 self.assertAlmostEqualSeq(self.id["a"].to_list(), mylist)
79 self.assertEqual(self.id["a"].typecode, "f")
81 def test_sequence_double_array(self):
82 mylist = [1.2, 3.4, 5.6]
83 self.id["a"] = array("d", mylist)
84 self.assertAlmostEqualSeq(self.id["a"].to_list(), mylist)
85 self.assertEqual(self.id["a"].typecode, "d")
87 def test_sequence_int_array(self):
89 self.id["a"] = array("i", mylist)
90 self.assertAlmostEqualSeq(self.id["a"].to_list(), mylist)
91 self.assertEqual(self.id["a"].typecode, "i")
93 def test_sequence_other_array(self):
95 self.id["a"] = array("Q", mylist)
96 self.assertEqual(self.id["a"].to_list(), mylist)
98 def test_sequence_mixed_numerical_type(self):
99 self.id["a"] = [1, 2, 3.4, 5]
100 self.assertAlmostEqualSeq(self.id["a"].to_list(), [1.0, 2.0, 3.4, 5.0])
101 self.assertEqual(self.id["a"].typecode, "d")
103 def test_sequence_str_list(self):
104 # I'm a bit surprised that this works
105 mylist = ["abc", "qwe"]
106 self.id["a"] = mylist
107 self.assertEqual(self.id["a"], mylist)
109 def test_sequence_mixed_type(self):
110 with self.assertRaises(TypeError):
111 mylist = ["abc", 3, "qwe", 3.4]
112 self.id["a"] = mylist
114 def test_mapping_simple(self):
115 mydict = {"1": 10, "2": "20", "3": 30.5}
116 self.id["a"] = mydict
117 self.assertEqual(self.id["a"]["1"], mydict["1"])
118 self.assertEqual(self.id["a"]["2"], mydict["2"])
119 self.assertEqual(self.id["a"]["3"], mydict["3"])
121 def test_mapping_complex(self):
124 "2": {"1": "abc", "2": array("i", [4, 5, 6])},
125 "3": {"1": {"1": 10}, "2": b"qwe"},
127 self.id["a"] = mydict
128 self.assertEqual(self.id["a"]["1"].to_list(), [1, 2, 3])
129 self.assertEqual(self.id["a"]["2"]["1"], "abc")
130 self.assertEqual(self.id["a"]["2"]["2"].to_list(), [4, 5, 6])
131 self.assertEqual(self.id["a"]["3"]["1"]["1"], 10)
132 self.assertEqual(self.id["a"]["3"]["2"], b"qwe")
134 with self.assertRaises(KeyError):
135 a = self.id["a"]["2"]["a"]
137 def test_invalid_type(self):
138 with self.assertRaises(TypeError):
142 class TestBufferProtocol(TestHelper, unittest.TestCase):
145 self.id["a"] = array("i", [1, 2, 3, 4, 5])
146 a = np.frombuffer(self.id["a"], self.id["a"].typecode)
147 self.assertEqual(len(a), 5)
149 self.assertEqual(self.id["a"].to_list(), [1, 2, 10, 4, 5])
151 def test_float(self):
152 self.id["a"] = array("f", [1.0, 2.0, 3.0, 4.0])
153 a = np.frombuffer(self.id["a"], self.id["a"].typecode)
154 self.assertEqual(len(a), 4)
156 self.assertEqual(self.id["a"].to_list(), [1.0, 2.0, 3.0, 10.0])
158 def test_double(self):
159 self.id["a"] = array("d", [1.0, 2.0, 3.0, 4.0])
160 a = np.frombuffer(self.id["a"], self.id["a"].typecode)
162 self.assertEqual(self.id["a"].to_list(), [1.0, 10.0, 3.0, 4.0])
164 def test_full_update(self):
165 self.id["a"] = array("i", [1, 2, 3, 4, 5, 6])
166 a = np.frombuffer(self.id["a"], self.id["a"].typecode)
167 a[:] = [10, 20, 30, 40, 50, 60]
168 self.assertEqual(self.id["a"].to_list(), [10, 20, 30, 40, 50, 60])
170 def test_partial_update(self):
171 self.id["a"] = array("i", [1, 2, 3, 4, 5, 6, 7, 8])
172 a = np.frombuffer(self.id["a"], self.id["a"].typecode)
173 a[1:5] = [10, 20, 30, 40]
174 self.assertEqual(self.id["a"].to_list(), [1, 10, 20, 30, 40, 6, 7, 8])
177 self.id["a"] = array("i", [1, 2, 3, 4, 5])
178 self.id["b"] = self.id["a"]
179 self.assertEqual(self.id["a"].to_list(), self.id["b"].to_list())
181 def test_memview_attributes(self):
183 self.id["a"] = mylist
185 view1 = memoryview(self.id["a"])
186 view2 = memoryview(array("i", mylist))
188 self.assertEqualMemviews(view1, view2)
190 def assertEqualMemviews(self, view1, view2):
192 "contiguous", "format", "itemsize", "nbytes", "ndim",
193 "readonly", "shape", "strides", "suboffsets"
195 for attr in props_to_compare:
196 self.assertEqual(getattr(view1, attr), getattr(view2, attr))
198 self.assertEqual(list(view1), list(view2))
199 self.assertEqual(view1.tobytes(), view2.tobytes())
201 if __name__ == '__main__':
203 sys.argv = [__file__] + (sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else [])