mirror of
https://github.com/penpot/penpot.git
synced 2026-04-25 19:28:12 +00:00
95 lines
3.5 KiB
Clojure
95 lines
3.5 KiB
Clojure
;; 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-rect-test
|
|
(:require
|
|
[app.common.geom.rect :as grc]
|
|
[app.common.math :as mth]
|
|
[clojure.test :as t]))
|
|
|
|
;; ---- update-rect :size ----
|
|
|
|
(t/deftest update-rect-size-sets-all-corners
|
|
(t/testing ":size updates x1/y1 as well as x2/y2 from x/y/width/height"
|
|
(let [r (grc/make-rect 10 20 30 40)
|
|
r' (grc/update-rect r :size)]
|
|
;; x1/y1 must mirror x/y
|
|
(t/is (mth/close? (:x r) (:x1 r')))
|
|
(t/is (mth/close? (:y r) (:y1 r')))
|
|
;; x2/y2 must be x+width / y+height
|
|
(t/is (mth/close? (+ (:x r) (:width r)) (:x2 r')))
|
|
(t/is (mth/close? (+ (:y r) (:height r)) (:y2 r')))))
|
|
|
|
(t/testing ":size is consistent with :corners round-trip"
|
|
;; Applying :size then :corners should recover the original x/y/w/h
|
|
(let [r (grc/make-rect 5 15 100 50)
|
|
r' (-> r (grc/update-rect :size) (grc/update-rect :corners))]
|
|
(t/is (mth/close? (:x r) (:x r')))
|
|
(t/is (mth/close? (:y r) (:y r')))
|
|
(t/is (mth/close? (:width r) (:width r')))
|
|
(t/is (mth/close? (:height r) (:height r')))))
|
|
|
|
(t/testing ":size works for a rect at the origin"
|
|
(let [r (grc/make-rect 0 0 200 100)
|
|
r' (grc/update-rect r :size)]
|
|
(t/is (mth/close? 0 (:x1 r')))
|
|
(t/is (mth/close? 0 (:y1 r')))
|
|
(t/is (mth/close? 200 (:x2 r')))
|
|
(t/is (mth/close? 100 (:y2 r'))))))
|
|
|
|
;; ---- corners->rect ----
|
|
|
|
(t/deftest corners->rect-normal-order
|
|
(t/testing "p1 top-left, p2 bottom-right yields a valid rect"
|
|
(let [r (grc/corners->rect 0 0 10 20)]
|
|
(t/is (grc/rect? r))
|
|
(t/is (mth/close? 0 (:x r)))
|
|
(t/is (mth/close? 0 (:y r)))
|
|
(t/is (mth/close? 10 (:width r)))
|
|
(t/is (mth/close? 20 (:height r))))))
|
|
|
|
(t/deftest corners->rect-reversed-corners
|
|
(t/testing "reversed x-coordinates still produce a positive-width rect"
|
|
(let [r (grc/corners->rect 10 0 0 20)]
|
|
(t/is (grc/rect? r))
|
|
(t/is (mth/close? 0 (:x r)))
|
|
(t/is (mth/close? 10 (:width r)))))
|
|
|
|
(t/testing "reversed y-coordinates still produce a positive-height rect"
|
|
(let [r (grc/corners->rect 0 20 10 0)]
|
|
(t/is (grc/rect? r))
|
|
(t/is (mth/close? 0 (:y r)))
|
|
(t/is (mth/close? 20 (:height r)))))
|
|
|
|
(t/testing "both axes reversed yield the same rect as normal order"
|
|
(let [r-normal (grc/corners->rect 0 0 10 20)
|
|
r-reversed (grc/corners->rect 10 20 0 0)]
|
|
(t/is (mth/close? (:x r-normal) (:x r-reversed)))
|
|
(t/is (mth/close? (:y r-normal) (:y r-reversed)))
|
|
(t/is (mth/close? (:width r-normal) (:width r-reversed)))
|
|
(t/is (mth/close? (:height r-normal) (:height r-reversed))))))
|
|
|
|
(t/deftest corners->rect-from-points
|
|
(t/testing "two-arity overload taking point maps works identically"
|
|
(let [p1 {:x 5 :y 10}
|
|
p2 {:x 15 :y 30}
|
|
r (grc/corners->rect p1 p2)]
|
|
(t/is (grc/rect? r))
|
|
(t/is (mth/close? 5 (:x r)))
|
|
(t/is (mth/close? 10 (:y r)))
|
|
(t/is (mth/close? 10 (:width r)))
|
|
(t/is (mth/close? 20 (:height r)))))
|
|
|
|
(t/testing "two-arity overload with reversed points"
|
|
(let [p1 {:x 15 :y 30}
|
|
p2 {:x 5 :y 10}
|
|
r (grc/corners->rect p1 p2)]
|
|
(t/is (grc/rect? r))
|
|
(t/is (mth/close? 5 (:x r)))
|
|
(t/is (mth/close? 10 (:y r)))
|
|
(t/is (mth/close? 10 (:width r)))
|
|
(t/is (mth/close? 20 (:height r))))))
|