1    module matrix_test
2    
3    import matrix/rotate_y
4                  translate
5    
6    let are_similar (x : f32) (y : f32) = x / y - 1 |> abs < 0.001
7    
8    let are_similar (u : Vector4<f32>) (v : Vector4<f32>) =
9        are_similar u.x v.x && are_similar u.y v.y
10       && are_similar u.z v.z && are_similar u.w v.w
11   
12   do # times
13       let rotate_matrix = rotate_y (f32.pi / 2)
14       let translate_matrix = translate 5 6 7
15       let matrix = translate_matrix * rotate_matrix
16       let v = Vector4 1 2 3 1
17   
18       let result = matrix * v
19   
20       assert are_similar result (Vector4 8 8 6 1)
21   
22   do # times_order
23       let rotate_matrix = rotate_y (f32.pi / 2)
24       let translate_matrix = translate 5 6 7
25       let matrix = translate_matrix * rotate_matrix
26       let v = Vector4 1 2 3 1
27   
28       let rotate_result = rotate_matrix * v
29       let translate_result = translate_matrix * rotate_result
30       let result = matrix * v
31   
32       assert are_similar result translate_result
33   
34   do # inverse
35       let rotate_matrix = rotate_y (f32.pi / 2)
36       let translate_matrix = translate 5 6 7
37       let matrix = translate_matrix * rotate_matrix
38       let v = Vector4 1 2 3 1
39   
40       let forward = matrix * v
41       let backward = matrix.inverse * forward
42   
43       assert are_similar backward v
44   
45   endmodule
46