Worked on test coverage.
This commit is contained in:
		
							parent
							
								
									07628817bd
								
							
						
					
					
						commit
						34bb22dbfe
					
				
					 2 changed files with 35 additions and 2 deletions
				
			
		| 
						 | 
					@ -65,7 +65,7 @@
 | 
				
			||||||
(defn parse-numeric-value
 | 
					(defn parse-numeric-value
 | 
				
			||||||
  "Parse a number."
 | 
					  "Parse a number."
 | 
				
			||||||
  [[value & remainder]]
 | 
					  [[value & remainder]]
 | 
				
			||||||
  (if (re-matches re-number value) [(read-string value) remainder]))
 | 
					  (if (and value (re-matches re-number value)) [(read-string value) remainder]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(defn parse-property-int
 | 
					(defn parse-property-int
 | 
				
			||||||
  "Parse a token assumed to be the name of a property of the current cell, 
 | 
					  "Parse a token assumed to be the name of a property of the current cell, 
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,6 +6,20 @@
 | 
				
			||||||
  (:require [clojure.test :refer :all]
 | 
					  (:require [clojure.test :refer :all]
 | 
				
			||||||
            [mw-parser.core :refer :all]))
 | 
					            [mw-parser.core :refer :all]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(deftest primitives-tests
 | 
				
			||||||
 | 
					  (testing "Simple functions supporting the parser"
 | 
				
			||||||
 | 
					           (is (= (parse-value '()) nil)
 | 
				
			||||||
 | 
					               "if there's nothing to parse, return nil")
 | 
				
			||||||
 | 
					           (is (= (first (parse-value '("1234" "and" "that"))) 1234)
 | 
				
			||||||
 | 
					               "a simple value is expected to be just a number.")
 | 
				
			||||||
 | 
					           (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))
 | 
				
			||||||
 | 
					               "...unless an integer is explicitly sought, in which case it should be something which gets an integer from the current cell")
 | 
				
			||||||
 | 
					           ))
 | 
				
			||||||
 | 
					           
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(deftest rules-tests
 | 
					(deftest rules-tests
 | 
				
			||||||
  (testing "Rule parser - does not test whether generated functions actually work, just that something is generated!"
 | 
					  (testing "Rule parser - does not test whether generated functions actually work, just that something is generated!"
 | 
				
			||||||
           (is (parse-rule "if altitude is less than 100 and state is forest then state should be climax and deer should be 3"))
 | 
					           (is (parse-rule "if altitude is less than 100 and state is forest then state should be climax and deer should be 3"))
 | 
				
			||||||
| 
						 | 
					@ -134,6 +148,14 @@
 | 
				
			||||||
  (testing "Number neighbours have property equal to value"
 | 
					  (testing "Number neighbours have property equal to value"
 | 
				
			||||||
           (let [afn (compile-rule "if 3 neighbours have state equal to new then state should be water")
 | 
					           (let [afn (compile-rule "if 3 neighbours have state equal to new then state should be water")
 | 
				
			||||||
                 world (make-world 3 3)]
 | 
					                 world (make-world 3 3)]
 | 
				
			||||||
 | 
					             (is (= (apply afn (list {:x 0 :y 0} world))
 | 
				
			||||||
 | 
					                    {:state :water :x 0 :y 0})
 | 
				
			||||||
 | 
					                 "Rule fires when condition is met (in a new world all cells are new, corner cell has three neighbours)")
 | 
				
			||||||
 | 
					             (is (nil? (apply afn (list {:x 1 :y 1} world)))
 | 
				
			||||||
 | 
					                 "Middle cell has eight neighbours, so rule does not fire."))
 | 
				
			||||||
 | 
					           (let [afn (compile-rule "if 3 neighbours are new then state should be water")
 | 
				
			||||||
 | 
					                 world (make-world 3 3)]
 | 
				
			||||||
 | 
					             ;; 'are new' should be the same as 'have state equal to new'
 | 
				
			||||||
             (is (= (apply afn (list {:x 0 :y 0} world))
 | 
					             (is (= (apply afn (list {:x 0 :y 0} world))
 | 
				
			||||||
                    {:state :water :x 0 :y 0})
 | 
					                    {:state :water :x 0 :y 0})
 | 
				
			||||||
                 "Rule fires when condition is met (in a new world all cells are new, corner cell has three neighbours)")
 | 
					                 "Rule fires when condition is met (in a new world all cells are new, corner cell has three neighbours)")
 | 
				
			||||||
| 
						 | 
					@ -182,7 +204,18 @@
 | 
				
			||||||
             (is (= (:state (apply afn (list {:x 1 :y 1} world))) :beach)
 | 
					             (is (= (:state (apply afn (list {:x 1 :y 1} world))) :beach)
 | 
				
			||||||
                 "Rule fires when condition is met (strip of altitude 11 down right hand side)")
 | 
					                 "Rule fires when condition is met (strip of altitude 11 down right hand side)")
 | 
				
			||||||
             (is (nil? (apply afn (list {:x 2 :y 1} world)))
 | 
					             (is (nil? (apply afn (list {:x 2 :y 1} world)))
 | 
				
			||||||
                 "Middle cell of the strip has only two high neighbours, so rule should not fire.")))
 | 
					                 "Middle cell of the strip has only two high neighbours, so rule should not fire."))
 | 
				
			||||||
 | 
					           (let [afn (compile-rule "if more than 2 neighbours are grassland then state should be beach")
 | 
				
			||||||
 | 
					                 ;; 'are grassland' should mean the same as 'have state equal to grassland'.
 | 
				
			||||||
 | 
					                 world (transform-world 
 | 
				
			||||||
 | 
					                         (make-world 3 3)
 | 
				
			||||||
 | 
					                         (list (compile-rule "if x is 2 then altitude should be 11 and state should be grassland")
 | 
				
			||||||
 | 
					                               (compile-rule "if x is less than 2 then altitude should be 0 and state should be water")))]
 | 
				
			||||||
 | 
					             (is (= (:state (apply afn (list {:x 1 :y 1} world))) :beach)
 | 
				
			||||||
 | 
					                 "Rule fires when condition is met (strip of altitude 11 down right hand side)")
 | 
				
			||||||
 | 
					             (is (nil? (apply afn (list {:x 2 :y 1} world)))
 | 
				
			||||||
 | 
					                 "Middle cell of the strip has only two high neighbours, so rule should not fire."))
 | 
				
			||||||
 | 
					           )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (testing "Fewer than number neighbours have property equal to numeric-value"
 | 
					  (testing "Fewer than number neighbours have property equal to numeric-value"
 | 
				
			||||||
           (let [afn (compile-rule "if fewer than 3 neighbours have altitude equal to 11 then state should be beach")
 | 
					           (let [afn (compile-rule "if fewer than 3 neighbours have altitude equal to 11 then state should be beach")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue