class Matrix implements Cloneable {

    public void copy(Matrix C) {
        System.arraycopy(C.data_, 0, data_, 0, data_.length);
    }

}

class MatrixTest {

    @Test
    public void testcopy() {

        Matrix M = new Matrix(11, 10);
        M.randomize();
        boolean[] rsel = new boolean[M.getRowsCount()];
        boolean[] csel = new boolean[M.getColumnsCount()];
        for (int i = 0; i < rsel.length; ++i) {
            if (i % 3 == 0) {
                rsel[i] = true;
            }
        }
        for (int i = 0; i < csel.length; ++i) {
            if (i % 2 == 0) {
                csel[i] = true;
            }
        }
        Matrix M2 = M.clone();

        int[] irsel = new int[]{1, 2, 3, 5};
        int[] icsel = new int[]{1, 3, 5, 8};

        Matrix mr = Matrix.selectRows(M.subMatrix(), rsel);
        M2.subMatrix().copyRows(mr.subMatrix(), rsel);
        assertTrue(M2.equals(M));

        Matrix mc = Matrix.selectColumns(M.subMatrix(), csel);
        M2.subMatrix().copyColumns(mc.subMatrix(), csel);
        assertTrue(M2.equals(M));

        Matrix m = Matrix.select(M.subMatrix(), rsel, csel);
        M2.subMatrix().copy(m.subMatrix(), rsel, csel);
        assertTrue(M2.equals(M));

        mr = Matrix.selectRows(M.subMatrix(), irsel);
        M2.subMatrix().copyRows(mr.subMatrix(), irsel);
        assertTrue(M2.equals(M));

        mc = Matrix.selectColumns(M.subMatrix(), icsel);
        M2.subMatrix().copyColumns(mc.subMatrix(), icsel);
        assertTrue(M2.equals(M));

        m = Matrix.select(M.subMatrix(), irsel, icsel);
        M2.subMatrix().copy(m.subMatrix(), irsel, icsel);
        assertTrue(M2.equals(M));
    }

}