nalgebra/src/tests/mat.rs

121 lines
2.2 KiB
Rust
Raw Normal View History

use std::num::{Real, One, abs};
use std::rand::random;
use std::cmp::ApproxEq;
2013-05-19 05:56:03 +08:00
use traits::inv::Inv;
use traits::rotation::Rotation;
use traits::indexable::Indexable;
use traits::transpose::Transpose;
use traits::norm::Norm;
2013-07-23 17:15:20 +08:00
use vec::{Vec1, Vec3};
use mat::{Mat1, Mat2, Mat3, Mat4, Mat5, Mat6};
2013-05-19 19:53:19 +08:00
use adaptors::rotmat::Rotmat;
2013-05-19 01:04:03 +08:00
2013-05-22 07:15:03 +08:00
macro_rules! test_inv_mat_impl(
2013-06-09 22:04:54 +08:00
($t: ty) => (
2013-08-05 16:13:44 +08:00
do 10000.times {
2013-05-22 07:15:03 +08:00
let randmat : $t = random();
assert!((randmat.inverse().unwrap() * randmat).approx_eq(&One::one()));
2013-05-22 07:15:03 +08:00
}
);
)
2013-05-19 01:04:03 +08:00
2013-07-23 17:15:20 +08:00
macro_rules! test_transpose_mat_impl(
($t: ty) => (
2013-08-05 16:13:44 +08:00
do 10000.times {
2013-07-23 17:15:20 +08:00
let randmat : $t = random();
assert!(randmat.transposed().transposed().eq(&randmat));
}
);
)
#[test]
2013-08-05 16:13:44 +08:00
fn test_transpose_mat1() {
test_transpose_mat_impl!(Mat1<f64>);
}
2013-07-23 17:15:20 +08:00
#[test]
2013-08-05 16:13:44 +08:00
fn test_transpose_mat2() {
test_transpose_mat_impl!(Mat2<f64>);
}
2013-07-23 17:15:20 +08:00
#[test]
2013-08-05 16:13:44 +08:00
fn test_transpose_mat3() {
test_transpose_mat_impl!(Mat3<f64>);
}
2013-07-23 17:15:20 +08:00
#[test]
2013-08-05 16:13:44 +08:00
fn test_transpose_mat4() {
test_transpose_mat_impl!(Mat4<f64>);
}
2013-07-23 17:15:20 +08:00
#[test]
2013-08-05 16:13:44 +08:00
fn test_transpose_mat5() {
test_transpose_mat_impl!(Mat5<f64>);
}
2013-07-23 17:15:20 +08:00
#[test]
2013-08-05 16:13:44 +08:00
fn test_transpose_mat6() {
test_transpose_mat_impl!(Mat6<f64>);
}
2013-07-23 17:15:20 +08:00
2013-05-19 01:04:03 +08:00
#[test]
2013-08-05 16:13:44 +08:00
fn test_inv_mat1() {
test_inv_mat_impl!(Mat1<f64>);
}
2013-05-19 01:04:03 +08:00
#[test]
2013-08-05 16:13:44 +08:00
fn test_inv_mat2() {
test_inv_mat_impl!(Mat2<f64>);
}
2013-05-19 01:04:03 +08:00
#[test]
2013-08-05 16:13:44 +08:00
fn test_inv_mat3() {
test_inv_mat_impl!(Mat3<f64>);
}
2013-05-19 01:04:03 +08:00
#[test]
2013-08-05 16:13:44 +08:00
fn test_inv_mat4() {
test_inv_mat_impl!(Mat4<f64>);
}
#[test]
2013-08-05 16:13:44 +08:00
fn test_inv_mat5() {
test_inv_mat_impl!(Mat5<f64>);
}
#[test]
2013-08-05 16:13:44 +08:00
fn test_inv_mat6() {
test_inv_mat_impl!(Mat6<f64>);
}
2013-05-19 01:04:03 +08:00
#[test]
2013-08-05 16:13:44 +08:00
fn test_rotation2() {
do 10000.times {
let randmat: Rotmat<Mat2<f64>> = One::one();
let ang = &Vec1::new(abs::<f64>(random()) % Real::pi());
2013-05-19 19:53:19 +08:00
assert!(randmat.rotated(ang).rotation().approx_eq(ang));
2013-05-19 19:53:19 +08:00
}
2013-05-19 01:04:03 +08:00
}
#[test]
2013-08-05 16:13:44 +08:00
fn test_index_mat2() {
let mat: Mat2<f64> = random();
assert!(mat.at((0, 1)) == mat.transposed().at((1, 0)));
}
2013-07-23 17:15:20 +08:00
#[test]
2013-08-05 16:13:44 +08:00
fn test_inv_rotation3() {
do 10000.times {
let randmat: Rotmat<Mat3<f64>> = One::one();
2013-07-23 17:15:20 +08:00
let dir: Vec3<f64> = random();
let ang = &(dir.normalized() * (abs::<f64>(random()) % Real::pi()));
2013-07-23 17:15:20 +08:00
let rot = randmat.rotated(ang);
assert!((rot.transposed() * rot).approx_eq(&One::one()));
}
}