Fixed all failing tests. Two issues:

1. The regression test failures were both errors in the tests rather than in
the code under test;
2. The failure in the 'bulk' test relates to the fact that the new declarative
parser cannot cope with trailing whitespace.
This commit is contained in:
simon 2016-09-23 12:53:00 +01:00
parent ddf967088e
commit 88d707a32e
4 changed files with 18 additions and 16 deletions

View file

@ -6,19 +6,19 @@
## Vegetation rules ## Vegetation rules
;; rules which populate the world with plants ;; rules which populate the world with plants
;; Occasionally, passing birds plant tree seeds into grassland ;; Occasionally, passing birds plant tree seeds into grassland
if state is grassland then 1 chance in 10 state should be heath if state is grassland then 1 chance in 10 state should be heath
;; heath below the treeline grows gradually into forest ;; heath below the treeline grows gradually into forest
if state is heath and altitude is less than 120 then state should be scrub if state is heath and altitude is less than 120 then state should be scrub
if state is scrub then 1 chance in 5 state should be forest if state is scrub then 1 chance in 5 state should be forest
;; Forest on fertile land grows to climax ;; Forest on fertile land grows to climax
if state is forest and fertility is more than 5 and altitude is less than 70 then state should be climax if state is forest and fertility is more than 5 and altitude is less than 70 then state should be climax
;; Climax forest occasionally catches fire (e.g. lightning strikes) ;; Climax forest occasionally catches fire (e.g. lightning strikes)
if state is climax then 1 chance in 500 state should be fire if state is climax then 1 chance in 500 state should be fire
@ -40,7 +40,7 @@ if state is waste then state should be grassland
## Potential blockers ## Potential blockers
;; Forest increases soil fertility. ;; Forest increases soil fertility.
if state is in forest or climax then fertility should be fertility + 1 if state is in forest or climax then fertility should be fertility + 1

View file

@ -41,7 +41,7 @@
lines delimited by the new-line character. Return a list of S-expressions." lines delimited by the new-line character. Return a list of S-expressions."
[string] [string]
;; TODO: tried to do this using with-open, but couldn't make it work. ;; TODO: tried to do this using with-open, but couldn't make it work.
(map parse-rule (remove comment? (split string #"\n")))) (map #(parse-rule (trim %)) (remove comment? (split string #"\n"))))
(defn parse-file (defn parse-file
"Parse rules from successive lines in the file loaded from this `filename`. "Parse rules from successive lines in the file loaded from this `filename`.

View file

@ -7,18 +7,19 @@
(testing "Bulk (file) parsing and compilation" (testing "Bulk (file) parsing and compilation"
(is (= (count (parse-file (as-file "resources/rules.txt"))) 15) (is (= (count (parse-file (as-file "resources/rules.txt"))) 15)
"Should parse all rules and throw no exceptions") "Should parse all rules and throw no exceptions")
(is (empty? (is (empty?
(remove #(= % 'fn) (remove #(= % ':RULE)
(map first (map first
(parse-file (parse-file
(as-file "resources/rules.txt"))))) (as-file "resources/rules.txt")))))
"all parsed rules should be lambda sexprs") "all parsed rules should be lambda sexprs")
(is (= (count (compile-file (as-file "resources/rules.txt"))) 15) (is (= (count (compile-file (as-file "resources/rules.txt"))) 15)
"Should compile all rules and throw no exceptions") "Should compile all rules and throw no exceptions")
(is (empty? (is (empty?
(remove ifn? (remove ifn?
(map first (map first
(compile-file (compile-file
(as-file "resources/rules.txt"))))) (as-file "resources/rules.txt")))))
"all compiled rules should be ifns") "all compiled rules should be ifns")
)) ))

View file

@ -475,12 +475,13 @@
(deftest regression-tests (deftest regression-tests
(testing "Rule in default set which failed on switchover to declarative rules" (testing "Rule in default set which failed on switchover to declarative rules"
(let [afn (compile-rule "if state is scrub then 1 chance in 5 state should be forest") (let [afn (compile-rule "if state is scrub then 1 chance in 1 state should be forest")
world (transform-world world (transform-world
(make-world 3 3) (make-world 3 3)
(list (compile-rule "if x is 2 then altitude should be 11") (list (compile-rule "if x is 2 then altitude should be 11")
(compile-rule "if x is less than 2 then state should be scrub")))] (compile-rule "if x is less than 2 then state should be scrub")))]
(is (= (:state (apply afn (list {:x 1 :y 1} world))) :forest) (is (= (:state (apply afn (list (get-cell world 1 1) world))) :forest)
"Centre cell is scrub, so rule should fire") "Centre cell is scrub, so rule should fire")
(is (= (:state (apply afn (list {:x 2 :y 1} world))) :beach) (is (= (apply afn (list (get-cell world 2 1) world)) nil)
"Middle cell of the strip is not scrub, so rule should not fire.")))) "Middle cell of the strip is not scrub, so rule should not fire."))))