// test matrix.i library

exec("swigtest.start", -1);

// test matrix passed as output argument from function
function test_outMatrix(func, valueType, expectedOutMatrix)
  funcName = msprintf("out%s%s", valueType, func);
  cmd = msprintf("outMatrix = %s();", funcName);
  ierr = execstr(cmd, "errcatch");
  if ierr <> 0 then
    swigtesterror(msprintf("Error %d in %s", ierr, funcName));
  end
  checkequal(outMatrix, expectedOutMatrix, funcName);
endfunction

// test matrix passed as input argument of function
function test_inMatrix(func, valueType, inMatrix, expectedInValue)
  funcName = msprintf("in%s%s", valueType, func);
  cmd = msprintf("inValue = %s(inMatrix);", funcName);
  ierr = execstr(cmd, "errcatch");
  if ierr <> 0 then
    swigtesterror(msprintf("Error %d in %s", ierr, funcName));
  end
  checkequal(inValue, expectedInValue, funcName);
endfunction

// test matrixes passed as input and output arguments of function
function test_inoutMatrix(func, valueType, inoutMatrix, expectedInoutMatrix)
  funcName = msprintf("inout%s%s", valueType, func);
  cmd = msprintf("inoutMatrix = %s(inoutMatrix);", funcName);
  ierr = execstr(cmd, "errcatch");
  if ierr <> 0 then
    swigtesterror(msprintf("Error %d in %s", ierr, funcName));
  end
  checkequal(inoutMatrix, expectedInoutMatrix, funcName);
endfunction

function test_matrix_typemaps(valueType, ..
  expectedOutMatrixDims, expectedOutMatrixSize, ..
  expectedInValue, ..
  expectedInoutMatrixDims, expectedInoutMatrixSize)

  test_outMatrix("MatrixDims", valueType, expectedOutMatrixDims);
  test_outMatrix("MatrixSize", valueType, expectedOutMatrixSize);
  matrixDims = expectedOutMatrixDims;
  matrixSize = expectedOutMatrixSize;
  test_inMatrix("MatrixDims", valueType, matrixDims, expectedInValue);
  test_inMatrix("MatrixSize", valueType, matrixSize, expectedInValue);
  test_inoutMatrix("MatrixDims", valueType, matrixDims, expectedInoutMatrixDims);
  test_inoutMatrix("MatrixSize", valueType, matrixSize, expectedInoutMatrixSize);
endfunction


m = [0  3;  1  4;  2  5];
v = [0  1   2  3   4  5];
test_matrix_typemaps("Int", m, v, sum(m), m .* m, v .* v);
test_matrix_typemaps("Double", m, v, sum(m), m .* m, v .* v);

m = ["A" "D"; "B" "E"; "C" "F"];
v = ["A" "B"  "C" "D"  "E" "F"];
test_matrix_typemaps("CharPtr", m, v, strcat(m), m + m, v + v);

m = [%T  %F;  %F  %T;  %T  %F];
v = [%T  %F   %T  %F   %T  %F];
test_matrix_typemaps("Bool", m, v, %T, ~m, ~v);

exec("swigtest.quit", -1);
