From 5d37ad29eb87304c7ef6e83b65b0c22330a08a07 Mon Sep 17 00:00:00 2001 From: Simon Brooke Date: Sun, 12 Apr 2020 17:13:49 +0100 Subject: [PATCH] Sweep-up of changes on illuminator --- .../merchants/merchant_utils.clj.html | 188 +++++++++++------- docs/index.html | 4 +- project.clj | 5 +- src/the_great_game/core.clj | 6 - .../merchants/merchant_utils.clj | 46 +++-- .../the_great_game/merchants/markets_test.clj | 31 ++- .../merchants/merchant_utils_test.clj | 103 ++++++++++ 7 files changed, 281 insertions(+), 102 deletions(-) delete mode 100644 src/the_great_game/core.clj diff --git a/docs/cloverage/the_great_game/merchants/merchant_utils.clj.html b/docs/cloverage/the_great_game/merchants/merchant_utils.clj.html index 70cd0f3..8774b44 100644 --- a/docs/cloverage/the_great_game/merchants/merchant_utils.clj.html +++ b/docs/cloverage/the_great_game/merchants/merchant_utils.clj.html @@ -64,13 +64,13 @@ 020    [merchant world]
- + 021    (let [m (cond
022              (keyword? merchant)
- + 023              (-> world :merchants merchant)
@@ -79,8 +79,8 @@ 025              merchant)
- - 026          cargo (:stock m)] + + 026          cargo (or (:stock m) {})]
027      (reduce @@ -94,7 +94,7 @@ 030        (map
- + 031          #(* (cargo %) (-> world :commodities % :weight))
@@ -124,7 +124,7 @@ 040              (keyword? merchant)
- + 041              (-> world :merchants merchant)
@@ -133,152 +133,194 @@ 043              merchant)]
- - 044      (quot + + 044      (max
- - 045        (- (:capacity m) (burden m world)) + + 045        0 +
+ + 046        (quot +
+ + 047          (- (or (:capacity m) 0) (burden m world))
- 046        (-> world :commodities commodity :weight)))) + 048          (-> world :commodities commodity :weight)))))
- 047   + 049  
- 048  (defn can-afford + 050  (defn can-afford
- 049    "Return the number of units of this `commodity` which this `merchant` + 051    "Return the number of units of this `commodity` which this `merchant`
- 050    can afford to buy in this `world`." + 052    can afford to buy in this `world`."
- 051    [merchant world commodity] + 053    [merchant world commodity]
- 052    (let [m (cond + 054    (let [m (cond
- 053              (keyword? merchant) + 055              (keyword? merchant)
- - 054              (-> world :merchants merchant) + + 056              (-> world :merchants merchant)
- 055              (map? merchant) + 057              (map? merchant)
- 056              merchant) + 058              merchant)
- 057          l (:location m)] + 059          l (:location m)] +
+ + 060      (cond +
+ + 061        (nil? m) +
+ + 062        (throw (Exception. "No merchant?")) +
+ + 063        (or (nil? l) (nil? (-> world :cities l))) +
+ + 064        (throw (Exception. (str "No known location for merchant " m))) +
+ + 065        :else
- 058      (quot + 066        (quot
- 059        (:cash m) + 067          (:cash m)
- 060        (-> world :cities l :prices commodity)))) + 068          (-> world :cities l :prices commodity)))))
- 061   + 069  
- 062  (defn add-stock + 070  (defn add-stock
- 063    "Where `a` and `b` are both maps all of whose values are numbers, return + 071    "Where `a` and `b` are both maps all of whose values are numbers, return
- 064    a map whose keys are a union of the keys of `a` and `b` and whose values + 072    a map whose keys are a union of the keys of `a` and `b` and whose values
- 065    are the sums of their respective values." + 073    are the sums of their respective values."
- 066    [a b] + 074    [a b]
- - 067    (reduce + + 075    (reduce
- - 068      merge + + 076      merge
- - 069      a + + 077      a
- - 070      (map + + 078      (map
- - 071        #(hash-map % (+ (or (a %) 0) (or (b %) 0))) + + 079        #(hash-map % (+ (or (a %) 0) (or (b %) 0)))
- - 072        (keys b)))) + + 080        (keys b))))
- 073   + 081  
- 074  (defn add-known-prices + 082  (defn add-known-prices
- 075    "Add the current prices at this `merchant`'s location in the `world` + 083    "Add the current prices at this `merchant`'s location in the `world`
- 076    to a new cacke of known prices, and return it." + 084    to a new cache of known prices, and return it."
- 077    [merchant world] + 085    [merchant world]
- 078    (let [m (cond + 086    (let [m (cond
- 079              (keyword? merchant) + 087              (keyword? merchant)
- 080              (-> world :merchants merchant) + 088              (-> world :merchants merchant)
- 081              (map? merchant) + 089              (map? merchant)
- 082              merchant) + 090              merchant) +
+ + 091          k (or (:known-prices m) {})
- 083          k (:known-prices m) + 092          l (:location m)
- - 084          l (:location m) -
- - 085          d (:date world) + + 093          d (or (:date world) 0)
- 086          p (-> world :cities l :prices)] -
- - 087      (reduce -
- - 088        merge -
- - 089        k + 094          p (-> world :cities l :prices)]
- 090        (map + 095      (cond +
+ + 096        (nil? m) +
+ + 097        (throw (Exception. "No merchant?")) +
+ + 098        (or (nil? l) (nil? (-> world :cities l))) +
+ + 099        (throw (Exception. (str "No known location for merchant " m))) +
+ + 100        :else +
+ + 101        (reduce +
+ + 102          merge +
+ + 103          k +
+ + 104          (map
- 091          #(hash-map % (apply vector cons {:price (p %) :date d} (k %))) + 105            #(hash-map % (apply vector cons {:price (p %) :date d} (k %)))
- 092          (-> world :commodities keys))))) + 106            (-> world :commodities keys))))))
diff --git a/docs/index.html b/docs/index.html index 35656b5..044b871 100644 --- a/docs/index.html +++ b/docs/index.html @@ -6,8 +6,8 @@

The Great Game: Dcocumentation

diff --git a/project.clj b/project.clj index ff35841..67a2163 100644 --- a/project.clj +++ b/project.clj @@ -4,6 +4,7 @@ :doc/format :markdown} :output-path "docs/codox" :source-uri "https://github.com/simon-brooke/the-great-game/blob/master/{filepath}#L{line}"} + :cucumber-feature-paths ["test/features/"] :dependencies [[org.clojure/clojure "1.8.0"] [environ "1.1.0"] [com.taoensso/timbre "4.10.0"]] @@ -11,7 +12,9 @@ :license {:name "GNU General Public License,version 2.0 or (at your option) any later version" :url "https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html"} :plugins [[lein-cloverage "1.1.1"] - [lein-codox "0.10.7"]] + [lein-codox "0.10.7"] + [lein-cucumber "1.0.2"] + [lein-gorilla "0.4.0"]] :release-tasks [["vcs" "assert-committed"] ["change" "version" "leiningen.release/bump-version" "release"] diff --git a/src/the_great_game/core.clj b/src/the_great_game/core.clj deleted file mode 100644 index 7a102ed..0000000 --- a/src/the_great_game/core.clj +++ /dev/null @@ -1,6 +0,0 @@ -(ns the-great-game.core) - -(defn foo - "I don't do a whole lot." - [x] - (println x "Hello, World!")) diff --git a/src/the_great_game/merchants/merchant_utils.clj b/src/the_great_game/merchants/merchant_utils.clj index b8cd969..9cfb5b4 100644 --- a/src/the_great_game/merchants/merchant_utils.clj +++ b/src/the_great_game/merchants/merchant_utils.clj @@ -23,7 +23,7 @@ (-> world :merchants merchant) (map? merchant) merchant) - cargo (:stock m)] + cargo (or (:stock m) {})] (reduce + 0 @@ -41,9 +41,11 @@ (-> world :merchants merchant) (map? merchant) merchant)] - (quot - (- (:capacity m) (burden m world)) - (-> world :commodities commodity :weight)))) + (max + 0 + (quot + (- (or (:capacity m) 0) (burden m world)) + (-> world :commodities commodity :weight))))) (defn can-afford "Return the number of units of this `commodity` which this `merchant` @@ -55,9 +57,15 @@ (map? merchant) merchant) l (:location m)] - (quot - (:cash m) - (-> world :cities l :prices commodity)))) + (cond + (nil? m) + (throw (Exception. "No merchant?")) + (or (nil? l) (nil? (-> world :cities l))) + (throw (Exception. (str "No known location for merchant " m))) + :else + (quot + (:cash m) + (-> world :cities l :prices commodity))))) (defn add-stock "Where `a` and `b` are both maps all of whose values are numbers, return @@ -73,20 +81,26 @@ (defn add-known-prices "Add the current prices at this `merchant`'s location in the `world` - to a new cacke of known prices, and return it." + to a new cache of known prices, and return it." [merchant world] (let [m (cond (keyword? merchant) (-> world :merchants merchant) (map? merchant) merchant) - k (:known-prices m) + k (or (:known-prices m) {}) l (:location m) - d (:date world) + d (or (:date world) 0) p (-> world :cities l :prices)] - (reduce - merge - k - (map - #(hash-map % (apply vector cons {:price (p %) :date d} (k %))) - (-> world :commodities keys))))) + (cond + (nil? m) + (throw (Exception. "No merchant?")) + (or (nil? l) (nil? (-> world :cities l))) + (throw (Exception. (str "No known location for merchant " m))) + :else + (reduce + merge + k + (map + #(hash-map % (apply vector cons {:price (p %) :date d} (k %))) + (-> world :commodities keys)))))) diff --git a/test/the_great_game/merchants/markets_test.clj b/test/the_great_game/merchants/markets_test.clj index bc3f515..7cacd30 100644 --- a/test/the_great_game/merchants/markets_test.clj +++ b/test/the_great_game/merchants/markets_test.clj @@ -79,8 +79,31 @@ (-> actual :cities :falkirk :stock :iron) 17) "Stock should be topped up by the difference between the supply and - the demand amount.")) + the demand amount.")))) - ) - - ) +(deftest run-test + (let [world (deep-merge + default-world + {:cities + {:aberdeen + {:stock {:fish 5} + :supplies {:fish 12} + :prices {:fish 1.1}} + :falkirk + {:stock {:iron 10} + :demands {:iron 5} + :supplies {:iron 12} + :prices {:iron 1.1}}}}) + actual (run world)] + (is + (= + (-> actual :cities :aberdeen :stock :fish) + (+ (-> world :cities :aberdeen :supplies :fish) + (-> world :cities :aberdeen :stock :fish))) + "If stock is not empty and price is above cost, stock should be topped up by supply amount.") + (is + (= + (-> actual :cities :falkirk :stock :iron) + 17) + "Stock should be topped up by the difference between the supply and + the demand amount."))) diff --git a/test/the_great_game/merchants/merchant_utils_test.clj b/test/the_great_game/merchants/merchant_utils_test.clj index 2f9071e..086c691 100644 --- a/test/the_great_game/merchants/merchant_utils_test.clj +++ b/test/the_great_game/merchants/merchant_utils_test.clj @@ -22,3 +22,106 @@ expected 1.7] ;; (is (= actual expected) "if information select the most recent"))))) +(deftest burden-test + (testing "Burden of merchant" + (let [world (deep-merge + default-world + {:merchants + {:archie + {:stock + {:iron 1}} + :belinda + {:stock + {:fish 2}} + :callum + {:stock + {:iron 1 + :fish 1}}}})] + (let [actual (burden :archie world) + expected (-> world :commodities :iron :weight)] + (is (= actual expected))) + (let [actual (burden :belinda world) + expected (* 2 (-> world :commodities :fish :weight))] + (is (= actual expected))) + (let [actual (burden :callum world) + expected (+ + (-> world :commodities :iron :weight) + (-> world :commodities :fish :weight))] + (is (= actual expected))) + (let [actual (burden {} world) + expected 0] + (is (= actual expected))) + (let [actual (burden (-> world :merchants :deidre) world) + expected 0] + (is (= actual expected)))))) + +(deftest can-carry-test + (testing "What merchants can carry" + (let [world (deep-merge + default-world + {:merchants + {:archie + {:cash 5 + :stock + {:iron 1}} + :belinda + {:stock + {:fish 2}} + :callum + {:stock + {:iron 1 + :fish 1}}}})] + (let [actual (can-carry :archie world :fish) + expected 0] + (is (= actual expected))) + (let [actual (can-carry :belinda world :fish) + expected 8] + (is (= actual expected))) + (let [actual (can-carry (-> world :merchants :archie) world :fish) + expected 0] + (is (= actual expected))) + (let [actual (can-carry {:stock {:fish 7} :capacity 10} world :fish) + expected 3] + (is (= actual expected)))))) + + +(deftest affordability-test + (testing "What merchants can afford to purchase" + (let [world (deep-merge + default-world + {:merchants + {:archie + {:cash 5 + :stock + {:iron 1}} + :belinda + {:stock + {:fish 2}} + :callum + {:stock + {:iron 1 + :fish 1}}}})] + (let [actual (can-afford :archie world :fish) + expected 5] + (is (= actual expected))) + (let [actual (can-afford :belinda world :fish) + expected 100] + (is (= actual expected))) + (let [actual (can-afford (-> world :merchants :archie) world :fish) + expected 5] + (is (= actual expected))) + (let [actual (can-afford {:cash 3 :location :buckie} world :fish) + expected 3] + (is (= actual expected))) + (is (thrown-with-msg? + Exception + #"No merchant?" + (can-afford :no-one world :fish))) + (is (thrown-with-msg? + Exception + #"No known location for merchant.*" + (can-afford {:cash 3} world :fish)))))) + +(deftest add-stock-test + (let [actual (add-stock {:iron 2 :fish 5} {:fish 3 :whisky 7}) + expected {:iron 2 :fish 8 :whisky 7}]))