use llml::mat::{Matd3, Matf3}; use rand::random; macro_rules! test_arith { ($sy:tt) => { let (alpha, beta) = get_mats(); assert_eq!(alpha $sy beta, Matd3::new([ alpha.xx() $sy beta.xx(), alpha.xy() $sy beta.xy(), alpha.xz() $sy beta.xz(), alpha.yx() $sy beta.yx(), alpha.yy() $sy beta.yy(), alpha.yz() $sy beta.yz(), alpha.zx() $sy beta.zx(), alpha.zy() $sy beta.zy(), alpha.zz() $sy beta.zz(), ])); } } #[cfg(feature = "llml_serde")] #[test] fn serde () { let alpha : Matd3 = random(); let json = serde_json::to_string(&alpha).unwrap(); let beta : Matd3 = serde_json::from_str(json.as_str()).unwrap(); let diff : [f64;9] = (alpha - beta).into(); assert!(diff.into_iter().sum::() <= f64::EPSILON * 9.); } #[test] fn eq () { assert_eq!(Matd3::new([1., 2., 3., 4., 5., 6., 7., 8., 9.]), Matd3::new([1., 2., 3., 4., 5., 6., 7., 8., 9.])); assert_ne!(Matd3::new([1., 2., 3., 4., 5., 6., 7., 8., 9.]), Matd3::new([1., 2., 3., 4., 5., 6., 7., 8., 8.])) } #[test] fn into () { assert_eq!(Into::::into(Matd3::new([1., 2., 3., 4., 5., 6., 7., 8., 9.])), Matf3::new([1., 2., 3., 4., 5., 6., 7., 8., 9.])); assert_eq!(Into::<[f64;9]>::into(Matd3::new([1., 2., 3., 4., 5., 6., 7., 8., 9.])), [1., 2., 3., 4., 5., 6., 7., 8., 9.]) } #[test] fn rot () { let (sin, cos) = 1f64.sin_cos(); let alpha = Matd3::from_rot(1., -std::f64::consts::PI, std::f64::consts::FRAC_PI_2); let beta = Matd3::new([ 0., cos, sin, 1., 0., 0., 0., sin, -cos ]); let diff : [f64;9] = (alpha - beta).into(); assert!(diff.into_iter().sum::() <= f64::EPSILON * 9.); } #[test] fn add () { test_arith!(+); } #[test] fn sub () { test_arith!(-); } #[test] fn mul () { let alpha = Matd3::new([ 1., 2., 3., 4., 5., 6., 7., 8., 9. ]); let beta = Matd3::new([ 10., 11., 12., 13., 14., 15., 16., 17., 18. ]); assert_eq!(alpha * beta, Matd3::new([ 84., 90., 96., 201., 216., 231., 318., 342., 366. ])); } #[test] fn scal_mul () { let alpha : [f64;9] = random(); let beta : [f64;9] = random(); let mul = [ alpha[0] * beta[0], alpha[1] * beta[1], alpha[2] * beta[2], alpha[3] * beta[3], alpha[4] * beta[4], alpha[5] * beta[5], alpha[6] * beta[6], alpha[7] * beta[7], alpha[8] * beta[8], ]; let a = Matd3::new(alpha); let b = Matd3::new(beta); assert_eq!(a.scal_mul(b), Matd3::new(mul)) } #[test] fn scal_div () { let alpha : [f64;9] = random(); let beta : [f64;9] = random(); let mul = [ alpha[0] / beta[0], alpha[1] / beta[1], alpha[2] / beta[2], alpha[3] / beta[3], alpha[4] / beta[4], alpha[5] / beta[5], alpha[6] / beta[6], alpha[7] / beta[7], alpha[8] / beta[8], ]; let a = Matd3::new(alpha); let b = Matd3::new(beta); assert_eq!(a.scal_div(b), Matd3::new(mul)) } #[test] fn neg () { let alpha : Matd3 = random(); assert_eq!(-alpha, Matd3::new([ -alpha.xx(), -alpha.xy(), -alpha.xz(), -alpha.yx(), -alpha.yy(), -alpha.yz(), -alpha.zx(), -alpha.zy(), -alpha.zz(), ])) } #[test] fn tr () { let alpha = Matd3::new([ 1., 2., 3., 4., 5., 6., 7., 8., 9. ]); assert_eq!(alpha.tr(), 15.) } #[test] fn det () { let alpha = Matd3::new([ 1., 2., 3., 4., 5., 6., 7., 8., 9. ]); let beta = Matd3::new([ 11., 11., 12., 13., 14., 15., 16., 17., 18. ]); assert_eq!(alpha.det(), 0.); assert_eq!(beta.det(), -3.) } #[test] fn inv () { let alpha = Matd3::new([ 1., 2., 3., 4., 5., 6., 7., 8., 9. ]); let beta = Matd3::new([ 11., 11., 12., 13., 14., 15., 16., 17., 18. ]); assert_eq!(alpha.inv(), None); assert_eq!(beta.inv(), Some(Matd3::new([ 1., -2., 1., -2., -2., 3., 1., 33. / 9., -33. / 9. ]))); } fn get_mats () -> (Matd3, Matd3) { (random(), random()) }