Flow rule generation very nearly correct!
Not all tests pass; additional conditions are not yet evaluated.
This commit is contained in:
parent
2a5d598f28
commit
93a0f3ea1d
8 changed files with 186 additions and 68 deletions
|
|
@ -15,7 +15,7 @@
|
|||
(is (= (first (parse-simple-value '("this" "and" "that"))) :this)
|
||||
"or else just a keyword")
|
||||
(is (= (first (parse-simple-value '("this" "and" "that") true))
|
||||
'(get-int cell :this))
|
||||
'(mw-engine.utils/get-int cell :this))
|
||||
"...unless an integer is explicitly sought, in which case it should be something which gets an integer from the current cell")
|
||||
(is (= (parse-value '()) nil)
|
||||
"if there's nothing to parse, return nil")
|
||||
|
|
@ -24,7 +24,7 @@
|
|||
(is (= (first (parse-value '("this" "and" "that"))) :this)
|
||||
"or else just a keyword")
|
||||
(is (= (first (parse-value '("this" "and" "that") true))
|
||||
'(get-int cell :this))
|
||||
'(mw-engine.utils/get-int cell :this))
|
||||
"...unless an integer is explicitly sought, in which case it should be something which gets an integer from the current cell")
|
||||
(is (= (parse-property-value '()) nil)
|
||||
"if there's nothing to parse, return nil")
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
(ns mw-parser.flow-test
|
||||
(:require ;; [clojure.pprint :as pprint]
|
||||
[clojure.test :refer [deftest is testing]] ;; [mw-engine.core :refer [transform-world]]
|
||||
[mw-parser.flow :refer [parse-flow simplify-flow]]))
|
||||
[mw-parser.declarative :refer [parse]]
|
||||
[mw-parser.simplify :refer [simplify]]))
|
||||
|
||||
(deftest parse-flow-tests
|
||||
(testing "flow-grammar"
|
||||
|
|
@ -31,36 +32,38 @@
|
|||
(:WITH "with")
|
||||
(:FLOW-CONDITIONS
|
||||
(:DETERMINER-CONDITION (:LEAST "least") (:SYMBOL "food")))))
|
||||
actual (simplify-flow (parse-flow rule))]
|
||||
actual (simplify (parse rule))]
|
||||
|
||||
(is (= actual expected) rule))
|
||||
(let [rule "flow 10% food from house having food more than 10 to each house within 2 with food less than 4"
|
||||
expected '(:FLOW-RULE
|
||||
(:PERCENTAGE (:NUMBER "10") "%")
|
||||
(:SYMBOL "food")
|
||||
(:FROM "from")
|
||||
(:SOURCE
|
||||
(:PROPERTY-CONDITION
|
||||
(:SYMBOL "state")
|
||||
(:QUALIFIER (:EQUIVALENCE (:IS "is")))
|
||||
(:EXPRESSION (:VALUE [:SYMBOL "house"])))
|
||||
(:WITH "having")
|
||||
(:PROPERTY-CONDITION
|
||||
(:SYMBOL "food")
|
||||
(:QUALIFIER (:COMPARATIVE-QUALIFIER (:MORE "more") (:THAN "than")))
|
||||
(:NUMBER "10")))
|
||||
(:TO-HOW (:TO-EACH (:TO "to") (:EACH "each")))
|
||||
(:DESTINATION
|
||||
(:PROPERTY-CONDITION
|
||||
(:SYMBOL "state")
|
||||
(:QUALIFIER (:EQUIVALENCE (:IS "is")))
|
||||
(:EXPRESSION (:VALUE [:SYMBOL "house"])))
|
||||
(:WITHIN "within")
|
||||
(:VALUE (:NUMBER "2"))
|
||||
(:WITH "with")
|
||||
(:FLOW-CONDITIONS
|
||||
(:PROPERTY-CONDITION
|
||||
(:SYMBOL "food")
|
||||
(:QUALIFIER (:COMPARATIVE-QUALIFIER (:LESS "less") (:THAN "than")))
|
||||
(:NUMBER "4")))))
|
||||
actual (simplify-flow (parse-flow rule))]
|
||||
expected '(:FLOW-RULE
|
||||
(:FLOW "flow")
|
||||
(:QUANTITY (:PERCENTAGE (:NUMBER "10") "%"))
|
||||
(:SYMBOL "food")
|
||||
(:FROM "from")
|
||||
(:SOURCE
|
||||
(:PROPERTY-CONDITION
|
||||
(:SYMBOL "state")
|
||||
(:QUALIFIER (:EQUIVALENCE (:IS "is")))
|
||||
(:EXPRESSION (:VALUE [:SYMBOL "house"])))
|
||||
(:WITH "having")
|
||||
(:PROPERTY-CONDITION
|
||||
(:SYMBOL "food")
|
||||
(:QUALIFIER
|
||||
(:COMPARATIVE-QUALIFIER (:MORE "more") (:THAN "than")))
|
||||
(:NUMBER "10")))
|
||||
(:TO-HOW (:TO-EACH (:TO "to") (:EACH "each")))
|
||||
(:DESTINATION
|
||||
(:TARGET
|
||||
(:PROPERTY-CONDITION
|
||||
(:SYMBOL "state") (:QUALIFIER (:EQUIVALENCE (:IS "is")))
|
||||
(:EXPRESSION (:VALUE [:SYMBOL "house"])))
|
||||
(:RANGE (:WITHIN "within") (:NUMBER "2")))
|
||||
(:WITH "with")
|
||||
(:PROPERTY-CONDITION
|
||||
(:SYMBOL "food")
|
||||
(:QUALIFIER
|
||||
(:COMPARATIVE-QUALIFIER (:LESS "less") (:THAN "than")))
|
||||
(:NUMBER "4"))))
|
||||
actual (simplify (parse rule))]
|
||||
(is (= actual expected) rule))))
|
||||
|
|
|
|||
|
|
@ -1,19 +1,17 @@
|
|||
(ns mw-parser.generate-test
|
||||
(:require [clojure.test :refer [deftest is testing]]
|
||||
[mw-parser.generate :refer [generate]]))
|
||||
|
||||
;; TODO: these tests are badly written and many (all?!?) of them were not
|
||||
;; actually firing. rewrite ALL to the pattern:
|
||||
;;
|
||||
;; (let [actual ...
|
||||
;; expected ...]
|
||||
;; (is (= actual expected)))
|
||||
[mw-parser.generate :refer [generate]]
|
||||
[mw-parser.declarative :refer [parse]]
|
||||
[mw-parser.simplify :refer [simplify]]))
|
||||
|
||||
(deftest expressions-tests
|
||||
(testing "Generating primitive expressions."
|
||||
(is (= (generate '(:NUMERIC-EXPRESSION (:NUMBER "50"))) 50))
|
||||
(is (= (generate '(:NUMERIC-EXPRESSION (:SYMBOL "sealevel")))
|
||||
'(:sealevel cell)))))
|
||||
(let [actual (generate '(:NUMERIC-EXPRESSION (:NUMBER "50")))
|
||||
expected 50]
|
||||
(is (= actual expected)))
|
||||
(let [actual (generate '(:NUMERIC-EXPRESSION (:SYMBOL "sealevel")))
|
||||
expected '(:sealevel cell)]
|
||||
(is (= actual expected)))))
|
||||
|
||||
(deftest lhs-generators-tests
|
||||
(testing "Generating left-hand-side fragments of rule functions from appropriate fragments of parse trees"
|
||||
|
|
@ -85,3 +83,20 @@
|
|||
actual-meta (meta actual)]
|
||||
(is (= actual expected))
|
||||
(is (= actual-meta expected-meta)))))
|
||||
|
||||
(deftest metadata-tests
|
||||
(testing "Rules have correct metadata"
|
||||
(let [expected :production
|
||||
actual (:rule-type
|
||||
(meta
|
||||
(generate
|
||||
(simplify
|
||||
(parse "if state is house then state should be waste")))))]
|
||||
(is (= actual expected)))
|
||||
(let [expected :flow
|
||||
actual (:rule-type
|
||||
(meta
|
||||
(generate
|
||||
(simplify
|
||||
(parse "flow 10% food from house to house within 2 with least food")))))]
|
||||
(is (= actual expected)))))
|
||||
Loading…
Add table
Add a link
Reference in a new issue