game_test.clj 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. (ns bombnet.game-test
  2. (:require [clojure.test :refer :all]
  3. [bombnet.game :refer :all]))
  4. (deftest board-test
  5. (testing "Board size is correct"
  6. (let [board (new-board 5 7)]
  7. (is (= (count board) 7) "Check height")
  8. (is (= (count (get board 0)) 5) "Check width")))
  9. (testing "Can get cells"
  10. (let [board [["0" "1" "2"] ["3" "4" "5"]]]
  11. (is (= (get-cell board [0 0]) "0"))
  12. (is (= (get-cell board [1 0]) "1"))
  13. (is (= (get-cell board [1 1]) "4"))
  14. (is (= (get-cell board [2 1]) "5")))))
  15. (deftest player-test
  16. (testing "Player can move"
  17. (let [p {:pos [1 1]}
  18. check (fn [p pos]
  19. (is (= (:pos p) pos)))]
  20. (check (move-player p 3 3) [3 3])
  21. (check (move-player p 2 4) [2 4])
  22. (check (move-player p "up") [1 0])
  23. (check (move-player p "down") [1 2])
  24. (check (move-player p "left") [0 1])
  25. (check (move-player p "right") [2 1]))))
  26. (deftest check-test
  27. (testing "Check valid positions"
  28. (let [state {:board (new-board 5 5)
  29. :players [{:id 1 :pos [1 1]}
  30. {:id 2 :pos [2 2]}
  31. {:id 3 :pos [1 2]}
  32. {:id 4 :pos [1 2]}
  33. {:id 5 :pos [1 3]}]
  34. :bombs [{:pos [1 3]}]}]
  35. (is (= #{1} (check-positions state))))))
  36. (deftest move-test
  37. (testing "Can walk normally #> #"
  38. (let [state {:board (new-board 5 5)
  39. :players [{:id 1 :pos [1 1] :action {:type "move" :dir "right"}}]
  40. :bombs []}
  41. new-state (perform-movement state)]
  42. (is (= [2 1] (get-in new-state [:players 0 :pos])))))
  43. (testing "Cannot walk through walls #< #"
  44. (let [state {:board (new-board 5 5)
  45. :players [{:id 1 :pos [1 1] :action {:type "move" :dir "left"}}]
  46. :bombs []}
  47. new-state (perform-movement state)]
  48. (is (= [1 1] (get-in new-state [:players 0 :pos])))))
  49. (testing "Cannot walk through bombs #>Q #"
  50. (let [state {:board (new-board 5 5)
  51. :players [{:id 1 :pos [1 1] :action {:type "move" :dir "right"}}]
  52. :bombs [{:pos [2 1]}]}
  53. new-state (perform-movement state)]
  54. (is (= [1 1] (get-in new-state [:players 0 :pos])))))
  55. (testing "Cannot walk through people #>@ "
  56. (let [state {:board (new-board 5 5)
  57. :players [{:id 1 :pos [1 1] :action {:type "move" :dir "right"}}
  58. {:id 2 :pos [2 1]}]
  59. :bombs []}
  60. new-state (perform-movement state)]
  61. (is (= [1 1] (get-in new-state [:players 0 :pos])))))
  62. (testing "Allow simultaneous movement #>> #"
  63. (let [state {:board (new-board 5 5)
  64. :players [{:id 1 :pos [1 1] :action {:type "move" :dir "right"}}
  65. {:id 2 :pos [2 1] :action {:type "move" :dir "right"}}]
  66. :bombs []}
  67. new-state (perform-movement state)]
  68. (is (= [2 1] (get-in new-state [:players 0 :pos])))
  69. (is (= [3 1] (get-in new-state [:players 1 :pos])))))
  70. (testing "Cannot swap people #>< #"
  71. (let [state {:board (new-board 5 5)
  72. :players [{:id 1 :pos [1 1] :action {:type "move" :dir "right"}}
  73. {:id 2 :pos [2 1] :action {:type "move" :dir "left"}}]
  74. :bombs []}
  75. new-state (perform-movement state)]
  76. (is (= [1 1] (get-in new-state [:players 0 :pos])))
  77. (is (= [2 1] (get-in new-state [:players 1 :pos])))))
  78. (testing "Cannot contest the same square #> <#"
  79. (let [state {:board (new-board 5 5)
  80. :players [{:id 1 :pos [1 1] :action {:type "move" :dir "right"}}
  81. {:id 2 :pos [3 1] :action {:type "move" :dir "left"}}]
  82. :bombs []}
  83. new-state (perform-movement state)]
  84. (is (= [1 1] (get-in new-state [:players 0 :pos])))
  85. (is (= [3 1] (get-in new-state [:players 1 :pos])))))
  86. (testing "Resolves recursively #>>@#"
  87. (let [state {:board (new-board 5 5)
  88. :players [{:id 1 :pos [1 1] :action {:type "move" :dir "right"}}
  89. {:id 2 :pos [2 1] :action {:type "move" :dir "right"}}
  90. {:id 3 :pos [3 1]}]
  91. :bombs []}
  92. new-state (perform-movement state)]
  93. (is (= [1 1] (get-in new-state [:players 0 :pos])))
  94. (is (= [2 1] (get-in new-state [:players 1 :pos]))))))
  95. (deftest bomb-place-test
  96. (testing "Placing a bomb"
  97. (let [state {:board (new-board 3 3)
  98. :players [{:id 1 :pos [1 1] :action {:type "bomb" :timer 5}}]
  99. :bombs []}
  100. new-state (perform-bomb-placement state)]
  101. (is (nil? (get-in new-state [:players 0 :action])))
  102. (is (= [{:pos [1 1] :power 99 :counter 5 :diagonal? false}] (:bombs new-state)))))
  103. (testing "Placing a bomb on a bomb (disallowed)"
  104. (let [troll-bomb {:pos [1 1] :power 1 :counter 1 :diagonal? true}
  105. state {:board (new-board 3 3)
  106. :players [{:id 1 :pos [1 1] :action {:type "bomb" :timer 5}}]
  107. :bombs [troll-bomb]}
  108. new-state (perform-bomb-placement state)]
  109. (is (= [troll-bomb] (:bombs new-state)))))
  110. )
  111. (deftest bomb-test
  112. (testing "People die when they are killed"
  113. (let [troll-bomb {:pos [5 5] :counter 99 :power 0}
  114. state {:board (new-board 7 7)
  115. :players [{:id 1 :pos [1 1]}
  116. {:id 2 :pos [5 5]}]
  117. :bombs [{:pos [1 1] :counter 0 :power 2}
  118. troll-bomb]}
  119. new-state (explode-bombs state)]
  120. (is (get-in new-state [:players 0 :dead?]))
  121. (is (= [troll-bomb] (:bombs new-state)))
  122. (is (= #{[1 1] [1 2] [1 3] [2 1] [3 1]} (:explosion new-state)))))
  123. (testing "Chain explode bombs"
  124. (let [state {:board (new-board 7 7)
  125. :players [{:id 1 :pos [1 5]}]
  126. :bombs [{:pos [1 1] :counter 0 :power 2}
  127. {:pos [1 3] :counter 2 :power 2}]}
  128. new-state (explode-bombs state)]
  129. (is (get-in new-state [:players 0 :dead?]))
  130. (is (empty? (:bombs new-state)))
  131. (is (= #{[1 1] [1 2] [1 3] [2 1] [3 1]
  132. [1 4] [1 5] [2 3] [3 3]}
  133. (:explosion new-state)))))
  134. (testing "Diagonal bombs"
  135. (let [scared-bomb {:pos [1 3] :counter 99 :power 0}
  136. state {:board (new-board 7 7)
  137. :players [{:id 1 :pos [1 1]}]
  138. :bombs [{:pos [1 2] :counter 0 :power 3 :diagonal? true}
  139. scared-bomb]}
  140. new-state (explode-bombs state)]
  141. (is (not (get-in new-state [:players 0 :dead?])))
  142. (is (= [scared-bomb] (:bombs new-state)))
  143. (is (= #{[1 2] [2 1] [2 3] [3 4] [4 5]}
  144. (:explosion new-state))))))