import unittest
from dds3 import calc_par, calc_par_from_table, calc_dd_table
R2 = 0x0004
R3 = 0x0008
R4 = 0x0010
R5 = 0x0020
R6 = 0x0040
R7 = 0x0080
R8 = 0x0100
R9 = 0x0200
RT = 0x0400
RJ = 0x0800
RQ = 0x1000
RK = 0x2000
RA = 0x4000
class TestCalcPar(unittest.TestCase):
def _hand0_table_deal(self) -> dict:
return {
"cards": [
[RQ|RJ|R6, RK|R6|R5|R2, RJ|R8|R5, RT|R9|R8],
[R8|R7|R3, RJ|R9|R7, RA|RT|R7|R6|R4, RQ|R4],
[RK|R5, RT|R8|R3, RK|RQ|R9, RA|R7|R6|R5|R2],
[RA|RT|R9|R4|R2, RA|RQ|R4, R3|R2, RK|RJ|R3],
]
}
def _hand1_table_deal(self) -> dict:
return {
"cards": [
[RA|RK|R9|R6, RK|RQ|R8, RA|R9|R8, RK|R6|R3],
[RQ|RJ|RT|R5|R4|R3|R2, RT, R6, RQ|RJ|R8|R2],
[0, RJ|R9|R7|R5|R4|R3, RK|R7|R5|R3|R2, R9|R4],
[R8|R7, RA|R6|R2, RQ|RJ|RT|R4, RA|RT|R7|R5],
]
}
def test_calc_par_basic_hand0(self) -> None:
table_deal = self._hand0_table_deal()
result = calc_par(table_deal, vulnerable=0)
self.assertTrue(isinstance(result, dict))
self.assertTrue("dd_table" in result)
self.assertTrue("par_results" in result)
self.assertTrue("res_table" in result["dd_table"])
self.assertTrue(isinstance(result["dd_table"]["res_table"], list))
self.assertTrue("par_score" in result["par_results"])
self.assertTrue("par_contracts_string" in result["par_results"])
def test_calc_par_vulnerability_variations(self) -> None:
table_deal = self._hand0_table_deal()
for vuln in [0, 1, 2, 3]:
result = calc_par(table_deal, vulnerable=vuln)
self.assertTrue(isinstance(result, dict))
self.assertTrue("dd_table" in result)
self.assertTrue("par_results" in result)
def test_calc_par_invalid_vulnerability(self) -> None:
table_deal = self._hand0_table_deal()
try:
calc_par(table_deal, vulnerable=-1)
self.fail("Expected ValueError for vulnerable=-1")
except ValueError:
pass
try:
calc_par(table_deal, vulnerable=4)
self.fail("Expected ValueError for vulnerable=4")
except ValueError:
pass
def test_calc_par_hand1(self) -> None:
table_deal = self._hand1_table_deal()
result = calc_par(table_deal, vulnerable=2)
self.assertTrue(isinstance(result, dict))
self.assertTrue("dd_table" in result)
self.assertTrue("par_results" in result)
self.assertTrue("res_table" in result["dd_table"])
def test_calc_par_result_consistency(self) -> None:
table_deal = self._hand0_table_deal()
result1 = calc_par(table_deal, vulnerable=0)
result2 = calc_par(table_deal, vulnerable=0)
self.assertTrue(result1["par_results"]["par_score"] == result2["par_results"]["par_score"])
class TestCalcParFromTable(unittest.TestCase):
def _hand0_table_deal(self) -> dict:
return {
"cards": [
[RQ|RJ|R6, RK|R6|R5|R2, RJ|R8|R5, RT|R9|R8],
[R8|R7|R3, RJ|R9|R7, RA|RT|R7|R6|R4, RQ|R4],
[RK|R5, RT|R8|R3, RK|RQ|R9, RA|R7|R6|R5|R2],
[RA|RT|R9|R4|R2, RA|RQ|R4, R3|R2, RK|RJ|R3],
]
}
def test_calc_par_from_table_basic(self) -> None:
table_deal = self._hand0_table_deal()
dd_result = calc_dd_table(table_deal)
par_result = calc_par_from_table(dd_result, vulnerable=0)
self.assertTrue(isinstance(par_result, dict))
self.assertTrue("par_score" in par_result)
self.assertTrue("par_contracts_string" in par_result)
def test_calc_par_from_table_vulnerability_variations(self) -> None:
table_deal = self._hand0_table_deal()
dd_result = calc_dd_table(table_deal)
for vuln in [0, 1, 2, 3]:
par_result = calc_par_from_table(dd_result, vulnerable=vuln)
self.assertTrue(isinstance(par_result, dict))
self.assertTrue("par_score" in par_result)
def test_calc_par_from_table_invalid_vulnerability(self) -> None:
table_deal = self._hand0_table_deal()
dd_result = calc_dd_table(table_deal)
try:
calc_par_from_table(dd_result, vulnerable=-1)
self.fail("Expected ValueError for vulnerable=-1")
except ValueError:
pass
try:
calc_par_from_table(dd_result, vulnerable=4)
self.fail("Expected ValueError for vulnerable=4")
except ValueError:
pass
class TestCalcParIntegration(unittest.TestCase):
def _hand0_table_deal(self) -> dict:
return {
"cards": [
[RQ|RJ|R6, RK|R6|R5|R2, RJ|R8|R5, RT|R9|R8],
[R8|R7|R3, RJ|R9|R7, RA|RT|R7|R6|R4, RQ|R4],
[RK|R5, RT|R8|R3, RK|RQ|R9, RA|R7|R6|R5|R2],
[RA|RT|R9|R4|R2, RA|RQ|R4, R3|R2, RK|RJ|R3],
]
}
def test_calc_par_vs_from_table_consistency(self) -> None:
table_deal = self._hand0_table_deal()
cp_result = calc_par(table_deal, vulnerable=0)
dd_result = calc_dd_table(table_deal)
cfp_result = calc_par_from_table(dd_result, vulnerable=0)
self.assertTrue(cp_result["par_results"]["par_score"] == cfp_result["par_score"])
self.assertTrue(cp_result["par_results"]["par_contracts_string"] == cfp_result["par_contracts_string"])
def test_calc_par_dd_table_matches_calc_dd_table(self) -> None:
table_deal = self._hand0_table_deal()
cp_result = calc_par(table_deal, vulnerable=0)
dd_result = calc_dd_table(table_deal)
self.assertTrue(cp_result["dd_table"]["res_table"] == dd_result["res_table"])
def test_calc_par_multiple_vulnerabilities(self) -> None:
table_deal = self._hand0_table_deal()
dd_result = calc_dd_table(table_deal)
for vuln in [0, 1, 2, 3]:
cp_result = calc_par(table_deal, vulnerable=vuln)
cfp_result = calc_par_from_table(dd_result, vulnerable=vuln)
self.assertTrue(cp_result["par_results"]["par_score"] == cfp_result["par_score"])
if __name__ == "__main__":
unittest.main()