1 # ##### BEGIN GPL LICENSE BLOCK #####
3 # This program is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU General Public License
5 # as published by the Free Software Foundation; either version 2
6 # of the License, or (at your option) any later version.
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software Foundation,
15 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 # ##### END GPL LICENSE BLOCK #####
24 # farr - 1-dimensional array of float
25 # fdarr - dynamic 1-dimensional array of float
26 # fmarr - 3-dimensional ([3][4][5]) array of float
27 # fdmarr - dynamic 3-dimensional (ditto size) array of float
29 # same as above for other types except that the first letter is "i" for int and "b" for bool
31 class TestArray(unittest.TestCase):
32 # test that assignment works by: assign -> test value
33 # - rvalue = list of float
34 # - rvalue = list of numbers
36 # bpy.data.test.farr[3], iarr[3], barr[...], fmarr, imarr, bmarr
39 test.farr= (1.0, 2.0, 3.0)
41 test.barr= (False, True, False)
44 # test slice access, negative indices
45 def test_access(self):
46 rvals= ([1.0, 2.0, 3.0], [7, 8, 9], [False, True, False])
47 for arr, rval in zip((test.farr, test.iarr, test.barr), rvals):
48 self.assertEqual(prop_to_list(arr), rval)
49 self.assertEqual(arr[0:3], rval)
50 self.assertEqual(arr[1:2], rval[1:2])
51 self.assertEqual(arr[-1], arr[2])
52 self.assertEqual(arr[-2], arr[1])
53 self.assertEqual(arr[-3], arr[0])
55 # fail when index out of bounds
56 def test_access_fail(self):
57 for arr in (test.farr, test.iarr, test.barr):
58 self.assertRaises(IndexError, lambda : arr[4])
60 # test assignment of a whole array
61 def test_assign_array(self):
62 # should accept int as float
65 # fail when: unexpected no. of items, invalid item type
66 def test_assign_array_fail(self):
67 def assign_empty_list(arr):
68 setattr(test, arr, ())
70 for arr in ("farr", "iarr", "barr"):
71 self.assertRaises(ValueError, assign_empty_list, arr)
73 def assign_invalid_float():
74 test.farr= (1.0, 2.0, "3.0")
76 def assign_invalid_int():
77 test.iarr= ("1", 2, 3)
79 def assign_invalid_bool():
80 test.barr= (True, 0.123, False)
82 for func in [assign_invalid_float, assign_invalid_int, assign_invalid_bool]:
83 self.assertRaises(TypeError, func)
85 # shouldn't accept float as int
86 def assign_float_as_int():
87 test.iarr= (1, 2, 3.0)
88 self.assertRaises(TypeError, assign_float_as_int)
90 # non-dynamic arrays cannot change size
91 def assign_different_size(arr, val):
92 setattr(test, arr, val)
93 for arr, val in zip(("iarr", "farr", "barr"), ((1, 2), (1.0, 2.0), (True, False))):
94 self.assertRaises(ValueError, assign_different_size, arr, val)
96 # test assignment of specific items
97 def test_assign_item(self):
98 for arr, rand_func in zip((test.farr, test.iarr, test.barr), (rand_float, rand_int, rand_bool)):
99 for i in range(len(arr)):
103 self.assertEqual(arr[i], val)
105 # float prop should accept also int
106 for i in range(len(test.farr)):
109 self.assertEqual(test.farr[i], float(val))
113 def test_assign_item_fail(self):
114 def assign_bad_index(arr):
117 def assign_bad_type(arr):
120 for arr in [test.farr, test.iarr, test.barr]:
121 self.assertRaises(IndexError, assign_bad_index, arr)
123 # not testing bool because bool allows not only (True|False)
124 for arr in [test.farr, test.iarr]:
125 self.assertRaises(TypeError, assign_bad_type, arr)
127 def test_dynamic_assign_array(self):
128 # test various lengths here
129 for arr, rand_func in zip(("fdarr", "idarr", "bdarr"), (rand_float, rand_int, rand_bool)):
130 for length in range(1, 64):
131 rval= make_random_array(length, rand_func)
132 setattr(test, arr, rval)
133 self.assertEqual(prop_to_list(getattr(test, arr)), rval)
135 def test_dynamic_assign_array_fail(self):
136 # could also test too big length here
138 def assign_empty_list(arr):
139 setattr(test, arr, ())
141 for arr in ("fdarr", "idarr", "bdarr"):
142 self.assertRaises(ValueError, assign_empty_list, arr)
145 class TestMArray(unittest.TestCase):
147 # reset dynamic array sizes
148 for arr, func in zip(("fdmarr", "idmarr", "bdmarr"), (rand_float, rand_int, rand_bool)):
149 setattr(test, arr, make_random_3d_array((3, 4, 5), func))
152 def test_assign_array(self):
153 for arr, func in zip(("fmarr", "imarr", "bmarr"), (rand_float, rand_int, rand_bool)):
154 # assignment of [3][4][5]
155 rval= make_random_3d_array((3, 4, 5), func)
156 setattr(test, arr, rval)
157 self.assertEqual(prop_to_list(getattr(test, arr)), rval)
159 # test assignment of [2][4][5], [1][4][5] should work on dynamic arrays
161 def test_assign_array_fail(self):
162 def assign_empty_array():
164 self.assertRaises(ValueError, assign_empty_array)
166 def assign_invalid_size(arr, rval):
167 setattr(test, arr, rval)
169 # assignment of 3,4,4 or 3,3,5 should raise ex
170 for arr, func in zip(("fmarr", "imarr", "bmarr"), (rand_float, rand_int, rand_bool)):
171 rval= make_random_3d_array((3, 4, 4), func)
172 self.assertRaises(ValueError, assign_invalid_size, arr, rval)
174 rval= make_random_3d_array((3, 3, 5), func)
175 self.assertRaises(ValueError, assign_invalid_size, arr, rval)
177 rval= make_random_3d_array((3, 3, 3), func)
178 self.assertRaises(ValueError, assign_invalid_size, arr, rval)
180 def test_assign_item(self):
182 for arr, func in zip(("fmarr", "imarr", "bmarr", "fdmarr", "idmarr", "bdmarr"), (rand_float, rand_int, rand_bool) * 2):
183 rval= make_random_2d_array((4, 5), func)
186 getattr(test, arr)[i] = rval
187 self.assertEqual(prop_to_list(getattr(test, arr)[i]), rval)
190 for arr, func in zip(("fmarr", "imarr", "bmarr", "fdmarr", "idmarr", "bdmarr"), (rand_float, rand_int, rand_bool) * 2):
192 arr= getattr(test, arr)
193 rval= make_random_array(5, func)
198 self.assertEqual(prop_to_list(arr[i][j]), rval)
201 def test_assign_item_fail(self):
202 def assign_wrong_size(arr, i, rval):
203 getattr(test, arr)[i] = rval
205 # assign wrong size at level 2
206 for arr, func in zip(("fmarr", "imarr", "bmarr"), (rand_float, rand_int, rand_bool)):
207 rval1= make_random_2d_array((3, 5), func)
208 rval2= make_random_2d_array((4, 3), func)
211 self.assertRaises(ValueError, assign_wrong_size, arr, i, rval1)
212 self.assertRaises(ValueError, assign_wrong_size, arr, i, rval2)
214 def test_dynamic_assign_array(self):
215 for arr, func in zip(("fdmarr", "idmarr", "bdmarr"), (rand_float, rand_int, rand_bool)):
216 # assignment of [3][4][5]
217 rval= make_random_3d_array((3, 4, 5), func)
218 setattr(test, arr, rval)
219 self.assertEqual(prop_to_list(getattr(test, arr)), rval)
222 rval= make_random_3d_array((2, 4, 5), func)
223 setattr(test, arr, rval)
224 self.assertEqual(prop_to_list(getattr(test, arr)), rval)
227 rval= make_random_3d_array((1, 4, 5), func)
228 setattr(test, arr, rval)
229 self.assertEqual(prop_to_list(getattr(test, arr)), rval)
233 def test_access(self):
236 # test slice access, negative indices
237 def test_access_fail(self):
243 return random.randint(-1000, 1000)
246 return float(rand_int())
249 return bool(random.randint(0, 1))
251 def make_random_array(len, rand_func):
254 arr.append(rand_func())
258 def make_random_2d_array(dimsize, rand_func):
260 for i in range(dimsize[0]):
263 for j in range(dimsize[1]):
264 marr[-1].append(rand_func())
268 def make_random_3d_array(dimsize, rand_func):
270 for i in range(dimsize[0]):
273 for j in range(dimsize[1]):
276 for k in range(dimsize[2]):
277 marr[-1][-1].append(rand_func())
281 def prop_to_list(prop):
285 if type(x) not in (bool, int, float):
286 ret.append(prop_to_list(x))
293 return unittest.TestSuite([unittest.TestLoader().loadTestsFromTestCase(TestArray), unittest.TestLoader().loadTestsFromTestCase(TestMArray)])
295 if __name__ == "__main__":
296 unittest.TextTestRunner(verbosity=2).run(suite())