... 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.
98 lines
4.7 KiB
Clojure
98 lines
4.7 KiB
Clojure
(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)))))) |