Skip to content

Commit 1313883

Browse files
committed
added tests and fixed bugs for truth table
1 parent 8160f60 commit 1313883

2 files changed

Lines changed: 189 additions & 3 deletions

File tree

evaluation_function/truth_table/evaluate.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,10 @@ def evaluate_truth_table(input: list[list[str]], num_atoms) -> Result:
120120

121121

122122
unique_rows = set(tuple(row[cell] for cell in existing_atoms.values()) for row in input[1:])
123-
if unique_rows < 2 ** num_atoms:
123+
if len(unique_rows) != 2 ** num_atoms:
124124
return Result(
125125
is_correct=False,
126-
feedback_items=[(Exception, "dupliated assignment to atoms")]
126+
feedback_items=[(Exception, "duplicated assignment to atoms")]
127127
)
128128

129129

@@ -132,7 +132,7 @@ def evaluate_truth_table(input: list[list[str]], num_atoms) -> Result:
132132
for i in range(1, len(input)):
133133
atoms_mapping = {}
134134
for j in range(len(input[i])):
135-
formula = formula[j]
135+
formula = formulas[j]
136136

137137
if isinstance(formula, Atom):
138138
atoms_mapping[formula] = input[i][j]
Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
import unittest
2+
from evaluation_function.truth_table.evaluate import evaluate_truth_table
3+
4+
5+
class TestEvaluateTruthTable(unittest.TestCase):
6+
7+
def test_empty_input(self):
8+
"""Test that empty input returns False with appropriate error"""
9+
result = evaluate_truth_table([], 0)
10+
self.assertFalse(result.is_correct)
11+
# self.assertEqual(len(result.feedback_items), 1)
12+
# self.assertIn("no input", str(result.feedback_items[0][1]))
13+
14+
def test_only_header_row(self):
15+
"""Test that providing only formulas without values returns False"""
16+
result = evaluate_truth_table([["p"]], 1)
17+
self.assertFalse(result.is_correct)
18+
# self.assertIn("Must provide names and its truth values", str(result.feedback_items[0][1]))
19+
20+
def test_simple_valid_truth_table_one_atom(self):
21+
"""Test a valid truth table with one atom"""
22+
input_table = [
23+
["p"],
24+
["tt"],
25+
["ff"]
26+
]
27+
result = evaluate_truth_table(input_table, 1)
28+
self.assertTrue(result.is_correct)
29+
30+
def test_valid_truth_table_two_atoms(self):
31+
"""Test a valid truth table with two atoms and a compound formula"""
32+
input_table = [
33+
["p", "q", "p ∧ q"],
34+
["tt", "tt", "tt"],
35+
["tt", "ff", "ff"],
36+
["ff", "tt", "ff"],
37+
["ff", "ff", "ff"]
38+
]
39+
result = evaluate_truth_table(input_table, 2)
40+
self.assertTrue(result.is_correct)
41+
42+
def test_valid_truth_table_with_or(self):
43+
"""Test a valid truth table with OR operation"""
44+
input_table = [
45+
["p", "q", "p ∨ q"],
46+
["tt", "tt", "tt"],
47+
["tt", "ff", "tt"],
48+
["ff", "tt", "tt"],
49+
["ff", "ff", "ff"]
50+
]
51+
result = evaluate_truth_table(input_table, 2)
52+
self.assertTrue(result.is_correct)
53+
54+
def test_valid_truth_table_with_implication(self):
55+
"""Test a valid truth table with implication"""
56+
input_table = [
57+
["p", "q", "p → q"],
58+
["tt", "tt", "tt"],
59+
["tt", "ff", "ff"],
60+
["ff", "tt", "tt"],
61+
["ff", "ff", "tt"]
62+
]
63+
result = evaluate_truth_table(input_table, 2)
64+
self.assertTrue(result.is_correct)
65+
66+
def test_valid_truth_table_with_negation(self):
67+
"""Test a valid truth table with negation"""
68+
input_table = [
69+
["p", "¬p"],
70+
["tt", "ff"],
71+
["ff", "tt"]
72+
]
73+
result = evaluate_truth_table(input_table, 1)
74+
self.assertTrue(result.is_correct)
75+
76+
def test_invalid_formula_syntax(self):
77+
"""Test that invalid formula syntax is caught"""
78+
input_table = [
79+
["p", "q ∧"],
80+
["tt", "tt"],
81+
["ff", "ff"]
82+
]
83+
result = evaluate_truth_table(input_table, 2)
84+
self.assertFalse(result.is_correct)
85+
# self.assertIn("formula in column 2 incorrect", str(result.feedback_items[0][1]))
86+
87+
def test_undefined_atom_in_formula(self):
88+
"""Test that using an undefined atom in a formula is caught"""
89+
input_table = [
90+
["p", "p ∧ q"],
91+
["tt", "tt"],
92+
["ff", "ff"]
93+
]
94+
result = evaluate_truth_table(input_table, 2)
95+
self.assertFalse(result.is_correct)
96+
# self.assertIn("undefined", str(result.feedback_items[0][1]))
97+
98+
def test_invalid_cell_value(self):
99+
"""Test that invalid cell values are caught"""
100+
input_table = [
101+
["p"],
102+
["true"],
103+
["ff"]
104+
]
105+
result = evaluate_truth_table(input_table, 1)
106+
self.assertFalse(result.is_correct)
107+
# self.assertIn("invalid", str(result.feedback_items[0][1]))
108+
109+
def test_missing_combinations(self):
110+
"""Test that missing combinations are detected"""
111+
input_table = [
112+
["p", "q"],
113+
["tt", "tt"],
114+
["tt", "ff"]
115+
]
116+
result = evaluate_truth_table(input_table, 2)
117+
self.assertFalse(result.is_correct)
118+
# self.assertIn("missing combinations", str(result.feedback_items[0][1]))
119+
120+
def test_excessive_combinations(self):
121+
"""Test that excessive combinations are detected"""
122+
input_table = [
123+
["p", "q"],
124+
["tt", "tt"],
125+
["tt", "ff"],
126+
["ff", "tt"],
127+
["ff", "ff"],
128+
["tt", "tt"]
129+
]
130+
result = evaluate_truth_table(input_table, 2)
131+
self.assertFalse(result.is_correct)
132+
# self.assertIn("excessive combinations", str(result.feedback_items[0][1]))
133+
134+
def test_duplicate_assignments(self):
135+
"""Test that duplicate assignments are detected"""
136+
input_table = [
137+
["p", "q"],
138+
["tt", "tt"],
139+
["tt", "ff"],
140+
["tt", "tt"],
141+
["ff", "ff"]
142+
]
143+
result = evaluate_truth_table(input_table, 2)
144+
self.assertFalse(result.is_correct)
145+
# self.assertIn("duplicated assignment", str(result.feedback_items[0][1]))
146+
147+
def test_incorrect_cell_evaluation(self):
148+
"""Test that incorrect cell values are detected"""
149+
input_table = [
150+
["p", "q", "p ∧ q"],
151+
["tt", "tt", "ff"], # Should be tt
152+
["tt", "ff", "ff"],
153+
["ff", "tt", "ff"],
154+
["ff", "ff", "ff"]
155+
]
156+
result = evaluate_truth_table(input_table, 2)
157+
self.assertFalse(result.is_correct)
158+
# self.assertIn("incorrect cell value", str(result.feedback_items[0][1]))
159+
160+
def test_wrong_number_of_atoms(self):
161+
"""Test when num_atoms doesn't match the actual atoms in table"""
162+
input_table = [
163+
["p", "q"],
164+
["tt", "tt"],
165+
["tt", "ff"],
166+
["ff", "tt"],
167+
["ff", "ff"]
168+
]
169+
result = evaluate_truth_table(input_table, 3)
170+
self.assertFalse(result.is_correct)
171+
172+
def test_complex_formula(self):
173+
"""Test a valid truth table with a complex formula"""
174+
input_table = [
175+
["p", "q", "(p → q) ∧ (q → p)"],
176+
["tt", "tt", "tt"],
177+
["tt", "ff", "ff"],
178+
["ff", "tt", "ff"],
179+
["ff", "ff", "tt"]
180+
]
181+
result = evaluate_truth_table(input_table, 2)
182+
self.assertTrue(result.is_correct)
183+
184+
185+
if __name__ == '__main__':
186+
unittest.main()

0 commit comments

Comments
 (0)