;; This Source Code Form is subject to the terms of the Mozilla Public ;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; file, You can obtain one at http://mozilla.org/MPL/2.0/. ;; ;; Copyright (c) KALEIDOS INC (ns common-tests.geom-test (:require [app.common.geom.matrix :as gmt] [app.common.geom.point :as gpt] [app.common.math :as mth] [app.common.schema :as sm] [clojure.test :as t])) (t/deftest point-constructors-test (t/testing "Create point with both coordinates" (let [p (gpt/point 1 2)] (t/is (= (:x p) 1)) (t/is (= (:y p) 2)))) (t/testing "Create point with single coordinate" (let [p (gpt/point 1)] (t/is (= (:x p) 1)) (t/is (= (:y p) 1)))) (t/testing "Create empty point" (let [p (gpt/point)] (t/is (= (:x p) 0)) (t/is (= (:y p) 0))))) (t/deftest point-add-test (t/testing "Adds two points together" (let [p1 (gpt/point 1 1) p2 (gpt/point 2 2) p3 (gpt/add p1 p2)] (t/is (= (:x p3) 3)) (t/is (= (:y p3) 3))))) (t/deftest point-subtract-test (t/testing "Point substraction" (let [p1 (gpt/point 3 3) p2 (gpt/point 2 2) p3 (gpt/subtract p1 p2)] (t/is (= (:x p3) 1)) (t/is (= (:y p3) 1))))) (t/deftest point-distance-test (let [p1 (gpt/point 0 0) p2 (gpt/point 10 0) d (gpt/distance p1 p2)] (t/is (number? d)) (t/is (= d 10.0)))) (t/deftest point-length-test (let [p1 (gpt/point 10 0) ln (gpt/length p1)] (t/is (number? ln)) (t/is (= ln 10.0)))) (t/deftest point-angle-test (t/testing "Get angle a 90 degree angle" (let [p1 (gpt/point 0 10) angle (gpt/angle p1)] (t/is (number? angle)) (t/is (= angle 90.0)))) (t/testing "Get 45 degree angle" (let [p1 (gpt/point 0 10) p2 (gpt/point 10 10) angle (gpt/angle-with-other p1 p2)] (t/is (number? angle)) (t/is (mth/close? angle 45.0))))) (t/deftest matrix-constructors-test (let [m (gmt/matrix)] (t/is (= 1.0 (.-a m))) (t/is (= 0.0 (.-b m))) (t/is (= 0.0 (.-c m))) (t/is (= 1.0 (.-d m))) (t/is (= 0.0 (.-e m))) (t/is (= 0.0 (.-f m)))) (let [m (gmt/matrix 1 1 1 2 2 2)] (t/is (= 1.0 (.-a m))) (t/is (= 1.0 (.-b m))) (t/is (= 1.0 (.-c m))) (t/is (= 2.0 (.-d m))) (t/is (= 2.0 (.-e m))) (t/is (= 2.0 (.-f m))))) (t/deftest matrix-translate-test (let [m (-> (gmt/matrix) (gmt/translate (gpt/point 2 10)))] (t/is (= m (gmt/matrix 1 0 0 1 2 10))))) (t/deftest matrix-scale-test (let [m (-> (gmt/matrix) (gmt/scale (gpt/point 2)))] (t/is (= m (gmt/matrix 2 0 0 2 0 0))))) (t/deftest matrix-rotate-test (let [m (-> (gmt/matrix) (gmt/rotate 10))] (t/is (= m (gmt/matrix 0.984807753012208 0.17364817766693033 -0.17364817766693033 0.984807753012208 0 0))))) ;; ---- matrix->str (no trailing comma) ---- (t/deftest matrix-str-roundtrip-test (t/testing "Identity matrix encodes and decodes back to equal matrix" (let [m (gmt/matrix) enc (sm/encode gmt/schema:matrix m (sm/string-transformer)) dec (sm/decode gmt/schema:matrix enc (sm/string-transformer))] (t/is (string? enc)) ;; Must not end with a comma (t/is (not= \, (last enc))) (t/is (gmt/close? m dec)))) (t/testing "Arbitrary matrix encodes without trailing comma and round-trips" (let [m (gmt/matrix 2 0.5 -0.5 3 10 20) enc (sm/encode gmt/schema:matrix m (sm/string-transformer)) dec (sm/decode gmt/schema:matrix enc (sm/string-transformer))] (t/is (string? enc)) (t/is (not= \, (last enc))) (t/is (gmt/close? m dec)))) (t/testing "Encoded string contains exactly 5 commas (6 fields)" (let [m (gmt/matrix 1 0 0 1 0 0) enc (sm/encode gmt/schema:matrix m (sm/string-transformer))] (t/is (= 5 (count (filter #(= \, %) enc)))))))