diff --git a/optional_plugins/varianter_cit/avocado_varianter_cit/Cit.py b/optional_plugins/varianter_cit/avocado_varianter_cit/Cit.py index 5ebdd6f505240d94d123da6dd54e1ba31cccf700..b281d6e078c32dcfd6b94ebd6efbff4454386755 100644 --- a/optional_plugins/varianter_cit/avocado_varianter_cit/Cit.py +++ b/optional_plugins/varianter_cit/avocado_varianter_cit/Cit.py @@ -101,9 +101,10 @@ class Cit: while self.combination_matrix.total_uncovered != 0: LOG.debug(self.__throbber.render(), extra={"skip_newline": True}) solution, row_index, _ = self.use_random_algorithm(matrix) - self.combination_matrix.uncover_solution_row(matrix[row_index]) - self.combination_matrix.cover_solution_row(solution) - matrix[row_index] = solution + if len(solution) != 0: + self.combination_matrix.uncover_solution_row(matrix[row_index]) + self.combination_matrix.cover_solution_row(solution) + matrix[row_index] = solution if counter == 0: return matrix, False counter -= 1 @@ -197,8 +198,6 @@ class Cit: self.combination_matrix.cover_combination(matrix[row_index], parameters) if best_uncover == 0: break - if len(best_solution) == 0: - return self.change_one_column(matrix) return best_solution, best_row_index, parameters def get_missing_combination_random(self): @@ -229,7 +228,10 @@ class Cit: best_solution = [] best_row_index = 0 for row_index in range(len(matrix)): - solution, row_index, parameters = self.change_one_value(matrix, row_index, column_index) + try: + solution, row_index, parameters = self.change_one_value(matrix, row_index, column_index) + except ValueError: + continue self.combination_matrix.uncover_combination(matrix[row_index], parameters) self.combination_matrix.cover_combination(solution, parameters) if self.combination_matrix.total_uncovered < best_uncover: @@ -251,10 +253,13 @@ class Cit: :param column_index: column inside matrix. If it's None it is chosen randomly :return: solution, index of solution inside matrix and parameters which has been changed """ + is_cell_chosen = True if row_index is None: + is_cell_chosen = False row_index = random.randint(0, len(matrix) - 1) row = [x for x in matrix[row_index]] if column_index is None: + is_cell_chosen = False column_index = random.randint(0, len(row) - 1) possible_numbers = list(range(0, row[column_index])) + list( range(row[column_index] + 1, self.data[column_index])) @@ -262,6 +267,8 @@ class Cit: while not self.combination_matrix.is_valid_combination(row, [column_index]): possible_numbers.remove(row[column_index]) if len(possible_numbers) == 0: + if is_cell_chosen: + raise ValueError("Selected cell can't be changed") column_index = random.randint(0, len(row) - 1) row_index = random.randint(0, len(matrix) - 1) row = [x for x in matrix[row_index]] diff --git a/optional_plugins/varianter_cit/tests/test_cit.py b/optional_plugins/varianter_cit/tests/test_cit.py index 8989e4a85dc912afaf184b296ad496c88f1f0079..bf99a72ce548cbf338a6c396cca8bdd86c3c507e 100644 --- a/optional_plugins/varianter_cit/tests/test_cit.py +++ b/optional_plugins/varianter_cit/tests/test_cit.py @@ -71,13 +71,23 @@ class CitTests(unittest.TestCase): final_matrix = self.cit.final_matrix_init() expected_row_index = 2 expected_column_index = 0 - row, row_index, column_index = self.cit.change_one_value(final_matrix, row_index=expected_row_index, - column_index=expected_column_index) - self.assertEqual(expected_column_index, column_index[0], "Column index is wrong") - self.assertEqual(expected_row_index, row_index, "Row index is wrong") - self.assertNotEqual(final_matrix[row_index][column_index[0]], row[column_index[0]], "Value did not change") - row[column_index[0]] = final_matrix[row_index][column_index[0]] - self.assertEqual(final_matrix[row_index], row, "Different value was changed") + function_state = True + row, row_index, column_index = (None, None, None) + try: + row, row_index, column_index = self.cit.change_one_value(final_matrix, row_index=expected_row_index, + column_index=expected_column_index) + except ValueError: + function_state = False + if function_state: + self.assertEqual(expected_column_index, column_index[0], "Column index is wrong") + self.assertEqual(expected_row_index, row_index, "Row index is wrong") + self.assertNotEqual(final_matrix[row_index][column_index[0]], row[column_index[0]], "Value did not change") + row[column_index[0]] = final_matrix[row_index][column_index[0]] + self.assertEqual(final_matrix[row_index], row, "Different value was changed") + else: + self.assertIsNone(row) + self.assertIsNone(row_index) + self.assertIsNone(column_index) def test_change_one_column(self): final_matrix = self.cit.final_matrix_init()