def test_logic_onearg(): assert And() is True assert Or() is False assert And(T) == T assert And(F) == F assert Or(T) == T assert Or(F) == F assert And('a') == 'a' assert Or('a') == 'a'
def test_logic_not(): assert Not(False) is True assert Not('a') != '~a' assert Not('~a') != 'a' # NOTE: we may want to change default Not behaviour and put this # functionality into some method. assert Not(And('a', 'b')) == Or(Not('a'), Not('b')) assert Not(Or('a', 'b')) == And(Not('a'), Not('b')) pytest.raises(ValueError, lambda: Not(ValueError))
def test_FactRules_parse(): f = FactRules('a -> b') assert f.prereq == {'b': {'a'}, 'a': {'b'}} f = FactRules('a -> ~b') assert f.prereq == {'b': {'a'}, 'a': {'b'}} f = FactRules('~a -> b') assert f.prereq == {'b': {'a'}, 'a': {'b'}} f = FactRules('~a -> ~b') assert f.prereq == {'b': {'a'}, 'a': {'b'}} f = FactRules('~z == nz') assert f.prereq == {'z': {'nz'}, 'nz': {'z'}} pytest.raises(ValueError, lambda: FactRules('a ? b')) f = FactRules('a -> b & ~b') # trivial test assert not f.prereq # tautologies assert not FactRules('a -> a | b').prereq # XXX: We don't support non-atomic left operands, so use Prover directly p = Prover() p.process_rule(And('a', 'b'), 'a') p.process_rule(Or('a', 'b'), 'a') assert not p.proved_rules
def test_logic_combine_args(): assert And('a', 'b', 'a') == And('a', 'b') assert Or('a', 'b', 'a') == Or('a', 'b') assert And(And('a', 'b'), And('c', 'd')) == And('a', 'b', 'c', 'd') assert Or(Or('a', 'b'), Or('c', 'd')) == Or('a', 'b', 'c', 'd') assert Or('t', And('n', 'p', 'r'), And('n', 'r'), And('n', 'p', 'r'), 't', And('n', 'r')) == \ Or('t', And('n', 'p', 'r'), And('n', 'r'))
def test_logic_fromstring(): s = Logic.fromstring assert s('a') == 'a' assert s('~a') == Not('a') assert s('a & b') == And('a', 'b') assert s('a | b') == Or('a', 'b') assert s('a | b & c') == And(Or('a', 'b'), 'c') assert s('a & b | c') == Or(And('a', 'b'), 'c') assert s('a & b & c') == And('a', 'b', 'c') assert s('a | b | c') == Or('a', 'b', 'c') pytest.raises(ValueError, lambda: s('| a')) pytest.raises(ValueError, lambda: s('& a')) pytest.raises(ValueError, lambda: s('a | | b')) pytest.raises(ValueError, lambda: s('a | & b')) pytest.raises(ValueError, lambda: s('a & & b')) pytest.raises(ValueError, lambda: s('a |')) pytest.raises(ValueError, lambda: s('a|b')) pytest.raises(ValueError, lambda: s('~')) pytest.raises(ValueError, lambda: s('~ a')) pytest.raises(ValueError, lambda: s('a b')) pytest.raises(ValueError, lambda: s(''))
def test_logic_expand(): t = And(Or('a', 'b'), 'c') assert t.expand() == Or(And('a', 'c'), And('b', 'c')) t = And(Or('a', Not('b')), 'b') assert t.expand() == And('a', 'b') t = And(Or('a', 'b'), Or('c', 'd')) assert t.expand() == \ Or(And('a', 'c'), And('a', 'd'), And('b', 'c'), And('b', 'd'))
def test_logic_eval_TF(): assert And(F, F) == F assert And(F, T) == F assert And(T, F) == F assert And(T, T) == T assert Or(F, F) == F assert Or(F, T) == T assert Or(T, F) == T assert Or(T, T) == T assert And('a', T) == 'a' assert And('a', F) == F assert Or('a', T) == T assert Or('a', F) == 'a'
def test_logic_xnotx(): assert And('a', Not('a')) == F assert Or('a', Not('a')) == T