Work on test coverage. Tedious, but useful.
This commit is contained in:
parent
e07dc7098c
commit
5328e89c96
39 changed files with 1608 additions and 982 deletions
|
|
@ -2,7 +2,7 @@
|
|||
(:require [clojure.math.numeric-tower :as m]
|
||||
[clojure.test :refer :all]
|
||||
[walkmap.edge :refer :all]
|
||||
[walkmap.vertex :refer [vertex]]))
|
||||
[walkmap.vertex :refer [vertex vertex=]]))
|
||||
|
||||
(deftest edge-test
|
||||
(testing "identification of edges."
|
||||
|
|
@ -98,12 +98,12 @@
|
|||
|
||||
(deftest parallel-test
|
||||
(testing "parallelism"
|
||||
(is (parallel? {:start {:x 0.0 :y 0.0 :z 0.0 :walkmap.id/id 'foo} :end {:x 3 :y 4 :z 0.0 :walkmap.id/id 'bar}}
|
||||
{:start {:x 1.0 :y 2.0 :z 3.5 :walkmap.id/id 'foo} :end {:x 4.0 :y 6.0 :z 3.5 :walkmap.id/id 'bar}})
|
||||
(is (parallel? (edge (vertex 0.0 0.0 0.0) (vertex 3 4 0.0))
|
||||
(edge (vertex 1.0 2.0 3.5) (vertex 4.0 6.0 3.5)))
|
||||
"Should be")
|
||||
(is (not
|
||||
(parallel? {:start {:x 0.0 :y 0.0 :z 0.0 :walkmap.id/id 'foo} :end {:x 3 :y 4 :z 0.0 :walkmap.id/id 'bar}}
|
||||
{:start {:x 1.0 :y 2.0 :z 3.5 :walkmap.id/id 'foo} :end {:x 4.0 :y 6.0 :z 3.49 :walkmap.id/id 'bar}}))
|
||||
(parallel? (edge (vertex 0.0 0.0 0.0) (vertex 3 4 0.0))
|
||||
(edge (vertex 1.0 2.0 3.5) (vertex 4.0 6.0 3.49))))
|
||||
"Should not be!")))
|
||||
|
||||
(deftest overlaps2d-test
|
||||
|
|
@ -113,9 +113,9 @@
|
|||
|
||||
(deftest unit-vector-test
|
||||
(testing "deriving the unit vector"
|
||||
(is (=
|
||||
(unit-vector {:start {:x 0.0 :y 0.0 :z 0.0 :walkmap.id/id 'foo} :end {:x 3 :y 4 :z 0.0 :walkmap.id/id 'bar}})
|
||||
{:x 0.6, :y 0.8, :z 0.0}))
|
||||
(is (=
|
||||
(unit-vector {:start {:x 1.0 :y 2.0 :z 3.5 :walkmap.id/id 'foo} :end {:x 4.0 :y 6.0 :z 3.5 :walkmap.id/id 'bar}})
|
||||
{:x 0.6, :y 0.8, :z 0.0}))))
|
||||
(is (vertex=
|
||||
(unit-vector (edge (vertex 0.0 0.0 0.0) (vertex 3 4 0.0)))
|
||||
(vertex 0.6 0.8 0.0)))
|
||||
(is (vertex=
|
||||
(unit-vector (edge (vertex 1.0 2.0 3.5) (vertex 4.0 6.0 3.5)))
|
||||
(vertex 0.6 0.8 0.0)))))
|
||||
|
|
|
|||
53
test/walkmap/ocean_test.clj
Normal file
53
test/walkmap/ocean_test.clj
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
(ns walkmap.ocean-test
|
||||
(:require [clojure.test :refer :all]
|
||||
[walkmap.ocean :refer :all]
|
||||
[walkmap.polygon :refer [polygon]]
|
||||
[walkmap.vertex :refer [vertex vertex=]]))
|
||||
|
||||
(deftest ocean-tests
|
||||
(testing "Identification of polygons at sea level"
|
||||
(is (ocean? (polygon (vertex 0 0 0) (vertex 0 1 0) (vertex 1 0 0)))
|
||||
"All `:z` coordinates are zero, and default binding for `*sea-level*`
|
||||
=> ocean.")
|
||||
(is (false? (ocean? (polygon (vertex 0 0 1) (vertex 0 1 0) (vertex 1 0 0))))
|
||||
"Not all `:z` coordinates are zero, and default binding for `*sea-level*`
|
||||
=> not ocean.")
|
||||
(is (false? (ocean? (polygon (vertex 0 0 5) (vertex 0 1 5) (vertex 1 0 5))))
|
||||
"Not all `:z` coordinates are five, and default binding for `*sea-level*`
|
||||
=> not ocean.")
|
||||
(binding [*sea-level* 5]
|
||||
(is (false? (ocean? (polygon (vertex 0 0 0) (vertex 0 1 0) (vertex 1 0 0))))
|
||||
"All `:z` coordinates are zero, and `*sea-level*` rebound to five
|
||||
=> not ocean.")
|
||||
(is (false? (ocean? (polygon (vertex 0 0 1) (vertex 0 1 0) (vertex 1 0 0))))
|
||||
"Not all `:z` coordinates are zero, and `*sea-level*` rebound to five
|
||||
=> not ocean.")
|
||||
(is (ocean? (polygon (vertex 0 0 5) (vertex 0 1 5) (vertex 1 0 5)))
|
||||
"Not all `:z` coordinates are five, and `*sea-level*` rebound to five
|
||||
=> ocean."))))
|
||||
|
||||
(deftest cull-ocean-facets-tests
|
||||
(testing "Culling of ocean facets (not currently used)."
|
||||
(let [stl {:facets [(polygon (vertex 0 0 0) (vertex 0 1 0) (vertex 1 0 0))
|
||||
(polygon (vertex 0 0 1) (vertex 0 1 0) (vertex 1 0 0))
|
||||
(polygon (vertex 0 0 5) (vertex 0 1 5) (vertex 1 0 5))]}
|
||||
expected {:facets
|
||||
[(polygon (vertex 0 0 1) (vertex 0 1 0) (vertex 1 0 0))
|
||||
(polygon (vertex 0 0 5) (vertex 0 1 5) (vertex 1 0 5))]}
|
||||
actual (cull-ocean-facets stl)]
|
||||
(map
|
||||
#(is (vertex= (nth (:facets expected) %) (nth (:facets actual) %))
|
||||
(str "Facet " % " did not match."))
|
||||
(range (max (count (:facets expected)) (count (:facets actual))))))
|
||||
(binding [*sea-level* 5]
|
||||
(let [stl {:facets [(polygon (vertex 0 0 0) (vertex 0 1 0) (vertex 1 0 0))
|
||||
(polygon (vertex 0 0 1) (vertex 0 1 0) (vertex 1 0 0))
|
||||
(polygon (vertex 0 0 5) (vertex 0 1 5) (vertex 1 0 5))]}
|
||||
expected {:facets
|
||||
[(polygon (vertex 0 0 0) (vertex 0 1 0) (vertex 1 0 0))
|
||||
(polygon (vertex 0 0 1) (vertex 0 1 0) (vertex 1 0 0))]}
|
||||
actual (cull-ocean-facets stl)]
|
||||
(map
|
||||
#(is (vertex= (nth (:facets expected) %) (nth (:facets actual) %))
|
||||
(str "Facet " % " did not match."))
|
||||
(range (max (count (:facets expected)) (count (:facets actual)))))))))
|
||||
109
test/walkmap/path_test.clj
Normal file
109
test/walkmap/path_test.clj
Normal file
|
|
@ -0,0 +1,109 @@
|
|||
(ns walkmap.path-test
|
||||
(:require [clojure.test :refer :all]
|
||||
[walkmap.edge :refer [edge?]]
|
||||
[walkmap.path :refer :all]
|
||||
[walkmap.polygon :refer [polygon]]
|
||||
[walkmap.utils :refer [kind-type]]
|
||||
[walkmap.vertex :refer [vertex vertex=]]))
|
||||
|
||||
(deftest path-tests
|
||||
(testing "Path instantiation"
|
||||
(is (= (kind-type (path (vertex 0 0 0) (vertex 1 1 1))) :path)
|
||||
"Paths should be identified as paths.")
|
||||
(is (path? (path (vertex 0 0 0) (vertex 1 1 1)))
|
||||
"Paths should test as paths.")
|
||||
(is (check-path (path (vertex 0 0 0) (vertex 1 1 1)))
|
||||
"No exception should be thrown when checking a valid path.")
|
||||
(is (thrown?
|
||||
IllegalArgumentException
|
||||
(check-path
|
||||
(update-in
|
||||
(path (vertex 0 0 0) (vertex 1 1 1))
|
||||
:vertices
|
||||
conj
|
||||
"Not a vertex")))
|
||||
"Checking an invalid path should throw an exception.")
|
||||
(is (thrown?
|
||||
IllegalArgumentException
|
||||
(path (vertex 0 0 0)))
|
||||
"Too short.")
|
||||
(is (thrown?
|
||||
IllegalArgumentException
|
||||
(path (vertex 0 0 0) (vertex 1 1 1) "Not a vertex"))
|
||||
"Non-vertex included.")
|
||||
(is (thrown?
|
||||
IllegalArgumentException
|
||||
(path (vertex 0 0 0) (vertex 1 1 1) "Not a vertex."))
|
||||
"Passing something which is not a vertex when constructing a path whould
|
||||
cause an exception to be thrown.")))
|
||||
|
||||
(deftest conversion-tests
|
||||
(testing "Converting polygons to paths"
|
||||
(let [poly (polygon (vertex 0 0 0) (vertex 1 0 0) (vertex 1 1 0) (vertex 0 1 0))
|
||||
p (polygon->path poly)]
|
||||
(is (path? p) "Should be a path.")
|
||||
(is (vertex= (first p) (last p))
|
||||
"First and last vertices of the generated path should be equal to
|
||||
one another.")
|
||||
(is (= (count (:vertices path)) (inc (count (:vertices poly))))
|
||||
"The generated path should have one more vertex than the polygon.")
|
||||
(map
|
||||
#(is (vertex= (nth (:vertices poly) %) (nth (:vertices p) %))
|
||||
(str "Vertex " % " from each set of vertices should be the same."))
|
||||
(range (count (:vertices poly))))))
|
||||
(testing "Converting polygons and paths to edges."
|
||||
(let [poly (polygon (vertex 0 0 0) (vertex 1 0 0) (vertex 1 1 0) (vertex 0 1 0))
|
||||
edges (path->edges poly)]
|
||||
(is (every? edge? edges)
|
||||
"Every returned edge should be an edge.")
|
||||
(is (= (count (:vertices poly)) (count edges))
|
||||
"There should be the same number of edges as the vertices of the polygon")
|
||||
(map
|
||||
#(is
|
||||
(vertex= (nth (:vertices poly) %) (:start (nth edges %)))
|
||||
(str
|
||||
"Each edge should start from the same place as the corresponding
|
||||
vertex: " %))
|
||||
(range (count (:vertices poly))))
|
||||
(map
|
||||
#(is
|
||||
(vertex= (nth (:vertices poly) (mod (inc %) (count (:vertices poly))))
|
||||
(:end (nth edges %)))
|
||||
(str
|
||||
"Each edge should end at the same place as the subsequent
|
||||
vertex: " %))
|
||||
(range (count (:vertices poly)))))
|
||||
(is (thrown? IllegalArgumentException
|
||||
(path->edges "Not a legal argument.")))))
|
||||
|
||||
(deftest check-paths-tests
|
||||
(testing "Checking multiple paths."
|
||||
(is (thrown? IllegalArgumentException
|
||||
(check-paths [(path (vertex 0 0 0)
|
||||
(vertex 1 0 0)
|
||||
(vertex 1 1 0)
|
||||
(vertex 0 1 0)
|
||||
(vertex 0 0 0))
|
||||
(path (vertex 0 0 1)
|
||||
(vertex 1 0 1)
|
||||
(vertex 1 1 1)
|
||||
(vertex 0 1 1)
|
||||
(vertex 0 0 1))
|
||||
(vertex 0 0 0)]))
|
||||
"Not all elements are paths")
|
||||
(is (check-paths [(path (vertex 0 0 0)
|
||||
(vertex 1 0 0)
|
||||
(vertex 1 1 0)
|
||||
(vertex 0 1 0)
|
||||
(vertex 0 0 0))
|
||||
(path (vertex 0 0 1)
|
||||
(vertex 1 0 1)
|
||||
(vertex 1 1 1)
|
||||
(vertex 0 1 1)
|
||||
(vertex 0 0 1))])
|
||||
"All elements are paths")))
|
||||
|
||||
(deftest length-tests
|
||||
(testing "length of paths"
|
||||
(let [p (path (vertex 0 0 0) (vertex 1 0 0) (vertex 1 1 0) (vertex 0 1 0) (vertex 0 0 0))]
|
||||
(is (= (length p) 4) "By inspection."))))
|
||||
81
test/walkmap/polygon_test.clj
Normal file
81
test/walkmap/polygon_test.clj
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
(ns walkmap.polygon-test
|
||||
(:require [clojure.test :refer :all]
|
||||
;; [clojure.algo.generic.math-functions :as m]
|
||||
;; [walkmap.edge :refer [edge?]]
|
||||
;; [walkmap.path :refer :all]
|
||||
[walkmap.polygon :refer :all]
|
||||
[walkmap.utils :refer [kind-type]]
|
||||
[walkmap.vertex :refer [vertex vertex? vertex=]])
|
||||
)
|
||||
|
||||
(deftest polygon-tests
|
||||
(testing "Constructing polygons"
|
||||
(let [square (polygon (vertex 0 0 0) (vertex 1 0 0)
|
||||
(vertex 1 1 0) (vertex 0 1 0))
|
||||
triangle (polygon (vertex 0 0 0) (vertex 0 3 0)
|
||||
(vertex 4 0 0))]
|
||||
(is (= (kind-type square) :polygon)
|
||||
"Square should have `:kind` = `:polygon`.")
|
||||
(is (= (kind-type triangle) :polygon)
|
||||
"Triangle should have `:kind` = `:polygon`.")
|
||||
(is (polygon? square) "Square should be a polygon.")
|
||||
(is (polygon? triangle) "Triangle should be a polygon.")
|
||||
(is (false? (triangle? square)) "Square is not a triangle.")
|
||||
(is (triangle? triangle) "Triangle is a triangle.")
|
||||
(is (check-polygon square) "No exception should be thrown.")
|
||||
(is (check-polygon triangle) "No exception should be thrown.")
|
||||
(is (check-triangle triangle) "No exception should be thrown.")
|
||||
(is (check-polygons [square triangle])
|
||||
"No exception should be thrown.")
|
||||
(is (thrown?
|
||||
IllegalArgumentException
|
||||
(check-polygon "Not a polygon")) "Not a polygon")
|
||||
(is (thrown?
|
||||
IllegalArgumentException
|
||||
(check-polygons [square triangle "Not a polygon"]))
|
||||
"One value is not a polygon.")
|
||||
(is (thrown?
|
||||
IllegalArgumentException (check-triangle square))
|
||||
"Not a triangle.")
|
||||
(is (thrown?
|
||||
IllegalArgumentException (polygon (vertex 0 0 0) (vertex 1 0 0)))
|
||||
"Too few vertices.")
|
||||
(is (thrown?
|
||||
IllegalArgumentException (polygon (vertex 0 0 0) (vertex 1 0 0)
|
||||
(vertex 1 1 0) "Not a vertex"
|
||||
(vertex 0 1 0)))
|
||||
"Non-vertex included.")
|
||||
)
|
||||
))
|
||||
|
||||
(deftest gradient-tests
|
||||
(testing "Finding the gradient across a triangle."
|
||||
(let [tri (polygon (vertex 0 0 1) (vertex 1 0 0) (vertex 1 1 0.5))
|
||||
gra (gradient tri)]
|
||||
(is (nil? (:gradient tri)) "Basic trangle should not have a gradient.")
|
||||
(is (vertex? (:gradient gra))
|
||||
"After passing through gradient function, it should have a gradient.")
|
||||
;; TODO: I need to check that the gradient is being computed correclt,
|
||||
;; but my brain isn't up to the trigonometry just now.
|
||||
)))
|
||||
|
||||
(deftest centre-tests
|
||||
(testing "Finding the centres of polygons."
|
||||
(let [square (polygon (vertex 0 0 0) (vertex 1 0 0)
|
||||
(vertex 1 1 0) (vertex 0 1 0))
|
||||
triangle (polygon (vertex 0 0 0) (vertex 0 3 0)
|
||||
(vertex 4 0 0))
|
||||
centred (centre triangle)]
|
||||
(is (vertex= (:centre centred) (vertex 1.3333333 1.0 0.0))
|
||||
"By inspection (check this maths!).")
|
||||
(is (thrown?
|
||||
UnsupportedOperationException
|
||||
(centre square))
|
||||
"We can't yet find the centre of a quadrilateral, but we should be
|
||||
able to do so, so it isn't an illegal argument, it just doesn't
|
||||
work.")
|
||||
(is (thrown?
|
||||
IllegalArgumentException
|
||||
(centre "Not a polygon"))
|
||||
"Anything else that isn't a polygon, though, is an illegal argument."))))
|
||||
|
||||
45
test/walkmap/vertex_test.clj
Normal file
45
test/walkmap/vertex_test.clj
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
(ns walkmap.utils-test
|
||||
(:require [clojure.test :refer :all]
|
||||
[walkmap.vertex :refer :all]))
|
||||
|
||||
(deftest vertex-equal-tests
|
||||
(testing "Equality of vertices"
|
||||
(is (vertex= (vertex 0 0 0) (vertex 0 0 0))
|
||||
"should be equal")
|
||||
(is (vertex= (vertex 0 0 0) (vertex 0.0000001 0 0))
|
||||
"differences less than one part in a million should be ignored")
|
||||
(is (vertex= (vertex 0 0 0) (vertex 0 0 1))
|
||||
"should not be equal")
|
||||
(is (thrown? IllegalArgumentException
|
||||
(vertex= (vertex 0 0 0) "Not a vertex"))
|
||||
"Exception should be thrown: not a vertex.")))
|
||||
|
||||
(deftest vertex-multiply-tests
|
||||
(testing "multiplication of vertices"
|
||||
(let [v (vertex (rand) (rand) (rand))
|
||||
u (vertex 1 1 1)
|
||||
v' (vertex* v u)]
|
||||
(is (vertex= v v')
|
||||
"Multiplication by {:x 1 :y 1 :z 1} should not change the vertex"))
|
||||
(let [v (vertex 0.333333 0.25 0.2)
|
||||
d (vertex 3 4 5)
|
||||
v' (vertex* v d)
|
||||
expected (vertex 1 1 1)]
|
||||
(is (vertex= expected v')
|
||||
"Multiplication by values other than {:x 1 :y 1 :z 1} should change
|
||||
the vertex"))
|
||||
(let [v (vertex 0.333333 0.25 0.2)
|
||||
d (vertex 3 4)
|
||||
v' (vertex* v d)
|
||||
expected (vertex 1 1 0.2)]
|
||||
(is (vertex= expected v')
|
||||
"Multiplication by a 2D vertex should not change `:z`"))
|
||||
(let [v (vertex 0.333333 0.25)
|
||||
d (vertex 3 4)
|
||||
v' (vertex* v d)
|
||||
expected (vertex 1 1 0)]
|
||||
(is (vertex= expected v')
|
||||
"Multiplication of a 2D vertex should result in `:z` = zero"))
|
||||
(is (thrown? IllegalArgumentException
|
||||
(vertex* (vertex 0 0 0) "Not a vertex"))
|
||||
"Exception should be thrown: not a vertex.")))
|
||||
Loading…
Add table
Add a link
Reference in a new issue