Major overhaul of the parsing of disjunct expressions
... which it turns out have NEVER worked, and badly written tests were masking the problem. Also tagging rules with metadata as first step towards mixing production and flow rules.
This commit is contained in:
parent
fb39f1ee9c
commit
256f9efd5e
16 changed files with 4997 additions and 778 deletions
98
test/mw_parser/simplify_test.clj
Normal file
98
test/mw_parser/simplify_test.clj
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
(ns mw-parser.simplify-test
|
||||
(:require [clojure.test :refer [deftest is testing]]
|
||||
[mw-parser.declarative :refer [parse-rule]]
|
||||
[mw-parser.simplify :refer [simplify]]
|
||||
[mw-parser.utils :refer [search-tree]]))
|
||||
|
||||
((deftest disjunct-condition-test
|
||||
(testing "Generation of disjunct conditions has been producing wrong
|
||||
output -- in a way which didn't actually alter the
|
||||
correctness of the rule -- since the beginning, and because
|
||||
of inadequate and badly written tests, I didn't know it."
|
||||
(let [expected '(:DISJUNCT-CONDITION
|
||||
(:PROPERTY-CONDITION
|
||||
(:SYMBOL "state")
|
||||
(:QUALIFIER (:EQUIVALENCE (:IS "is")))
|
||||
(:SYMBOL "forest"))
|
||||
(:PROPERTY-CONDITION
|
||||
(:SYMBOL "fertility")
|
||||
(:QUALIFIER (:EQUIVALENCE (:IS "is")))
|
||||
(:NUMBER "10")))
|
||||
actual (simplify [:DISJUNCT-CONDITION
|
||||
[:CONDITION
|
||||
[:PROPERTY-CONDITION
|
||||
[:PROPERTY [:SYMBOL "state"]]
|
||||
[:SPACE " "]
|
||||
[:QUALIFIER [:EQUIVALENCE [:IS "is"]]]
|
||||
[:SPACE " "]
|
||||
[:EXPRESSION [:VALUE [:SYMBOL "forest"]]]]]
|
||||
[:SPACE " "]
|
||||
[:OR "or"]
|
||||
[:SPACE " "]
|
||||
[:CONDITIONS
|
||||
[:CONDITION
|
||||
[:PROPERTY-CONDITION
|
||||
[:PROPERTY [:SYMBOL "fertility"]]
|
||||
[:SPACE " "]
|
||||
[:QUALIFIER [:EQUIVALENCE [:IS "is"]]]
|
||||
[:SPACE " "]
|
||||
[:EXPRESSION [:VALUE [:NUMBER "10"]]]]]]])]
|
||||
(is (= actual expected))))))
|
||||
|
||||
(deftest conjunct-condition-test
|
||||
(testing "Conjunct conditions were failing in more or less the same way"
|
||||
(let [expected '(:CONJUNCT-CONDITION
|
||||
(:PROPERTY-CONDITION
|
||||
(:SYMBOL "state")
|
||||
(:QUALIFIER (:EQUIVALENCE (:IS "is")))
|
||||
(:SYMBOL "forest"))
|
||||
(:PROPERTY-CONDITION
|
||||
(:SYMBOL "fertility")
|
||||
(:QUALIFIER (:EQUIVALENCE (:IS "is")))
|
||||
(:NUMBER "10")))
|
||||
actual (simplify [:CONJUNCT-CONDITION
|
||||
[:CONDITION
|
||||
[:PROPERTY-CONDITION
|
||||
[:PROPERTY [:SYMBOL "state"]]
|
||||
[:SPACE " "]
|
||||
[:QUALIFIER [:EQUIVALENCE [:IS "is"]]]
|
||||
[:SPACE " "]
|
||||
[:EXPRESSION [:VALUE [:SYMBOL "forest"]]]]]
|
||||
[:SPACE " "]
|
||||
[:AND "and"]
|
||||
[:SPACE " "]
|
||||
[:CONDITIONS
|
||||
[:CONDITION
|
||||
[:PROPERTY-CONDITION
|
||||
[:PROPERTY [:SYMBOL "fertility"]]
|
||||
[:SPACE " "]
|
||||
[:QUALIFIER [:EQUIVALENCE [:IS "is"]]]
|
||||
[:SPACE " "]
|
||||
[:EXPRESSION [:VALUE [:NUMBER "10"]]]]]]])]
|
||||
(is (= actual expected)))))
|
||||
|
||||
((deftest unchained-disjuncts-test
|
||||
(testing "Disjunct values should not be chained"
|
||||
(let [wrong '(:DISJUNCT-EXPRESSION
|
||||
(:IN "in")
|
||||
(:DISJUNCT-VALUE
|
||||
(:SYMBOL "heath")
|
||||
(:DISJUNCT-VALUE
|
||||
(:SYMBOL "scrub")
|
||||
(:DISJUNCT-VALUE (:SYMBOL "forest")))))
|
||||
parse-tree (search-tree
|
||||
(parse-rule
|
||||
"if state is not in heath or scrub or forest then state should be climax")
|
||||
:DISJUNCT-EXPRESSION)
|
||||
actual (simplify parse-tree)]
|
||||
(is (not (= wrong actual))))
|
||||
(let [expected '(:DISJUNCT-EXPRESSION
|
||||
(:SYMBOL "heath")
|
||||
(:SYMBOL "scrub")
|
||||
(:SYMBOL "forest"))
|
||||
parse-tree (search-tree
|
||||
(parse-rule
|
||||
"if state is not in heath or scrub or forest then state should be climax")
|
||||
:DISJUNCT-EXPRESSION)
|
||||
actual (simplify parse-tree)]
|
||||
(is (= expected actual))))))
|
||||
Loading…
Add table
Add a link
Reference in a new issue