test_cit.py 7.7 KB
Newer Older
J
Jan Richter 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
import random
import unittest
from copy import copy

from avocado_varianter_cit.Cit import Cit
from avocado_varianter_cit.CombinationMatrix import CombinationMatrix
from avocado_varianter_cit.Parameter import Pair
from avocado_varianter_cit.Solver import Solver


class CitInitialization(unittest.TestCase):

    def test_initialization(self):
        parameters = [3, 3, 3, 3]
        constraints = {(Pair(0, 0), Pair(2, 0)), (Pair(0, 1), Pair(1, 1), Pair(2, 0)), (Pair(0, 2), Pair(3, 2))}
        t_value = 2
        solver = Solver(parameters, constraints)
        combination_matrix = CombinationMatrix(parameters, t_value)
        solver.clean_hash_table(combination_matrix, t_value)
        cit = Cit(parameters, t_value, constraints)
        self.assertEqual(combination_matrix, cit.combination_matrix, "The initialization of cit algorithm is wrong")


class CitTests(unittest.TestCase):

    def setUp(self):
        parameters = [3, 3, 3, 3]
        constraints = {(Pair(0, 0), Pair(2, 0)), (Pair(0, 1), Pair(1, 1), Pair(2, 0)), (Pair(0, 2), Pair(3, 2))}
        t_value = 2
        self.cit = Cit(parameters, t_value, constraints)

    def test_create_random_row_with_constraints(self):
        for _ in range(0, 10):
            row = self.cit.create_random_row_with_constraints()
            with self.subTest(random_row=row):
                self.assertTrue(self.cit.combination_matrix.is_valid_solution(row), "New random row is not valid")

    def test_compute_hamming_distance(self):
        self.cit.final_matrix.append([1, 0, 1, 2])
        self.cit.final_matrix.append([2, 1, 1, 0])
        row = [2, 0, 3, 2]
        expected_distance = 5
        self.assertEqual(expected_distance, self.cit.compute_hamming_distance(row), "Wrong hamming distance")

    def test_final_matrix_init(self):
        combination_matrix = copy(self.cit.combination_matrix)
        final_matrix = self.cit.final_matrix_init()

        expected_total_uncovered = 0
        expected_uncovered_rows = {}
        self.assertEqual(expected_total_uncovered, self.cit.combination_matrix.total_uncovered,
                         "Final matrix don't cover all combinations")
        self.assertEqual(expected_uncovered_rows, self.cit.combination_matrix.uncovered_rows,
                         "Final matrix don't cover all combination rows")

        for row in final_matrix:
            combination_matrix.cover_solution_row(row)
        self.assertEqual(expected_total_uncovered, self.cit.combination_matrix.total_uncovered,
                         "Final matrix don't cover all combinations but CIT thinks it does")
        self.assertEqual(expected_uncovered_rows, self.cit.combination_matrix.uncovered_rows,
                         "Final matrix don't cover all combination rows but CIT thinks it does")

    def test_change_one_value_random(self):
        final_matrix = self.cit.final_matrix_init()
        row, row_index, column_index = self.cit.change_one_value(final_matrix)
        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")

    def test_change_one_value_with_index(self):
        final_matrix = self.cit.final_matrix_init()
        expected_row_index = 2
        expected_column_index = 0
J
Jan Richter 已提交
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
        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)
J
Jan Richter 已提交
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137

    def test_change_one_column(self):
        final_matrix = self.cit.final_matrix_init()
        while self.cit.combination_matrix.total_uncovered == 0:
            delete_row = final_matrix.pop(random.randint(0, len(final_matrix) - 1))
            self.cit.combination_matrix.uncover_solution_row(delete_row)
        expected_total_covered_more_than_ones = self.cit.combination_matrix.total_covered_more_than_ones
        expected_total_uncovered = self.cit.combination_matrix.total_uncovered
        expected_uncovered_rows = copy(self.cit.combination_matrix.uncovered_rows)
        row, row_index, column_index = self.cit.change_one_column(final_matrix)
        self.assertEqual(expected_total_uncovered, self.cit.combination_matrix.total_uncovered, "Coverage was change")
        self.assertEqual(expected_total_covered_more_than_ones,
                         self.cit.combination_matrix.total_covered_more_than_ones,
                         "Coverage was change")
        self.assertEqual(expected_uncovered_rows, self.cit.combination_matrix.uncovered_rows, "Coverage was change")
        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")

    def test_get_missing_combination_random(self):
        final_matrix = self.cit.final_matrix_init()
        while self.cit.combination_matrix.total_uncovered == 0:
            delete_row = final_matrix.pop(random.randint(0, len(final_matrix) - 1))
            self.cit.combination_matrix.uncover_solution_row(delete_row)
        combination_parameters, combination = self.cit.get_missing_combination_random()
        self.assertEqual(0, self.cit.combination_matrix.hash_table[combination_parameters].hash_table[combination],
                         "Combination is already covered")

    def test_cover_missing_combination(self):
        final_matrix = self.cit.final_matrix_init()
        while self.cit.combination_matrix.total_uncovered == 0:
            delete_row = final_matrix.pop(random.randint(0, len(final_matrix) - 1))
            self.cit.combination_matrix.uncover_solution_row(delete_row)
        expected_total_covered_more_than_ones = self.cit.combination_matrix.total_covered_more_than_ones
        expected_total_uncovered = self.cit.combination_matrix.total_uncovered
        expected_uncovered_rows = copy(self.cit.combination_matrix.uncovered_rows)
        row, row_index, parameters = self.cit.cover_missing_combination(final_matrix)
        self.assertEqual(expected_total_uncovered, self.cit.combination_matrix.total_uncovered, "Coverage was change")
        self.assertEqual(expected_total_covered_more_than_ones,
                         self.cit.combination_matrix.total_covered_more_than_ones,
                         "Coverage was change")
        self.assertEqual(expected_uncovered_rows, self.cit.combination_matrix.uncovered_rows, "Coverage was change")
        self.assertTrue(final_matrix[row_index][parameters[0]] != row[parameters[0]] or
                        final_matrix[row_index][parameters[1]] != row[parameters[1]], "Value did not change")
        row[parameters[0]] = final_matrix[row_index][parameters[0]]
        row[parameters[1]] = final_matrix[row_index][parameters[1]]
        self.assertEqual(final_matrix[row_index], row, "Different value was changed")