rule.py
1 # SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-or-later OR CERN-OHL-S-2.0+ OR Apache-2.0 2 # type: ignore 3 import unittest 4 5 from pdkmaster.technology import rule as _rle 6 7 8 class RuleTest(unittest.TestCase): 9 def test_error(self): 10 class MyRule(_rle._Rule): 11 def __init__(self): 12 pass 13 14 def __eq__(self, other: object) -> bool: 15 return super().__eq__(other) 16 17 def __hash__(self): 18 return super().__hash__() 19 20 rule = MyRule() 21 22 with self.assertRaises(TypeError): 23 rule == rule 24 with self.assertRaises(TypeError): 25 hash(rule) 26 with self.assertRaises(ValueError): 27 bool(rule) 28 29 def test_rule(self): 30 class MyRule(_rle._Rule): 31 def __init__(self, *, name: str): 32 self.name = name 33 34 def __eq__(self, other): 35 return isinstance(other, MyRule) and self.name == other.name 36 37 def __hash__(self): 38 return hash(self.name) 39 40 rule1 = MyRule(name="Rule1") 41 rule1b = MyRule(name="Rule1") 42 rule2 = MyRule(name="Rule2") 43 44 self.assertEqual(rule1, rule1b) 45 self.assertEqual(hash(rule1), hash(rule1b)) 46 self.assertNotEqual(rule1, rule2) 47 48 # Just create a Rules object to increase code coverage 49 rules = _rle.Rules((rule1, rule2)) 50 self.assertEqual(rule1, rules[0]) 51 52 def test_condition(self): 53 class MyCond(_rle._Condition): 54 def __init__(self, *, str1: str, str2: str): 55 super().__init__(elements=(str1, str2)) 56 57 def __repr__(self): 58 return f"MyCond(str1={self._elements[0]!r}, str2={self._elements[1]!r})" 59 60 strs = ("Hello", "world") 61 cond = MyCond(str1=strs[0], str2=strs[1]) 62 cond2 = MyCond(str1=strs[0], str2=strs[1]) 63 64 self.assertNotEqual(cond, strs[0]) 65 self.assertEqual(cond, cond2) 66 self.assertEqual(hash(cond), hash(cond2)) 67 self.assertEqual(hash(cond), hash(strs))