mirror of
https://github.com/penpot/penpot.git
synced 2026-05-11 02:58:25 +00:00
Three critical fixes for app.common.geom.shapes.grid-layout.layout-data:
1. case dispatch on runtime booleans in get-cell-data (case→cond fix)
In get-cell-data, column-gap and row-gap were computed with (case ...)
using boolean locals auto-width? and auto-height? as dispatch values.
In Clojure/ClojureScript, case compares against compile-time constants,
so those branches never matched at runtime. Replaced both case forms
with cond, using explicit equality tests for keyword branches.
2. divide-by-zero guards in fr/auto/span calc (JVM ArithmeticException fix)
Guard against JVM ArithmeticException when all grid tracks are fixed
(no flex or auto tracks):
- (get allocated %1) → (get allocated %1 0) in set-auto-multi-span
- (get allocate-fr-tracks %1) → (get allocate-fr-tracks %1 0) in set-flex-multi-span
- (/ fr-column/row-space column/row-frs) guarded with (zero?) check
- (/ auto-column/row-space column/row-autos) guarded with (zero?) check
In JS, integer division by zero produces Infinity (caught by mth/finite),
but on the JVM it throws before mth/finite can intercept.
3. Exhaustive tests for set-auto-multi-span behavior
Cover all code paths and edge cases:
- span=1 cells filtered out (unchanged track-list)
- empty shape-cells no-op
- even split across multiple auto tracks
- gap deduction per extra span step
- fixed track reducing budget; only auto tracks grow
- smaller children not shrinking existing track sizes (max semantics)
- flex tracks causing cell exclusion (handled by set-flex-multi-span)
- non-spanned tracks preserved via (get allocated %1 0) default
- :row type symmetry with :column type
- row-gap correctly deducted in :row mode
- documents that (sort-by span -) yields ascending order (smaller spans
first), correcting the misleading code comment
All tests pass on both JS (Node.js) and JVM environments.
Signed-off-by: Andrey Antukh <niwi@niwi.nz>
143 lines
5.0 KiB
Clojure
143 lines
5.0 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.runner
|
|
(:require
|
|
#?(:clj [common-tests.fressian-test])
|
|
[clojure.test :as t]
|
|
[common-tests.buffer-test]
|
|
[common-tests.colors-test]
|
|
[common-tests.data-test]
|
|
[common-tests.files-changes-test]
|
|
[common-tests.files-migrations-test]
|
|
[common-tests.geom-align-test]
|
|
[common-tests.geom-bounds-map-test]
|
|
[common-tests.geom-grid-layout-test]
|
|
[common-tests.geom-grid-test]
|
|
[common-tests.geom-line-test]
|
|
[common-tests.geom-modif-tree-test]
|
|
[common-tests.geom-modifiers-test]
|
|
[common-tests.geom-point-test]
|
|
[common-tests.geom-proportions-test]
|
|
[common-tests.geom-shapes-common-test]
|
|
[common-tests.geom-shapes-corners-test]
|
|
[common-tests.geom-shapes-effects-test]
|
|
[common-tests.geom-shapes-intersect-test]
|
|
[common-tests.geom-shapes-strokes-test]
|
|
[common-tests.geom-shapes-test]
|
|
[common-tests.geom-shapes-text-test]
|
|
[common-tests.geom-shapes-tree-seq-test]
|
|
[common-tests.geom-snap-test]
|
|
[common-tests.geom-test]
|
|
[common-tests.logic.chained-propagation-test]
|
|
[common-tests.logic.comp-creation-test]
|
|
[common-tests.logic.comp-detach-with-nested-test]
|
|
[common-tests.logic.comp-remove-swap-slots-test]
|
|
[common-tests.logic.comp-reset-test]
|
|
[common-tests.logic.comp-sync-test]
|
|
[common-tests.logic.comp-touched-test]
|
|
[common-tests.logic.copying-and-duplicating-test]
|
|
[common-tests.logic.duplicated-pages-test]
|
|
[common-tests.logic.move-shapes-test]
|
|
[common-tests.logic.multiple-nesting-levels-test]
|
|
[common-tests.logic.swap-and-reset-test]
|
|
[common-tests.logic.swap-as-override-test]
|
|
[common-tests.logic.token-test]
|
|
[common-tests.media-test]
|
|
[common-tests.path-names-test]
|
|
[common-tests.record-test]
|
|
[common-tests.schema-test]
|
|
[common-tests.svg-path-test]
|
|
[common-tests.svg-test]
|
|
[common-tests.text-test]
|
|
[common-tests.time-test]
|
|
[common-tests.types.absorb-assets-test]
|
|
[common-tests.types.components-test]
|
|
[common-tests.types.container-test]
|
|
[common-tests.types.fill-test]
|
|
[common-tests.types.modifiers-test]
|
|
[common-tests.types.objects-map-test]
|
|
[common-tests.types.path-data-test]
|
|
[common-tests.types.shape-decode-encode-test]
|
|
[common-tests.types.shape-interactions-test]
|
|
[common-tests.types.shape-layout-test]
|
|
[common-tests.types.token-test]
|
|
[common-tests.types.tokens-lib-test]
|
|
[common-tests.undo-stack-test]
|
|
[common-tests.uuid-test]))
|
|
|
|
#?(:cljs (enable-console-print!))
|
|
|
|
#?(:cljs
|
|
(defmethod cljs.test/report [:cljs.test/default :end-run-tests] [m]
|
|
(if (cljs.test/successful? m)
|
|
(.exit js/process 0)
|
|
(.exit js/process 1))))
|
|
|
|
(defn -main
|
|
[& args]
|
|
(t/run-tests
|
|
'common-tests.buffer-test
|
|
'common-tests.colors-test
|
|
'common-tests.data-test
|
|
#?(:clj 'common-tests.fressian-test)
|
|
'common-tests.files-changes-test
|
|
'common-tests.files-migrations-test
|
|
'common-tests.geom-align-test
|
|
'common-tests.geom-bounds-map-test
|
|
'common-tests.geom-grid-test
|
|
'common-tests.geom-line-test
|
|
'common-tests.geom-modif-tree-test
|
|
'common-tests.geom-modifiers-test
|
|
'common-tests.geom-point-test
|
|
'common-tests.geom-proportions-test
|
|
'common-tests.geom-shapes-common-test
|
|
'common-tests.geom-shapes-corners-test
|
|
'common-tests.geom-shapes-effects-test
|
|
'common-tests.geom-shapes-intersect-test
|
|
'common-tests.geom-shapes-strokes-test
|
|
'common-tests.geom-shapes-test
|
|
'common-tests.geom-shapes-text-test
|
|
'common-tests.geom-shapes-tree-seq-test
|
|
'common-tests.geom-snap-test
|
|
'common-tests.geom-test
|
|
'common-tests.logic.chained-propagation-test
|
|
'common-tests.logic.comp-creation-test
|
|
'common-tests.logic.comp-detach-with-nested-test
|
|
'common-tests.logic.comp-remove-swap-slots-test
|
|
'common-tests.logic.comp-reset-test
|
|
'common-tests.logic.comp-sync-test
|
|
'common-tests.logic.comp-touched-test
|
|
'common-tests.logic.copying-and-duplicating-test
|
|
'common-tests.logic.duplicated-pages-test
|
|
'common-tests.logic.move-shapes-test
|
|
'common-tests.logic.multiple-nesting-levels-test
|
|
'common-tests.logic.swap-and-reset-test
|
|
'common-tests.logic.swap-as-override-test
|
|
'common-tests.logic.token-test
|
|
'common-tests.media-test
|
|
'common-tests.path-names-test
|
|
'common-tests.record-test
|
|
'common-tests.schema-test
|
|
'common-tests.svg-path-test
|
|
'common-tests.svg-test
|
|
'common-tests.text-test
|
|
'common-tests.time-test
|
|
'common-tests.types.absorb-assets-test
|
|
'common-tests.types.components-test
|
|
'common-tests.types.container-test
|
|
'common-tests.types.fill-test
|
|
'common-tests.types.modifiers-test
|
|
'common-tests.types.objects-map-test
|
|
'common-tests.types.path-data-test
|
|
'common-tests.types.shape-decode-encode-test
|
|
'common-tests.types.shape-interactions-test
|
|
'common-tests.types.shape-layout-test
|
|
'common-tests.types.token-test
|
|
'common-tests.types.tokens-lib-test
|
|
'common-tests.undo-stack-test
|
|
'common-tests.uuid-test))
|