tests/Matrix.Tests.ps1

& (Join-Path $PSScriptRoot '_setup.ps1') 'matrix'

Describe 'Matrix helper functions' -Tag 'Local', 'Remote' {
  It 'can provide wrapper for matrix creation' {
    $A = 1..9 | New-Matrix 3, 3
    $A.Size | Should -Be 3, 3
    $A.Rows[0] | Should -Be 1, 2, 3
    $A.Rows[1] | Should -Be 4, 5, 6
    $A.Rows[2] | Should -Be 7, 8, 9
    $A = New-Matrix -Size 3, 3 -Values (1..9)
    $A.Size | Should -Be 3, 3
    $A.Rows[0] | Should -Be 1, 2, 3
    $A.Rows[1] | Should -Be 4, 5, 6
    $A.Rows[2] | Should -Be 7, 8, 9
    $A = New-Matrix
    $A.Size | Should -Be 2, 2 -Because '2x2 is the default matrix size'
    $A.Rows[0] | Should -Be 0, 0 -Because 'an empty matrix should be created by default'
    $A.Rows[1] | Should -Be 0, 0 -Because 'an empty matrix should be created by default'
    $A = @(1, 2, 3, @(4, 5, 6)) | New-Matrix 2, 3
    $A = 1..6 | New-Matrix 2, 3
    $A.Rows[0] | Should -Be 1, 2, 3 -Because 'function accepts non-square sizes'
    $A.Rows[1] | Should -Be 4, 5, 6 -Because 'values array should be flattened'
  }
  It 'can create diagonal matrices' {
    $A = 1..3 | New-Matrix 3, 3 -Diagonal
    $A.Size | Should -Be 3, 3
    $A.Rows[0] | Should -Be 1, 0, 0
    $A.Rows[1] | Should -Be 0, 2, 0
    $A.Rows[2] | Should -Be 0, 0, 3
    $A = New-Matrix -Values (1..3) -Size 3, 3 -Diagonal
    $A.Size | Should -Be 3, 3
    $A.Rows[0] | Should -Be 1, 0, 0
    $A.Rows[1] | Should -Be 0, 2, 0
    $A.Rows[2] | Should -Be 0, 0, 3
  }
  It 'can test if a matrix is diagonal' {
    1, 0, 0,
    0, 2, 0,
    0, 0, 3 | New-Matrix 3, 3 | Test-DiagonalMatrix | Should -BeTrue
    1, 0, 0,
    2, 2, 0,
    3, 0, 3 | New-Matrix 3, 3 | Test-DiagonalMatrix | Should -BeFalse -Because 'second and third rows have non-zero elements off the main diagonal'
    1, 0, 0,
    0, 2, 1,
    0, 0, 3 | New-Matrix 3, 3 | Test-DiagonalMatrix | Should -BeFalse -Because 'second row has a non-zero element off the main diagonal'
    1, 0,
    0, 1 | New-Matrix | Test-DiagonalMatrix | Should -BeTrue
    1, 0, 0,
    0, 2, 0 | New-Matrix 2, 3 | Test-DiagonalMatrix | Should -BeFalse -Because 'only square matrices can be diagonal'
    1, 0, 2,
    0, 2, 2 | New-Matrix 2, 3 | Test-DiagonalMatrix | Should -BeFalse -Because 'only square matrices can be diagonal'
  }
  It 'can test if a matrix is square' {
    (1..4) | New-Matrix | Test-SquareMatrix | Should -BeTrue
    (1..9) | New-Matrix 3, 3 | Test-SquareMatrix | Should -BeTrue
    (1..6) | New-Matrix 3, 2 | Test-SquareMatrix | Should -BeFalse -Because 'the # of rows and # of columns are different'
  }
  It 'can test if a matrix is symmetric' {
    1, 2, 3,
    2, 1, 4,
    3, 4, 1 | New-Matrix 3, 3 | Test-SymmetricMatrix | Should -BeTrue
    (1..9) | New-Matrix 3, 3 | Test-SymmetricMatrix | Should -BeFalse -Because 'elements off main diagonal are not equal'
    1, 1, 1, 1 | New-Matrix | Test-SymmetricMatrix | Should -BeTrue
    1, 0, 0, 0,
    0, 1, 0, 0,
    0, 0, 1, 0,
    0, 0, 0, 1 | New-Matrix 4, 4 | Test-SymmetricMatrix | Should -BeTrue -Because 'diagonal matrices are symmetric'
    1, 0, 0,
    2, 2, 0,
    3, 0, 3 | New-Matrix 3, 3 | Test-SymmetricMatrix | Should -BeFalse
    1, 0, 0,
    0, 2, 1,
    0, 0, 3 | New-Matrix 2, 3 | Test-SymmetricMatrix | Should -BeFalse
    1, 0, 0,
    0, 0, 3 | New-Matrix 2, 3 | Test-SymmetricMatrix | Should -BeFalse -Because 'only square matrices can be symmetric'
  }
}