Skip to content

Commit 854cfd2

Browse files
committed
Reorganize matrix tests
1 parent 6e1199a commit 854cfd2

File tree

1 file changed

+153
-130
lines changed

1 file changed

+153
-130
lines changed

core/src/math/mat.rs

Lines changed: 153 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ where
8585
/// The returned vector is in space `Map::Source`.
8686
///
8787
/// # Panics
88-
/// If `i >= N`.
88+
/// If `i >= M`.
8989
#[inline]
9090
pub fn row_vec(&self, i: usize) -> Vector<[Sc; N], Map::Source> {
9191
Vector::new(self.0[i])
@@ -650,46 +650,167 @@ mod tests {
650650
type Map<const N: usize = 3> = RealToReal<N, Basis1, Basis2>;
651651
type InvMap<const N: usize = 3> = RealToReal<N, Basis2, Basis1>;
652652

653-
#[test]
654-
fn matrix_debug() {
655-
let actual: Mat4x4<Map> = [
653+
mod mat3x3 {
654+
use super::*;
655+
656+
const MAT: Mat3x3<Map> = Matrix::new([
657+
[0.0, 1.0, 2.0], //
658+
[10.0, 11.0, 12.0],
659+
[20.0, 21.0, 22.0],
660+
]);
661+
662+
#[test]
663+
fn row_col_vecs() {
664+
assert_eq!(MAT.row_vec(2), vec3::<_, Basis1>(20.0, 21.0, 22.0));
665+
assert_eq!(MAT.col_vec(2), vec3::<_, Basis2>(2.0, 12.0, 22.0));
666+
}
667+
668+
#[test]
669+
fn composition() {
670+
let t = Mat3x3::<Map<2>>::new([
671+
[1.0, 0.0, 2.0], //
672+
[0.0, 1.0, -3.0],
673+
[0.0, 0.0, 1.0],
674+
]);
675+
let s = Mat3x3::<InvMap<2>>::new([
676+
[-1.0, 0.0, 0.0], //
677+
[0.0, 2.0, 0.0],
678+
[0.0, 0.0, 1.0],
679+
]);
680+
681+
let ts = t.then(&s);
682+
let st = s.then(&t);
683+
684+
assert_eq!(ts, s.compose(&t));
685+
assert_eq!(st, t.compose(&s));
686+
687+
assert_eq!(ts.apply(&splat(0.0)), vec2(-2.0, -6.0));
688+
assert_eq!(st.apply(&splat(0.0)), vec2(2.0, -3.0));
689+
}
690+
691+
#[test]
692+
fn scaling() {
693+
let m = Mat3x3::<Map<2>>::new([
694+
[2.0, 0.0, 0.0], //
695+
[0.0, -3.0, 0.0],
696+
[0.0, 0.0, 1.0],
697+
]);
698+
assert_eq!(m.apply(&vec2(1.0, 2.0)), vec2(2.0, -6.0));
699+
}
700+
701+
#[test]
702+
fn translation() {
703+
let m = Mat3x3::<Map<2>>::new([
704+
[1.0, 0.0, 2.0], //
705+
[0.0, 1.0, -3.0],
706+
[0.0, 0.0, 1.0],
707+
]);
708+
assert_eq!(m.apply(&vec2(1.0, 2.0)), vec2(3.0, -1.0));
709+
}
710+
711+
#[test]
712+
fn matrix_debug() {
713+
assert_eq!(
714+
alloc::format!("{MAT:?}"),
715+
r#"Matrix<Basis1→Basis2>[
716+
[ 0.00, 1.00, 2.00]
717+
[ 10.00, 11.00, 12.00]
718+
[ 20.00, 21.00, 22.00]
719+
]"#
720+
);
721+
}
722+
}
723+
724+
mod mat4x4 {
725+
use super::*;
726+
727+
const MAT: Mat4x4<Map> = Matrix::new([
656728
[0.0, 1.0, 2.0, 3.0],
657729
[10.0, 11.0, 12.0, 13.0],
658730
[20.0, 21.0, 22.0, 23.0],
659731
[30.0, 31.0, 32.0, 33.0],
660-
]
661-
.into();
732+
]);
733+
734+
#[test]
735+
fn row_col_vecs() {
736+
assert_eq!(MAT.row_vec(1), [10.0, 11.0, 12.0, 13.0].into());
737+
assert_eq!(MAT.col_vec(3), [3.0, 13.0, 23.0, 33.0].into());
738+
}
739+
740+
#[test]
741+
fn composition() {
742+
let t = translate(vec3(1.0, 2.0, 3.0)).to::<Map>();
743+
let s = scale(vec3(3.0, 2.0, 1.0)).to::<InvMap>();
662744

663-
let expected = r#"Matrix<Basis1→Basis2>[
745+
let ts = t.then(&s);
746+
let st = s.then(&t);
747+
748+
assert_eq!(ts, s.compose(&t));
749+
assert_eq!(st, t.compose(&s));
750+
751+
assert_eq!(ts.apply(&splat(0.0)), vec3::<_, Basis1>(3.0, 4.0, 3.0));
752+
assert_eq!(st.apply(&splat(0.0)), vec3::<_, Basis2>(1.0, 2.0, 3.0));
753+
}
754+
755+
#[test]
756+
fn scaling_vec3() {
757+
let m = scale(vec3(1.0, -2.0, 3.0));
758+
let v = vec3(0.0, 4.0, -3.0);
759+
assert_eq!(m.apply(&v), vec3(0.0, -8.0, -9.0));
760+
}
761+
762+
#[test]
763+
fn translation_vec3() {
764+
let m = translate(vec3(1.0, 2.0, 3.0));
765+
let v = vec3(0.0, 5.0, -3.0);
766+
assert_eq!(m.apply(&v), vec3(1.0, 7.0, 0.0));
767+
}
768+
769+
#[cfg(feature = "fp")]
770+
#[test]
771+
fn rotation_x() {
772+
let m = rotate_x(degs(90.0));
773+
assert_eq!(m.apply(&splat(0.0)), splat(0.0));
774+
assert_approx_eq!(
775+
m.apply(&vec3(0.0, 0.0, 1.0)),
776+
vec3(0.0, 1.0, 0.0)
777+
);
778+
}
779+
780+
#[cfg(feature = "fp")]
781+
#[test]
782+
fn rotation_y() {
783+
let m = rotate_y(degs(90.0));
784+
assert_eq!(m.apply(&splat(0.0)), splat(0.0));
785+
assert_approx_eq!(
786+
m.apply(&vec3(1.0, 0.0, 0.0)),
787+
vec3(0.0, 0.0, 1.0)
788+
);
789+
}
790+
791+
#[cfg(feature = "fp")]
792+
#[test]
793+
fn rotation_z() {
794+
let m = rotate_z(degs(90.0));
795+
assert_eq!(m.apply(&splat(0.0)), splat(0.0));
796+
assert_approx_eq!(
797+
m.apply(&vec3(0.0, 1.0, 0.0)),
798+
vec3(1.0, 0.0, 0.0)
799+
);
800+
}
801+
802+
#[test]
803+
fn matrix_debug() {
804+
assert_eq!(
805+
alloc::format!("{MAT:?}"),
806+
r#"Matrix<Basis1→Basis2>[
664807
[ 0.00, 1.00, 2.00, 3.00]
665808
[ 10.00, 11.00, 12.00, 13.00]
666809
[ 20.00, 21.00, 22.00, 23.00]
667810
[ 30.00, 31.00, 32.00, 33.00]
668-
]"#;
669-
670-
assert_eq!(alloc::format!("{actual:?}"), expected);
671-
}
672-
673-
#[test]
674-
fn row_vec() {
675-
let m: Mat3x3<Map> = [
676-
[0.0, 1.0, 2.0], //
677-
[10.0, 11.0, 12.0],
678-
[20.0, 21.0, 22.0],
679-
]
680-
.into();
681-
assert_eq!(m.row_vec(2), vec3::<_, Basis1>(20.0, 21.0, 22.0));
682-
}
683-
684-
#[test]
685-
fn col_vec() {
686-
let m: Mat3x3<Map> = [
687-
[0.0, 1.0, 2.0], //
688-
[10.0, 11.0, 12.0],
689-
[20.0, 21.0, 22.0],
690-
]
691-
.into();
692-
assert_eq!(m.col_vec(2), vec3::<_, Basis2>(2.0, 12.0, 22.0));
811+
]"#
812+
);
813+
}
693814
}
694815

695816
#[test]
@@ -709,104 +830,6 @@ mod tests {
709830
);
710831
}
711832

712-
#[test]
713-
fn scaling_vec2() {
714-
let m = Mat3x3::<Map<2>>::new([
715-
[2.0, 0.0, 0.0], //
716-
[0.0, -3.0, 0.0],
717-
[0.0, 0.0, 1.0],
718-
]);
719-
assert_eq!(m.apply(&vec2(1.0, 2.0)), vec2(2.0, -6.0));
720-
}
721-
722-
#[test]
723-
fn translation_vec2() {
724-
let m = Mat3x3::<Map<2>>::new([
725-
[1.0, 0.0, 2.0], //
726-
[0.0, 1.0, -3.0],
727-
[0.0, 0.0, 1.0],
728-
]);
729-
assert_eq!(m.apply(&vec2(1.0, 2.0)), vec2(3.0, -1.0));
730-
}
731-
732-
#[test]
733-
fn scaling_vec3() {
734-
let m = scale(vec3(1.0, -2.0, 3.0));
735-
let v = vec3(0.0, 4.0, -3.0);
736-
737-
assert_eq!(m.apply(&v), vec3(0.0, -8.0, -9.0));
738-
}
739-
740-
#[test]
741-
fn translation_vec3() {
742-
let m = translate(vec3(1.0, 2.0, 3.0));
743-
let v = vec3(0.0, 5.0, -3.0);
744-
745-
assert_eq!(m.apply(&v), vec3(1.0, 7.0, 0.0));
746-
}
747-
748-
#[cfg(feature = "fp")]
749-
#[test]
750-
fn rotation_x() {
751-
let m = rotate_x(degs(90.0));
752-
assert_eq!(m.apply(&splat(0.0)), splat(0.0));
753-
assert_approx_eq!(m.apply(&vec3(0.0, 0.0, 1.0)), vec3(0.0, 1.0, 0.0));
754-
}
755-
756-
#[cfg(feature = "fp")]
757-
#[test]
758-
fn rotation_y() {
759-
let m = rotate_y(degs(90.0));
760-
assert_eq!(m.apply(&splat(0.0)), splat(0.0));
761-
assert_approx_eq!(m.apply(&vec3(1.0, 0.0, 0.0)), vec3(0.0, 0.0, 1.0));
762-
}
763-
764-
#[cfg(feature = "fp")]
765-
#[test]
766-
fn rotation_z() {
767-
let m = rotate_z(degs(90.0));
768-
assert_eq!(m.apply(&splat(0.0)), splat(0.0));
769-
assert_approx_eq!(m.apply(&vec3(0.0, 1.0, 0.0)), vec3(1.0, 0.0, 0.0));
770-
}
771-
772-
#[test]
773-
fn composition_3x3() {
774-
let t = Mat3x3::<Map<2>>::new([
775-
[1.0, 0.0, 2.0], //
776-
[0.0, 1.0, -3.0],
777-
[0.0, 0.0, 1.0],
778-
]);
779-
let s = Mat3x3::<InvMap<2>>::new([
780-
[-1.0, 0.0, 0.0], //
781-
[0.0, 2.0, 0.0],
782-
[0.0, 0.0, 1.0],
783-
]);
784-
785-
let ts = t.then(&s);
786-
let st = s.then(&t);
787-
788-
assert_eq!(ts, s.compose(&t));
789-
assert_eq!(st, t.compose(&s));
790-
791-
assert_eq!(ts.apply(&splat(0.0)), vec2(-2.0, -6.0));
792-
assert_eq!(st.apply(&splat(0.0)), vec2(2.0, -3.0));
793-
}
794-
795-
#[test]
796-
fn composition_4x4() {
797-
let t = translate(vec3(1.0, 2.0, 3.0)).to::<Map>();
798-
let s = scale(vec3(3.0, 2.0, 1.0)).to::<InvMap>();
799-
800-
let ts = t.then(&s);
801-
let st = s.then(&t);
802-
803-
assert_eq!(ts, s.compose(&t));
804-
assert_eq!(st, t.compose(&s));
805-
806-
assert_eq!(ts.apply(&splat(0.0)), vec3::<_, Basis1>(3.0, 4.0, 3.0));
807-
assert_eq!(st.apply(&splat(0.0)), vec3::<_, Basis2>(1.0, 2.0, 3.0));
808-
}
809-
810833
#[test]
811834
fn determinant_of_identity_is_one() {
812835
let id: Mat4x4<Map> = Mat4x4::identity();

0 commit comments

Comments
 (0)