From 85d1a8df24814f5b48bec11669f2bb1120d92f3a Mon Sep 17 00:00:00 2001 From: Dominik Piatek Date: Mon, 3 Apr 2017 20:53:33 +0100 Subject: [PATCH] Add launchpad renderer --- project.clj | 6 +++-- src/game_of_life/core.clj | 29 ++++++++-------------- src/game_of_life/renderer.clj | 13 ++++++++++ test/game_of_life/renderer_test.clj | 38 +++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 21 deletions(-) create mode 100644 src/game_of_life/renderer.clj create mode 100644 test/game_of_life/renderer_test.clj diff --git a/project.clj b/project.clj index bd20597..1453114 100644 --- a/project.clj +++ b/project.clj @@ -3,5 +3,7 @@ :url "http://example.com/FIXME" :license {:name "Eclipse Public License" :url "http://www.eclipse.org/legal/epl-v10.html"} - :dependencies [[org.clojure/clojure "1.8.0"]] - :main game-of-life.core) + :main ^:skip-aot game-of-life.core + :dependencies [[org.clojure/clojure "1.8.0"] + [clj-launchpad "0.3.2"] + [circleci/bond "0.2.9"]]) diff --git a/src/game_of_life/core.clj b/src/game_of_life/core.clj index eef03a4..6fb5dce 100644 --- a/src/game_of_life/core.clj +++ b/src/game_of_life/core.clj @@ -1,26 +1,17 @@ (ns game-of-life.core - (:require [game-of-life.game :refer :all])) + (:require [game-of-life.game :refer :all] + [game-of-life.renderer :as r] + [clj-launchpad :as launchpad])) -(def initial-grid - (random-grid 80 60 0.4)) - -(defn clear - [] - (print (str (char 27) "[2J"))) ; clear screen +(def lpad (launchpad/open)) -(defn render - [grid cell empty] - (print (str (char 27) "[;H")) ; move cursor to the top left corner of the screen - (println (to-string grid cell empty))) +(def initial-grid + (random-grid 9 8 0.35)) (defn -main "Run some thing!" [] - (let [emoji "◻️"] - (clear) - (render initial-grid emoji " ") - (Thread/sleep 1000) - (loop [grid initial-grid] - (render grid emoji " ") - (Thread/sleep 100) - (recur (game-step grid))))) + (loop [grid initial-grid] + (r/draw-grid lpad grid) + (Thread/sleep 100) + (recur (game-step grid)))) diff --git a/src/game_of_life/renderer.clj b/src/game_of_life/renderer.clj new file mode 100644 index 0000000..f4de8e4 --- /dev/null +++ b/src/game_of_life/renderer.clj @@ -0,0 +1,13 @@ +(ns game-of-life.renderer + (:require [clj-launchpad :as launchpad] + [game-of-life.game :as game])) + +(defn draw-grid + "Draws a grid on the launchpad" + [device grid] + (game/grid-map + (fn [x y v] + (if (true? v) + (launchpad/draw-grid device x y :green) + (launchpad/draw-grid device x y :off))) + grid)) diff --git a/test/game_of_life/renderer_test.clj b/test/game_of_life/renderer_test.clj new file mode 100644 index 0000000..a8cb548 --- /dev/null +++ b/test/game_of_life/renderer_test.clj @@ -0,0 +1,38 @@ +(ns game-of-life.renderer-test + (:require [clojure.test :refer :all] + [bond.james :as bond :refer [with-stub]] + [game-of-life.renderer :as renderer] + [clj-launchpad :as launchpad])) + +(def lpad :lpad) + +(deftest renderer-test + (testing "lights up top left corner light" + (with-stub [[launchpad/draw-grid (fn [& args] args)]] + (let [initial-grid [[true false] + [false false]]] + (renderer/draw-grid lpad initial-grid) + (is (= '(:lpad 0 0 :green) (-> launchpad/draw-grid bond/calls (nth 0) :args))) + (is (= '(:lpad 1 0 :off) (-> launchpad/draw-grid bond/calls (nth 1) :args))) + (is (= '(:lpad 0 1 :off) (-> launchpad/draw-grid bond/calls (nth 2) :args))) + (is (= '(:lpad 1 1 :off) (-> launchpad/draw-grid bond/calls (nth 3) :args)))))) + + (testing "lights up bottom right corner" + (with-stub [[launchpad/draw-grid (fn [& args] args)]] + (let [initial-grid [[false false] + [false true]]] + (renderer/draw-grid lpad initial-grid) + (is (= '(:lpad 0 0 :off) (-> launchpad/draw-grid bond/calls (nth 0) :args))) + (is (= '(:lpad 1 0 :off) (-> launchpad/draw-grid bond/calls (nth 1) :args))) + (is (= '(:lpad 0 1 :off) (-> launchpad/draw-grid bond/calls (nth 2) :args))) + (is (= '(:lpad 1 1 :green) (-> launchpad/draw-grid bond/calls (nth 3) :args)))))) + + (testing "lights up bottom right and top left" + (with-stub [[launchpad/draw-grid (fn [& args] args)]] + (let [initial-grid [[true false] + [false true]]] + (renderer/draw-grid lpad initial-grid) + (is (= '(:lpad 0 0 :green) (-> launchpad/draw-grid bond/calls (nth 0) :args))) + (is (= '(:lpad 1 0 :off) (-> launchpad/draw-grid bond/calls (nth 1) :args))) + (is (= '(:lpad 0 1 :off) (-> launchpad/draw-grid bond/calls (nth 2) :args))) + (is (= '(:lpad 1 1 :green) (-> launchpad/draw-grid bond/calls (nth 3) :args)))))))