const-alg 0.1.1

A library that provides a safe experimental linear algebra library based on arrays intead of on the heap
use crate::{Matrix, One, SquareMatrix, Zero};

#[test]
fn test_mul() {
    let mut m = Matrix([[1, 2], [3, 4]]);

    assert_eq!(m * m, Matrix([[7, 10], [15, 22]]));

    m *= m;

    assert_eq!(m, Matrix([[7, 10], [15, 22]]));

    m += m;

    assert_eq!(m, Matrix([[14, 20], [30, 44]]));

    m += One::one();
    m += Zero::zero();

    assert_eq!(m, Matrix([[15, 20], [30, 45]]));

    m *= SquareMatrix::<_, 2>::one();

    assert_eq!(m, Matrix([[15, 20], [30, 45]]));

    assert_eq!(m * Matrix([[1, 1]]).T(), Matrix([[35, 75]]).T());

    assert_eq!(Matrix([[1, 1]]) * m, Matrix([[45, 65]]));

    assert_eq!(-m, Matrix([[-15, -20], [-30, -45]]));

    m *= Matrix::<_, 2, 2>::zero();

    assert_eq!(m, Zero::zero());
}

#[test]
fn test_iter() {
    fn is_exauasted<I: Iterator>(i: I) {
        assert!({i}.next().is_none());
    }

    let mut m = Matrix([[1, 2, 3], [3, 4, 5], [5, 6, 7]]);

    let mut iter = m.into_rows();

    assert_eq!(iter.nth(0).unwrap().collect::<Vec<_>>(), [1, 2, 3]);

    assert_eq!(iter.nth(1).unwrap().collect::<Vec<_>>(), [5, 6, 7]);
    
    is_exauasted(iter);

    let mut iter = m.into_cols();

    assert_eq!(iter.nth(0).unwrap().collect::<Vec<_>>(), [1, 3, 5]);

    assert_eq!(iter.nth(1).unwrap().collect::<Vec<_>>(), [3, 5, 7]);
    
    is_exauasted(iter);

    let mut iter = m.rows_mut();

    assert_eq!(
        iter.nth(0).unwrap().collect::<Vec<_>>(),
        [&mut 1, &mut 2, &mut 3]
    );

    assert_eq!(
        iter.nth(1).unwrap().collect::<Vec<_>>(),
        [&mut 5, &mut 6, &mut 7]
    );
    
    is_exauasted(iter);

    let mut iter = m.cols_mut();

    assert_eq!(
        iter.nth(0).unwrap().collect::<Vec<_>>(),
        [&mut 1, &mut 3, &mut 5]
    );

    assert_eq!(
        iter.nth(1).unwrap().collect::<Vec<_>>(),
        [&mut 3, &mut 5, &mut 7]
    );
    
    is_exauasted(iter);

    let mut iter = m.rows();

    assert_eq!(iter.nth(0).unwrap().collect::<Vec<_>>(), [&1, &2, &3]);

    assert_eq!(iter.nth(1).unwrap().collect::<Vec<_>>(), [&5, &6, &7]);
    
    is_exauasted(iter);

    let mut iter = m.cols();

    assert_eq!(iter.nth(0).unwrap().collect::<Vec<_>>(), [&1, &3, &5]);

    assert_eq!(iter.nth(1).unwrap().collect::<Vec<_>>(), [&3, &5, &7]);
    
    is_exauasted(iter);

    let mut iter = m.into_rows().rev();

    assert_eq!(iter.nth(0).unwrap().rev().collect::<Vec<_>>(), [7, 6, 5]);

    assert_eq!(iter.nth(1).unwrap().rev().collect::<Vec<_>>(), [3, 2, 1]);
    
    is_exauasted(iter);

    let mut iter = m.into_cols().rev();

    assert_eq!(iter.nth(0).unwrap().rev().collect::<Vec<_>>(), [7, 5, 3]);

    assert_eq!(iter.nth(1).unwrap().rev().collect::<Vec<_>>(), [5, 3, 1]);
    
    is_exauasted(iter);

    let mut iter = m.rows_mut().rev();

    assert_eq!(
        iter.nth(0).unwrap().rev().collect::<Vec<_>>(),
        [&mut 7, &mut 6, &mut 5]
    );

    assert_eq!(
        iter.nth(1).unwrap().rev().collect::<Vec<_>>(),
        [&mut 3, &mut 2, &mut 1]
    );
    
    is_exauasted(iter);

    let mut iter = m.cols_mut().rev();

    assert_eq!(
        iter.nth(0).unwrap().rev().collect::<Vec<_>>(),
        [&mut 7, &mut 5, &mut 3]
    );

    assert_eq!(
        iter.nth(1).unwrap().rev().collect::<Vec<_>>(),
        [&mut 5, &mut 3, &mut 1]
    );
    
    is_exauasted(iter);

    let mut iter = m.rows().rev();

    assert_eq!(iter.nth(0).unwrap().rev().collect::<Vec<_>>(), [&7, &6, &5]);

    assert_eq!(iter.nth(1).unwrap().rev().collect::<Vec<_>>(), [&3, &2, &1]);
    
    is_exauasted(iter);

    let mut iter = m.cols().rev();

    assert_eq!(iter.nth(0).unwrap().rev().collect::<Vec<_>>(), [&7, &5, &3]);

    assert_eq!(iter.nth(1).unwrap().rev().collect::<Vec<_>>(), [&5, &3, &1]);
    
    is_exauasted(iter);
}

#[test]
fn test_get_all_mut() {
    let mut m = Matrix([[0, 1, 2, 3], [4, 5, 6, 7]]);

    let all = m.get_all_mut([(0, 0), (0, 2), (2, 0), (0, 0)]);

    assert_eq!(all, [Some(&mut 0), Some(&mut 2), None, None]);
}