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__)
|