def test_prepare_parameters(self):
     self.check_prepare_parameters(
         four_russians.FourRussians(distance.INDEL_DISTANCE), '#abab',
         '#abab', 4, 4, (2, ['a', 'b'], 1, '#abab', '#abab'))
     self.check_prepare_parameters(
         four_russians.FourRussians(distance.INDEL_DISTANCE), '#ababa',
         '#abc', 5, 3, (2, ['a', 'b', 'c', '$'], 1, '#ababa$', '#abc$'))
     self.check_prepare_parameters(
         four_russians.FourRussians(distance.INDEL_DISTANCE), '#aaaaaaaa',
         '#bbb', 8, 3, (3, ['a', 'b', '$'], 1, '#aaaaaaaa$', '#bbb'))
    def test_algorithm_y(self):
        t_1 = '#baabab'
        t_2 = '#ababaa'
        n_1, n_2 = 6, 6

        fr = four_russians.FourRussians(TEST_DISTANCE)
        m, A, step, t_1, t_2 = fr.prepare_parameters(t_1, t_2, n_1, n_2)
        storage = fr.algorithm_y(m, A, step)

        _, diff_between_rows, diff_between_columns = get_full_matrices(
            fr, t_1, t_2, TEST_DISTANCE)

        for i in range(0, 5):
            for j in range(0, 5):
                self.assertEqual(
                    storage[t_1[i + 1:i + 3], t_2[j + 1:j + 3],
                            (diff_between_rows[i + 1][j],
                             diff_between_rows[i + 2][j]),
                            (diff_between_columns[i][j + 1],
                             diff_between_columns[i][j + 2])], ([
                                 diff_between_rows[i + 1][j + 2],
                                 diff_between_rows[i + 2][j + 2]
                             ], [
                                 diff_between_columns[i + 2][j + 1],
                                 diff_between_columns[i + 2][j + 2]
                             ]))
 def test_restore_matrix(self):
     fr = four_russians.FourRussians(TEST_DISTANCE)
     result = fr.restore_matrix('#baabab', '#ababaa', [0, 1, 2, 3, 4, 5, 6],
                                [0, 1, 2, 3, 4, 5, 6], 6)
     expected = [[0, 1, 2, 3, 4, 5, 6], [1, 2, 1, 2, 3, 4, 5],
                 [2, 1, 2, 1, 2, 3, 4], [3, 2, 2, 2, 2, 2, 3],
                 [4, 3, 2, 3, 2, 3, 4], [5, 4, 3, 2, 3, 2, 3],
                 [6, 5, 4, 3, 2, 3, 4]]
     self.assertEqual(result, expected)
 def test_restore_lcs_part(self):
     fr = four_russians.FourRussians(distance.INDEL_DISTANCE)
     self.assertEqual(
         fr.restore_lcs_part('#aa', '#ab', [0, 1, 1], [0, 1, 1], 2, 2, 2),
         ('a', 0, 0))
     self.assertEqual(
         fr.restore_lcs_part('#aaccc', '#aabc#', [0, 1, 1, 1, 1, 1],
                             [0, 1, 1, 1, 1, 1], 5, 5, 5), ('caa', 0, 0))
     self.assertEqual(
         fr.restore_lcs_part('#aaa', '#bbb', [0, 1, 1, 1], [0, 1, 1, 1], 3,
                             3, 3), ('', 0, 3))
    def test_algorithm_z(self):
        t_1, t_2, n_1, n_2 = '#baabab', '#ababaa', 6, 6
        fr = four_russians.FourRussians(TEST_DISTANCE)
        m, A, step, t_1, t_2 = fr.prepare_parameters(t_1, t_2, n_1, n_2)
        storage = fr.algorithm_y(m, A, step)
        P, Q = fr.algorithm_z(m, storage, t_1, t_2)
        _, diff_between_rows, diff_between_columns = get_full_matrices(
            fr, t_1, t_2, TEST_DISTANCE)

        for i in range(1, 4):
            for j in range(1, 4):
                self.assertEqual(P[i][j], [
                    diff_between_rows[(i - 1) * m + 1][j * m],
                    diff_between_rows[i * m][j * m]
                ])
                self.assertEqual(Q[i][j], [
                    diff_between_columns[i * m][(j - 1) * m + 1],
                    diff_between_columns[i * m][j * m]
                ])
 def test_get_all_strings(self):
     fr = four_russians.FourRussians(distance.INDEL_DISTANCE)
     self.check_get_all_strings(fr, 2, ['a', 'b'], '#',
                                ['#aa', '#ab', '#ba', '#bb'])
     self.check_get_all_strings(fr, 3, ['z'], '?', ['?zzz'])