import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.api.Test;

public class DeterminantFinderTest
{
    @Test
    public void testDeterminantDefined()
    {
        int[][] mat = new int[][] {
            {3, 7},
            {1, -4}
        };
        
        assertTrue(DeterminantFinder.determinantDefined(mat));
        
        
        mat = new int[][] {
            {3, 7, 8},
            {1, -4, 6},
            {5, 6, 9}
        };
        
        assertTrue(DeterminantFinder.determinantDefined(mat));
        
        
        mat = new int[][] {
            {3, 7},
            {1, -4},
            {5, 6}
        };
        
        assertTrue( ! DeterminantFinder.determinantDefined(mat) );
        
        
        mat = new int[][] {
            {1}
        };
        
        assertTrue( ! DeterminantFinder.determinantDefined(mat) );
    }
    
    @Test
    public void testFindTwoByTwoDeterminant()
    {
        int[][] mat = new int[][] {
            {3, 7},
            {1, -4}
        };
        
        assertEquals(-19, DeterminantFinder.findTwoByTwoDeterminant(mat));
    }
    
    @Test
    public void testWithoutRowAndColumn()
    {
        int[][] mat = new int[][] {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}
        };
        
        assertArrayEquals(new int[][] {
            {5, 6},
            {8, 9}},
            DeterminantFinder.withoutRowAndColumn(mat, 0, 0));
        
        assertArrayEquals(new int[][] {
            {1, 3},
            {7, 9}},
            DeterminantFinder.withoutRowAndColumn(mat, 1, 1));
        
        assertArrayEquals(new int[][] {
            {4, 6},
            {7, 9}},
            DeterminantFinder.withoutRowAndColumn(mat, 0, 1));

        assertArrayEquals(new int[][] {
            {2, 3},
            {8, 9}},
            DeterminantFinder.withoutRowAndColumn(mat, 1, 0));
    }
    
    @Test
    public void testFindDeterminant()
    {
        int[][] mat = new int[][] {
            {-2, -1, 2},
            {2, 1, 4},
            {-3, 3, -1}
        };
        
        assertEquals(54, DeterminantFinder.findDeterminant(mat));
        
        
        mat = new int[][] {
            {1, -2, 4, 0},
            {7, 3, 0, 3},
            {-1, 1, -4, 0},
            {0, 3, 2, 1}
        };
        
        assertEquals(-34, DeterminantFinder.findDeterminant(mat));
    }
}
