// 3rd_party_lib:matrix4cj/target/matrix4cj
// 3rd_party_lib_ohos:matrix4cj/target/aarch64-linux-ohos/matrix4cj
package matrix4cj.tests.HLT.LEVEL1

import matrix4cj.*
import std.math.*
import std.unittest.*
import std.unittest.testmacro.*

@Test
public class TestMatrix02 {
    @TestCase
    func L1_Test_Matrix_getArray_01(): Unit {
        var matrix01 = Matrix(
            [
                [1.80, 2.88, 2.05, -0.89],
                [5.25, -2.95, -0.95, -3.80],
                [1.58, -2.69, -2.90, -1.04],
                [-1.11, -0.66, -0.59, 0.80]
            ]
        )
        var result = matrix01.data
        var expected_result = [
            [1.80, 2.88, 2.05, -0.89],
            [5.25, -2.95, -0.95, -3.80],
            [1.58, -2.69, -2.90, -1.04],
            [-1.11, -0.66, -0.59, 0.80]
        ]

        var rows = matrix01.rowNum
        var cols = matrix01.colNum
        for (i in 0..rows) {
            for (j in 0..cols) {
                @Assert(abs(expected_result[i][j]-result[i*cols + j])<1e-6,true)
            }
        }
    }
    @TestCase
    func L1_Test_Matrix_getArrayCopy_01(): Unit {
        var matrix01 = Matrix(
            [
                [1.80, 2.88, 2.05, -0.89],
                [5.25, -2.95, -0.95, -3.80],
                [1.58, -2.69, -2.90, -1.04],
                [-1.11, -0.66, -0.59, 0.80]
            ]
        )
        var result = matrix01.data
        var expected_result = [
            [1.80, 2.88, 2.05, -0.89],
            [5.25, -2.95, -0.95, -3.80],
            [1.58, -2.69, -2.90, -1.04],
            [-1.11, -0.66, -0.59, 0.80]
        ]

        var rows = matrix01.rowNum
        var cols = matrix01.colNum
        for (i in 0..rows) {
            for (j in 0..cols) {
                @Assert(abs(expected_result[i][j]-result[i*cols + j])<1e-6,true)
            }
        }
    }
    @TestCase
    func L1_Test_Matrix_getColumnDimension_01(): Unit {
        var matrix01 = Matrix(
            [
                [1.80, 2.88, 2.05, -0.89],
                [5.25, -2.95, -0.95, -3.80],
                [1.58, -2.69, -2.90, -1.04],
                [-1.11, -0.66, -0.59, 0.80]
            ]
        )
        @Assert(matrix01.colNum,4)
    }
    @TestCase
    func L1_Test_Matrix_getColumnDimension_02(): Unit {
        var matrix01 = Matrix([[1.0]])
        @Assert(matrix01.colNum,1)
    }
    @TestCase
    func L1_Test_Matrix_getColumnPackedCopy_01(): Unit {
        var matrix01 = Matrix(
            [
                [1.80, 2.88, 2.05, -0.89],
                [5.25, -2.95, -0.95, -3.80],
                [1.58, -2.69, -2.90, -1.04],
                [-1.11, -0.66, -0.59, 0.80]
            ]
        )
        var result = matrix01.getOneDimensionalArray(order: StorageOrder.ColumnMajor)
        var expected_result: Array<Float64> = [1.80, 5.25, 1.58, -1.11, 2.88, -2.95, -2.69, -0.66, 2.05, -0.95, -2.90,
            -0.59, -0.89, -3.80, -1.04, 0.80]

        for (i in 0..result.size) {
            @Assert(abs(expected_result[i]-result[i])<1e-6,true)
        }
    }
}