def test_algorithm_z(self):
    text_1 = "#baabab"
    text_2 = "#ababaa"

    fr = FourRussiansHelpers(lcs_delete_cost_function,
                             lcs_insert_cost_function,
                             substitute_cost_function2)
    m, A, step_size_bound, text_1, text_2 = fr.prepare_parameters(text_1,
                                                                  text_2)
    storage = fr.algorithm_y(m, A, step_size_bound)
    P, Q = fr.algorithm_z(m, storage, text_1, text_2)

    _, diff_between_rows, diff_between_columns = get_full_matrices(
        fr, text_1, text_2,
        lcs_delete_cost_function,
        lcs_insert_cost_function)

    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 check_lcs(self, text_1, text_2, expected_lcs):
    expected_length = len(expected_lcs)
    fr = FourRussiansHelpers(lcs_delete_cost_function,
                             lcs_insert_cost_function,
                             lcs_substitute_cost_function)
    m, A, step_size_bound, text_1, text_2 = fr.prepare_parameters(text_1,
                                                                  text_2)
    storage = fr.algorithm_y(m, A, step_size_bound)
    P, Q = fr.algorithm_z(m, storage, text_1, text_2)

    lcs = fr.restore_lcs(text_1, text_2, P, Q, m)
    self.assertEqual(len(lcs), expected_length,
                     "Expected lcs of length {0}, actual lcs of length {1}. "
                     "Actual result: {2}, expected result: {3}"
                     .format(expected_length, len(lcs), lcs, expected_lcs))
    self.assertEqual(lcs, expected_lcs)