svn merge ^/trunk/blender -r42742:42757
[blender.git] / source / tests / bl_pyapi_mathutils.py
1 import unittest
2 from test import support
3 from mathutils import Matrix, Vector
4
5
6 class MatrixTesting(unittest.TestCase):
7     def test_matrix_column_access(self):
8         #mat =
9         #[ 1  2  3  4 ]
10         #[ 1  2  3  4 ]
11         #[ 1  2  3  4 ]
12         mat = Matrix(((1, 11, 111),
13                       (2, 22, 222),
14                       (3, 33, 333),
15                       (4, 44, 444)))
16
17         self.assertEqual(mat[0], Vector((1, 11, 111)))
18         self.assertEqual(mat[1], Vector((2, 22, 222)))
19         self.assertEqual(mat[2], Vector((3, 33, 333)))
20         self.assertEqual(mat[3], Vector((4, 44, 444)))
21
22     def test_item_access(self):
23         args = ((1, 4, 0, -1),
24                 (2, -1, 2, -2),
25                 (0, 3, 8, 3),
26                 (-2, 9, 1, 0))
27
28         mat = Matrix(args)
29
30         for i in range(4):
31             for j in range(4):
32                 self.assertEqual(mat[i][j], args[i][j])
33
34         self.assertEqual(mat[0][2], 0)
35         self.assertEqual(mat[3][1], 9)
36         self.assertEqual(mat[2][3], 3)
37         self.assertEqual(mat[0][0], 1)
38         self.assertEqual(mat[3][3], 0)
39
40     def test_item_assignment(self):
41         mat = Matrix() - Matrix()
42         indices = (0, 0), (1, 3), (2, 0), (3, 2), (3, 1)
43         checked_indices = []
44         for col, row in indices:
45             mat[col][row] = 1
46
47         for col in range(4):
48             for row in range(4):
49                 if mat[col][row]:
50                     checked_indices.append((col, row))
51
52         for item in checked_indices:
53             self.assertIn(item, indices)
54
55     def test_matrix_to_3x3(self):
56         #mat =
57         #[ 1  2  3  4  ]
58         #[ 2  4  6  8  ]
59         #[ 3  6  9  12 ]
60         #[ 4  8  12 16 ]
61         mat = Matrix(tuple((i, 2 * i, 3 * i, 4 * i) for i in range(1, 5)))
62         mat_correct = Matrix(((1, 2, 3), (2, 4, 6), (3, 6, 9)))
63         self.assertEqual(mat.to_3x3(), mat_correct)
64
65     def test_matrix_to_translation(self):
66         mat = Matrix()
67         mat[3] = (1, 2, 3, 4)
68         self.assertEqual(mat.to_translation(), Vector((1, 2, 3)))
69
70     def test_matrix_inverse(self):
71         mat = Matrix(((1, 4, 0, -1),
72                       (2, -1, 2, -2),
73                       (0, 3, 8, 3),
74                       (-2, 9, 1, 0)))
75
76         inv_mat = (1 / 285) * Matrix(((195, -57, 27, -102),
77                                       (50, -19, 4, 6),
78                                       (-60, 57, 18, 27),
79                                       (110, -133, 43, -78)))
80
81         self.assertEqual(mat.inverted(), inv_mat)
82
83     def test_matrix_mult(self):
84         mat = Matrix(((1, 4, 0, -1),
85                       (2, -1, 2, -2),
86                       (0, 3, 8, 3),
87                       (-2, 9, 1, 0)))
88
89         prod_mat = Matrix(((11, -9, 7, -9),
90                            (4, -3, 12, 6),
91                            (0, 48, 73, 18),
92                            (16, -14, 26, -13)))
93
94         self.assertEqual(mat * mat, prod_mat)
95
96
97 def test_main():
98     try:
99         support.run_unittest(MatrixTesting)
100     except:
101         import traceback
102         traceback.print_exc()
103
104         # alert CTest we failed
105         import sys
106         sys.exit(1)
107
108 if __name__ == '__main__':
109     test_main()