• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #[macro_use]
2 mod support;
3 
4 macro_rules! impl_mat2_tests {
5     ($t:ident, $newmat2:ident, $mat2:ident, $mat3:ident, $newvec2:ident, $vec2:ident) => {
6         const IDENTITY: [[$t; 2]; 2] = [[1.0, 0.0], [0.0, 1.0]];
7 
8         const MATRIX: [[$t; 2]; 2] = [[1.0, 2.0], [3.0, 4.0]];
9 
10         const MATRIX1D: [$t; 4] = [1.0, 2.0, 3.0, 4.0];
11 
12         glam_test!(test_const, {
13             const M0: $mat2 = $mat2::from_cols($newvec2(1.0, 2.0), $newvec2(3.0, 4.0));
14             const M1: $mat2 = $mat2::from_cols_array(&MATRIX1D);
15             const M2: $mat2 = $mat2::from_cols_array_2d(&MATRIX);
16 
17             assert_eq!(MATRIX1D, M0.to_cols_array());
18             assert_eq!(MATRIX1D, M1.to_cols_array());
19             assert_eq!(MATRIX1D, M2.to_cols_array());
20         });
21 
22         glam_test!(test_mat2_identity, {
23             assert_eq!($mat2::IDENTITY, $mat2::from_cols_array(&[1., 0., 0., 1.]));
24             let identity = $mat2::IDENTITY;
25             assert_eq!(IDENTITY, identity.to_cols_array_2d());
26             assert_eq!($mat2::from_cols_array_2d(&IDENTITY), identity);
27             assert_eq!(identity, identity * identity);
28             assert_eq!(identity, $mat2::default());
29             assert_eq!(identity, $mat2::from_diagonal($vec2::ONE));
30         });
31 
32         glam_test!(test_mat2_zero, {
33             assert_eq!($mat2::ZERO, $mat2::from_cols_array(&[0., 0., 0., 0.]));
34         });
35 
36         glam_test!(test_mat2_nan, {
37             assert!($mat2::NAN.is_nan());
38             assert!(!$mat2::NAN.is_finite());
39         });
40 
41         glam_test!(test_mat2_accessors, {
42             let mut m = $mat2::ZERO;
43             m.x_axis = $vec2::new(1.0, 2.0);
44             m.y_axis = $vec2::new(3.0, 4.0);
45             assert_eq!($mat2::from_cols_array_2d(&MATRIX), m);
46             assert_eq!($vec2::new(1.0, 2.0), m.x_axis);
47             assert_eq!($vec2::new(3.0, 4.0), m.y_axis);
48 
49             assert_eq!($vec2::new(1.0, 2.0), m.col(0));
50             assert_eq!($vec2::new(3.0, 4.0), m.col(1));
51 
52             assert_eq!($newvec2(1.0, 3.0), m.row(0));
53             assert_eq!($newvec2(2.0, 4.0), m.row(1));
54 
55             *m.col_mut(0) = m.col(0).yx();
56             *m.col_mut(1) = m.col(1).yx();
57             assert_eq!($vec2::new(2.0, 1.0), m.col(0));
58             assert_eq!($vec2::new(4.0, 3.0), m.col(1));
59 
60             should_panic!({ $mat2::ZERO.col(2) });
61             should_panic!({
62                 let mut m = $mat2::ZERO;
63                 m.col_mut(2);
64             });
65             should_panic!({ $mat2::ZERO.row(2) });
66         });
67 
68         glam_test!(test_mat2_from_axes, {
69             let a = $mat2::from_cols_array_2d(&[[1.0, 2.0], [3.0, 4.0]]);
70             assert_eq!(MATRIX, a.to_cols_array_2d());
71             let b = $mat2::from_cols($newvec2(1.0, 2.0), $newvec2(3.0, 4.0));
72             assert_eq!(a, b);
73             let c = $newmat2($newvec2(1.0, 2.0), $newvec2(3.0, 4.0));
74             assert_eq!(a, c);
75             let d = b.to_cols_array();
76             let f = $mat2::from_cols_array(&d);
77             assert_eq!(b, f);
78         });
79 
80         glam_test!(test_mat2_mul, {
81             let mat_a = $mat2::from_angle(deg(90.0));
82             let res_a = mat_a * $vec2::Y;
83             assert_approx_eq!($newvec2(-1.0, 0.0), res_a);
84             let res_b = mat_a * $vec2::X;
85             assert_approx_eq!($newvec2(0.0, 1.0), res_b);
86         });
87 
88         glam_test!(test_from_scale_angle, {
89             let rot = $mat2::from_scale_angle($vec2::new(4.0, 2.0), deg(180.0));
90             assert_approx_eq!($vec2::X * -4.0, rot * $vec2::X, 1.0e-6);
91             assert_approx_eq!($vec2::Y * -2.0, rot * $vec2::Y, 1.0e-6);
92         });
93 
94         glam_test!(test_from_diagonal, {
95             let m = $mat2::from_diagonal($vec2::new(2 as $t, 4 as $t));
96             assert_eq!(
97                 $mat2::from_cols_array_2d(&[[2 as $t, 0 as $t], [0 as $t, 4 as $t]]),
98                 m
99             );
100             assert_approx_eq!(m * $vec2::new(1.0, 1.0), $vec2::new(2.0, 4.0));
101             assert_approx_eq!($vec2::X * 2.0, m.x_axis);
102             assert_approx_eq!($vec2::Y * 4.0, m.y_axis);
103         });
104 
105         glam_test!(test_from_mat3, {
106             let m3 =
107                 $mat3::from_cols_array_2d(&[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]);
108             let m2 = $mat2::from_mat3(m3);
109             assert_eq!($mat2::from_cols_array_2d(&[[1.0, 2.0], [4.0, 5.0]]), m2);
110         });
111 
112         glam_test!(test_mat2_transpose, {
113             let m = $newmat2($newvec2(1.0, 2.0), $newvec2(3.0, 4.0));
114             let mt = m.transpose();
115             assert_eq!($newvec2(1.0, 3.0), mt.x_axis);
116             assert_eq!($newvec2(2.0, 4.0), mt.y_axis);
117         });
118 
119         glam_test!(test_mat2_det, {
120             assert_eq!(0.0, $mat2::ZERO.determinant());
121             assert_eq!(1.0, $mat2::IDENTITY.determinant());
122             assert_eq!(1.0, $mat2::from_angle(deg(90.0)).determinant());
123             assert_eq!(1.0, $mat2::from_angle(deg(180.0)).determinant());
124             assert_eq!(1.0, $mat2::from_angle(deg(270.0)).determinant());
125             assert_eq!(
126                 2.0 * 2.0,
127                 $mat2::from_diagonal($newvec2(2.0, 2.0)).determinant()
128             );
129             assert_eq!(
130                 1.0 * 4.0 - 2.0 * 3.0,
131                 $mat2::from_cols_array(&[1.0, 2.0, 3.0, 4.0]).determinant()
132             );
133         });
134 
135         glam_test!(test_mat2_inverse, {
136             let inv = $mat2::IDENTITY.inverse();
137             assert_approx_eq!($mat2::IDENTITY, inv);
138 
139             let rot = $mat2::from_angle(deg(90.0));
140             let rot_inv = rot.inverse();
141             assert_approx_eq!($mat2::IDENTITY, rot * rot_inv);
142             assert_approx_eq!($mat2::IDENTITY, rot_inv * rot);
143 
144             let scale = $mat2::from_diagonal($newvec2(4.0, 5.0));
145             let scale_inv = scale.inverse();
146             assert_approx_eq!($mat2::IDENTITY, scale * scale_inv);
147             assert_approx_eq!($mat2::IDENTITY, scale_inv * scale);
148 
149             let m = scale * rot;
150             let m_inv = m.inverse();
151             assert_approx_eq!($mat2::IDENTITY, m * m_inv);
152             assert_approx_eq!($mat2::IDENTITY, m_inv * m);
153             assert_approx_eq!(m_inv, rot_inv * scale_inv);
154 
155             should_glam_assert!({ $mat2::ZERO.inverse() });
156         });
157 
158         glam_test!(test_mat2_ops, {
159             let m0 = $mat2::from_cols_array_2d(&MATRIX);
160             let m0x2 = $mat2::from_cols_array_2d(&[[2.0, 4.0], [6.0, 8.0]]);
161             let m0_neg = $mat2::from_cols_array_2d(&[[-1.0, -2.0], [-3.0, -4.0]]);
162             assert_eq!(m0x2, m0 * 2.0);
163             assert_eq!(m0x2, 2.0 * m0);
164             assert_eq!(m0x2, m0 + m0);
165             assert_eq!($mat2::ZERO, m0 - m0);
166             assert_eq!(m0_neg, -m0);
167             assert_approx_eq!(m0, m0 * $mat2::IDENTITY);
168             assert_approx_eq!(m0, $mat2::IDENTITY * m0);
169 
170             let mut m1 = m0;
171             m1 *= 2.0;
172             assert_eq!(m0x2, m1);
173 
174             let mut m1 = m0;
175             m1 += m0;
176             assert_eq!(m0x2, m1);
177 
178             let mut m1 = m0;
179             m1 -= m0;
180             assert_eq!($mat2::ZERO, m1);
181 
182             let mut m1 = $mat2::IDENTITY;
183             m1 *= m0;
184             assert_approx_eq!(m0, m1);
185         });
186 
187         glam_test!(test_mat2_fmt, {
188             let a = $mat2::from_cols_array_2d(&MATRIX);
189             assert_eq!(format!("{}", a), "[[1, 2], [3, 4]]");
190         });
191 
192         glam_test!(test_mat2_to_from_slice, {
193             let m = $mat2::from_cols_slice(&MATRIX1D);
194             assert_eq!($mat2::from_cols_array(&MATRIX1D), m);
195             let mut out: [$t; 4] = Default::default();
196             m.write_cols_to_slice(&mut out);
197             assert_eq!(MATRIX1D, out);
198 
199             should_panic!({ $mat2::from_cols_slice(&[0.0; 3]) });
200             should_panic!({ $mat2::IDENTITY.write_cols_to_slice(&mut [0.0; 3]) });
201         });
202 
203         glam_test!(test_sum, {
204             let id = $mat2::IDENTITY;
205             assert_eq!([id, id].iter().sum::<$mat2>(), id + id);
206             assert_eq!([id, id].into_iter().sum::<$mat2>(), id + id);
207         });
208 
209         glam_test!(test_product, {
210             let two = $mat2::IDENTITY + $mat2::IDENTITY;
211             assert_eq!([two, two].iter().product::<$mat2>(), two * two);
212             assert_eq!([two, two].into_iter().product::<$mat2>(), two * two);
213         });
214 
215         glam_test!(test_mat2_is_finite, {
216             use std::$t::INFINITY;
217             use std::$t::NAN;
218             use std::$t::NEG_INFINITY;
219             assert!($mat2::IDENTITY.is_finite());
220             assert!(!($mat2::IDENTITY * INFINITY).is_finite());
221             assert!(!($mat2::IDENTITY * NEG_INFINITY).is_finite());
222             assert!(!($mat2::IDENTITY * NAN).is_finite());
223         });
224     };
225 }
226 
227 macro_rules! impl_as_ref_tests {
228     ($mat:ident) => {
229         glam_test!(test_as_ref, {
230             let m = $mat::from_cols_array_2d(&MATRIX);
231             assert_eq!(MATRIX1D, *m.as_ref());
232         });
233         glam_test!(test_as_mut, {
234             let mut m = $mat::ZERO;
235             *m.as_mut() = MATRIX1D;
236             assert_eq!($mat::from_cols_array_2d(&MATRIX), m);
237         });
238     };
239 }
240 
241 mod mat2 {
242     use super::support::deg;
243     use glam::{mat2, swizzles::*, vec2, Mat2, Mat3, Vec2};
244 
245     glam_test!(test_align, {
246         use std::mem;
247         assert_eq!(16, mem::size_of::<Mat2>());
248         if cfg!(feature = "scalar-math") {
249             assert_eq!(mem::align_of::<Vec2>(), mem::align_of::<Mat2>());
250         } else {
251             assert_eq!(16, mem::align_of::<Mat2>());
252         }
253     });
254 
255     glam_test!(test_from_mat3a, {
256         use glam::Mat3A;
257         let m3 = Mat3A::from_cols_array_2d(&[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]);
258         let m2 = Mat2::from_mat3a(m3);
259         assert_eq!(Mat2::from_cols_array_2d(&[[1.0, 2.0], [4.0, 5.0]]), m2);
260     });
261 
262     glam_test!(test_as, {
263         use glam::DMat2;
264         assert_eq!(
265             DMat2::from_cols_array(&[1.0, 2.0, 3.0, 4.0]),
266             Mat2::from_cols_array(&[1.0, 2.0, 3.0, 4.0]).as_dmat2()
267         );
268         assert_eq!(
269             Mat2::from_cols_array(&[1.0, 2.0, 3.0, 4.0]),
270             DMat2::from_cols_array(&[1.0, 2.0, 3.0, 4.0]).as_mat2()
271         );
272     });
273 
274     impl_mat2_tests!(f32, mat2, Mat2, Mat3, vec2, Vec2);
275     impl_as_ref_tests!(Mat2);
276 }
277 
278 mod dmat2 {
279     use super::support::deg;
280     use glam::{dmat2, dvec2, swizzles::*, DMat2, DMat3, DVec2};
281 
282     glam_test!(test_align, {
283         use std::mem;
284         assert_eq!(32, mem::size_of::<DMat2>());
285         assert_eq!(mem::align_of::<DVec2>(), mem::align_of::<DMat2>());
286     });
287 
288     impl_mat2_tests!(f64, dmat2, DMat2, DMat3, dvec2, DVec2);
289     impl_as_ref_tests!(DMat2);
290 }
291