summaryrefslogtreecommitdiff
path: root/tests/test_ts_utils.py
blob: 8d9e3506ca432510e6ccd036224cb1e42339328c (plain)
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
"""Tests for ts_utils.py"""
# pylint: disable=pointless-statement,import-error
from external.bazel_python.pytest_helper import main
from ts_lib import TripletStructure
from ts_utils import RegisterRule, RegisterPrototype, AssertNodesEqual

def test_register_rule():
    """Tests the RegisterRule(...) macro."""
    ts = TripletStructure()
    with ts.scope(":Rule"):
        with ts.scope(":MustMap") as exist:
            ts[":A"].map({ts[":B"]: ts[":C"]})
        with ts.scope(":Insert"):
            ts[":D"].map({exist[":A"]: ts["/:X"]})
        with ts.scope(":Hello"):
            ts[":E"].map({exist[":A"]: exist["/:B"]})
        ts.commit()
        RegisterRule(ts)
    # The 3 facts above + 5 below
    assert len(ts.lookup(None, None, None)) == 8
    assert ts.lookup("/:Rule:RuleMap:0", "/:Rule:_", "/RULE")
    assert ts.lookup("/:Rule:RuleMap:0", "/:Rule:MustMap:A", "/MUST_MAP")
    assert ts.lookup("/:Rule:RuleMap:0", "/:Rule:MustMap:B", "/MUST_MAP")
    assert ts.lookup("/:Rule:RuleMap:0", "/:Rule:MustMap:C", "/MUST_MAP")
    assert ts.lookup("/:Rule:RuleMap:0", "/:Rule:Insert:D", "/INSERT")
    freeze_frame = ts.freeze_frame()

    # Now test custom_qualifiers argument.
    ts.rollback(0) # Before registering the rule.
    with ts.scope(":Rule"):
        RegisterRule(ts, custom_qualifiers=dict({":Hello": "/INSERT"}))
    delta = ts.freeze_frame() - freeze_frame
    assert not (delta.add_nodes or delta.remove_nodes or delta.remove_facts)
    assert (delta.add_facts
            == set({("/:Rule:RuleMap:0", "/:Rule:Hello:E", "/INSERT")}))

    # Now test auto_assert_equal
    ts.rollback(0)
    with ts.scope(":Rule"):
        with ts.scope(":MustMap") as exist:
            ts[":A"].map({ts[":B"]: ts[":C"]})
        with ts.scope(":Insert"):
            ts[":D"].map({ts[":B"]: ts["/:X"]})
        RegisterRule(ts, auto_assert_equal=True)
    delta = ts.freeze_frame() - freeze_frame
    assert not (delta.remove_nodes or delta.remove_facts)
    assert (delta.add_nodes
            == set({"/=", "/:Rule:Insert:B", "/:Rule:Equivalence:0"}))
    assert (delta.add_facts
            == set({
                ("/:Rule:Equivalence:0", "/:Rule:Insert:B", "/="),
                ("/:Rule:Equivalence:0", "/:Rule:MustMap:B", "/="),
                ("/:Rule:Equivalence:0", "/:Rule:_", "/RULE"),
                ("/:Rule:Insert:D", "/:Rule:Insert:B", "/:X"),
                ("/:Rule:RuleMap:0", "/:Rule:Insert:B", "/INSERT"),
            }))

def test_register_prototype():
    """Tests the RegisterPrototype(...) macro."""
    ts = TripletStructure()
    with ts.scope(":Rule"):
        ts[":A"].map({ts[":B"]: ts[":C"]})
        ts[":D"].map({ts[":A"]: ts["/:X"]})
        ts.commit()
        RegisterPrototype(ts, dict({
            ":RecognizeAIsX": {ts["/INSERT"]: [ts[":D"]]},
        }), [])
    # 2 above + 6 below
    assert len(ts.lookup(None, None, None)) == 8
    assert ts.lookup("/:Rule:RecognizeAIsX:RuleMap:0",
                     "/:Rule:RecognizeAIsX:_",
                     "/RULE")
    assert ts.lookup("/:Rule:RecognizeAIsX:RuleMap:0", "/:Rule:D", "/INSERT")
    assert ts.lookup("/:Rule:RecognizeAIsX:RuleMap:0", "/:Rule:D", "/NO_MAP")
    assert ts.lookup("/:Rule:RecognizeAIsX:RuleMap:0", "/:Rule:A", "/MUST_MAP")
    assert ts.lookup("/:Rule:RecognizeAIsX:RuleMap:0", "/:Rule:B", "/MUST_MAP")
    assert ts.lookup("/:Rule:RecognizeAIsX:RuleMap:0", "/:Rule:C", "/MUST_MAP")

    with ts.scope(":Rule"):
        AssertNodesEqual(ts, ts[":B, :C"], ":RecognizeAIsX")
        AssertNodesEqual(ts, ts[":A, :B"], ":RecognizeAIsX",
                         equal_type="/MAYBE=")
    freeze_frame = ts.freeze_frame()
    ts.rollback()
    with ts.scope(":Rule"):
        RegisterPrototype(ts, dict({
            ":RecognizeAIsX": {ts["/INSERT"]: [ts[":D"]]},
        }), [ts[":B, :C"]], [ts[":A, :B"]])
    assert ts.freeze_frame() == freeze_frame

main(__name__, __file__)
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback