bowtie 0.2.0

2D Game engine with messaging system
Documentation
#[cfg(test)]
mod matrix_tests {
  #[test]
  fn scalar_matrix_multiply_ok() {
    use crate::math::matrix::Matrix;
    let matrix = Matrix::new(vec![vec![1, 2, 3], vec![4, 5, 6]]);
    let test_matrix = Matrix::new(vec![vec![2, 4, 6], vec![8, 10, 12]]);
    assert_eq!(matrix * 2, test_matrix);
  }

  #[test]
  fn scalar_matrix_multiply_bad() {
    use crate::math::matrix::Matrix;
    let matrix = Matrix::new(vec![vec![1, 2, 3], vec![4, 5, 6]]);
    let test_matrix = Matrix::new(vec![vec![2, 4, 6], vec![8, 10, 12]]);
    assert_ne!(matrix * 3, test_matrix);
  }

  #[test]
  #[should_panic(expected = "Not a valid matrix")]
  fn matrix_creation_validates() {
    use crate::math::matrix::Matrix;
    // Unequal columns
    Matrix::new(vec![vec![1, 2], vec![1, 2, 3]]);
  }

  #[test]
  fn matrix_matrix_add_ok() {
    use crate::math::matrix::Matrix;
    let matrix = Matrix::new(vec![vec![1, -7, 5], vec![0, 3, -10]]);
    let rhs_matrix = Matrix::new(vec![vec![5, 0, 3], vec![11, -1, 7]]);
    let test_matrix = Matrix::new(vec![vec![6, -7, 8], vec![11, 2, -3]]);
    assert_eq!(matrix + rhs_matrix, test_matrix);
  }

  #[test]
  fn matrix_matrix_add_bad() {
    use crate::math::matrix::Matrix;
    let matrix = Matrix::new(vec![vec![1, -7, 5], vec![0, 3, -10]]);
    let rhs_matrix = Matrix::new(vec![vec![5, 0, 3], vec![11, -1, 7]]);
    let test_matrix = Matrix::new(vec![vec![6, 0, 0], vec![11, 2, -3]]);
    assert_ne!(matrix + rhs_matrix, test_matrix);
  }

  #[test]
  #[should_panic(
    expected = "Matrices don't have same number of columns or rows"
  )]
  fn matrix_matrix_add_validation() {
    use crate::math::matrix::Matrix;
    let matrix = Matrix::new(vec![vec![1, -7, 5], vec![0, 3, -10]]);
    let rhs_matrix = Matrix::new(vec![vec![5, 0], vec![11, -1]]);
    let _ = matrix + rhs_matrix;
  }

  #[test]
  fn matrix_2x2_determinant() {
    use crate::math::matrix::{Determinant, Matrix};
    let matrix = Matrix::new(vec![vec![1, 2], vec![3, 4]]);
    let test_det = -2;
    assert_eq!(matrix.det(), test_det);
  }

  #[test]
  fn matrix_3x3_determinant() {
    use crate::math::matrix::{Determinant, Matrix};
    let matrix = Matrix::new(vec![vec![6, 1, 1], vec![4, -2, 5], vec![2, 8, 7]]);
    let test_det = -306;
    assert_eq!(matrix.det(), test_det);
  }

  #[test]
  fn matrix_4x4_determinant() {
    use crate::math::matrix::{Determinant, Matrix};
    let matrix = Matrix::new(vec![
      vec![6, 1, 1, 3],
      vec![4, -2, 5, 10],
      vec![2, 8, 7, -8],
      vec![7, 9, 10, -9],
    ]);
    let test_det = 1464;
    assert_eq!(matrix.det(), test_det);
  }

  #[test]
  fn matrix_5x5_determinant() {
    use crate::math::matrix::{Determinant, Matrix};
    let matrix = Matrix::new(vec![
      vec![5, 6, 19, 10, 0],
      vec![12, 17, 8, 18, 9],
      vec![10, 10, 22, 2, 3],
      vec![67, 8, 9, 0, 0],
      vec![-3, 45, 3, 2, 1],
    ]);
    let test_det = 6709072;
    assert_eq!(matrix.det(), test_det);
  }

  #[test]
  #[should_panic(expected = "Matrix is not a square")]
  fn matrix_determinant_validates() {
    use crate::math::matrix::{Determinant, Matrix};
    let matrix = Matrix::new(vec![
      vec![6, 1, 1],
      vec![4, -2, 5],
      vec![2, 8, 7],
      vec![7, 9, 10],
    ]);
    let test_det = 1464;
    assert_eq!(matrix.det(), test_det);
  }

  #[test]
  fn matrix_2x3_dot_3x2_ok() {
    use crate::math::matrix::Matrix;
    let matrix = Matrix::new(vec![vec![0, 3, 5], vec![5, 5, 2]]);
    let rhs = Matrix::new(vec![vec![3, 4], vec![3, -2], vec![4, -2]]);
    let test_mat = Matrix::new(vec![vec![29, -16], vec![38, 6]]);
    assert_eq!(matrix * rhs, test_mat);
  }

  #[test]
  fn matrix_3x3_dot_3x3_ok() {
    use crate::math::matrix::Matrix;
    let matrix =
      Matrix::new(vec![vec![12, 7, 8], vec![99, -1, 8], vec![7, 6, -1]]);
    let rhs = Matrix::new(vec![vec![28, 9, 0], vec![0, 12, 3], vec![-9, 8, 10]]);
    let test_mat = Matrix::new(vec![
      vec![264, 256, 101],
      vec![2700, 943, 77],
      vec![205, 127, 8],
    ]);
    assert_eq!(matrix * rhs, test_mat);
  }

  #[test]
  fn matrix_2x1_dot_1x2_ok() {
    use crate::math::matrix::Matrix;
    let matrix =
      Matrix::new(vec![vec![12, 7, 8], vec![99, -1, 8], vec![7, 6, -1]]);
    let rhs = Matrix::new(vec![vec![28, 9, 0], vec![0, 12, 3], vec![-9, 8, 10]]);
    let test_mat = Matrix::new(vec![
      vec![264, 256, 101],
      vec![2700, 943, 77],
      vec![205, 127, 8],
    ]);
    assert_eq!(matrix * rhs, test_mat);
  }

  #[test]
  #[should_panic(expected = "Not a valid matrix multiplication")]
  fn matrix_dot_validates() {
    use crate::math::matrix::Matrix;
    let matrix = Matrix::new(vec![vec![0, 3, 5], vec![5, 5, 2]]);
    let rhs = Matrix::new(vec![vec![3, 4], vec![3, -2]]);
    let _ = matrix * rhs;
  }

  #[test]
  fn matrix_identity() {
    use crate::math::matrix::{IdentityMatrix, Matrix};
    let matrix = Matrix::new(vec![vec![0, 3, 5], vec![5, 5, 2], vec![4, 4, 4]]);
    let test_mat =
      Matrix::new(vec![vec![1, 0, 0], vec![0, 1, 0], vec![0, 0, 1]]);
    assert_eq!(matrix.identity(), test_mat);
  }
}

#[cfg(test)]
mod trig_tests {
  #[test]
  fn test_get_radian() {
    use crate::math::trig::get_radian;

    assert_eq!(get_radian(30.0), 0.5235988);

    assert_eq!(get_radian(180.0), 3.1415927);
  }

  #[test]
  fn test_get_factorial() {
    use crate::math::trig::factorial;

    assert!(factorial(1) == 1);
    assert!(factorial(5) == 120);
    assert!(factorial(10) == 3628800);
  }

  #[test]
  fn test_get_sin() {
    use crate::math::trig::get_sin;
    assert_eq!(get_sin(20.0), 0.34202015);
    assert_eq!(get_sin(90.0), 0.9999999);
  }

  #[test]
  fn test_get_cos() {
    use crate::math::trig::get_cos;
    assert_eq!(get_cos(20.0), 0.9396926);
    assert_eq!(get_cos(50.0), 0.64278760968);
  }
}