mirror of
https://github.com/penpot/penpot.git
synced 2026-11-05 09:30:38 +00:00
A coverage run found sync paths that no test ran. New cases, in both runners: - AK: update main into a grid main. With a swapped child the main's cells keep the copy child's id (F49, pinned). - AL: update main after renaming the copy root and its child. - AM: update main of a swap inside a group. The copy child keeps a swap slot that names a removed main child (F16, pinned). - AN: a copy flex child's margin override through a main edit, a reset and update main. The frontend round trip of the main edit shows F43 with real sizes (pinned). - AO: a copy dropped into a grid cell of a main. Its undo shows F41 (pinned). - AP: a library main deletes a middle child. - AQ: a main change reaches a copy nested in a sub-board. Also: the frontend interpreter sends the real reset event instead of installing a file; a test undoes and redoes an undo entry without a group, which only release builds store; a test confirms F50, a copy text touched only in :content-group losing its override (pinned).
930 lines
51 KiB
Clojure
930 lines
51 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 SUBSIDIARY SL
|
|
|
|
(ns common-tests.logic.text-sync-test
|
|
(:require
|
|
[app.common.files.changes-builder :as pcb]
|
|
[app.common.logic.libraries :as cll]
|
|
[app.common.logic.shapes :as cls]
|
|
[app.common.test-helpers.components :as thc]
|
|
[app.common.test-helpers.composable.core :as tm]
|
|
[app.common.test-helpers.compositions :as tho]
|
|
[app.common.test-helpers.files :as thf]
|
|
[app.common.test-helpers.ids-map :as thi]
|
|
[app.common.test-helpers.shapes :as ths]
|
|
[clojure.test :as t]))
|
|
|
|
(t/use-fixtures :each thi/test-fixture)
|
|
|
|
|
|
(t/deftest sync-unchanged-copy-when-changed-attribute
|
|
(let [;; ==== Setup
|
|
file (-> (thf/sample-file :file1)
|
|
(tho/add-frame-with-text :main-root :main-child "hello world")
|
|
(thc/make-component :component1 :main-root)
|
|
(thc/instantiate-component :component1 :copy-root {:children-labels [:copy-child]}))
|
|
page (thf/current-page file)
|
|
main-child (ths/get-shape file :main-child)
|
|
|
|
;; ==== Action
|
|
changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page))
|
|
#{(:id main-child)}
|
|
(fn [shape]
|
|
(assoc-in shape [:content :children 0 :children 0 :children 0 :font-size] "32"))
|
|
(:objects page)
|
|
{})
|
|
|
|
updated-file (thf/apply-changes file changes1)
|
|
|
|
changes2 (cll/generate-sync-file-changes (pcb/empty-changes)
|
|
nil
|
|
:components
|
|
(:id updated-file)
|
|
(thi/id :component1)
|
|
(:id updated-file)
|
|
{(:id updated-file) updated-file}
|
|
(:id updated-file))
|
|
|
|
file' (thf/apply-changes updated-file changes2)
|
|
|
|
;; ==== Get
|
|
copy-child' (ths/get-shape file' :copy-child)
|
|
line (get-in copy-child' [:content :children 0 :children 0 :children 0])]
|
|
(t/is (= "32" (:font-size line)))
|
|
(t/is (= "hello world" (:text line)))))
|
|
|
|
(t/deftest sync-unchanged-copy-when-changed-text
|
|
(let [;; ==== Setup
|
|
file (-> (thf/sample-file :file1)
|
|
(tho/add-frame-with-text :main-root :main-child "hello world")
|
|
(thc/make-component :component1 :main-root)
|
|
(thc/instantiate-component :component1 :copy-root {:children-labels [:copy-child]}))
|
|
page (thf/current-page file)
|
|
main-child (ths/get-shape file :main-child)
|
|
|
|
;; ==== Action
|
|
changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page))
|
|
#{(:id main-child)}
|
|
(fn [shape]
|
|
(assoc-in shape [:content :children 0 :children 0 :children 0 :text] "Bye"))
|
|
(:objects page)
|
|
{})
|
|
|
|
updated-file (thf/apply-changes file changes1)
|
|
|
|
changes2 (cll/generate-sync-file-changes (pcb/empty-changes)
|
|
nil
|
|
:components
|
|
(:id updated-file)
|
|
(thi/id :component1)
|
|
(:id updated-file)
|
|
{(:id updated-file) updated-file}
|
|
(:id updated-file))
|
|
|
|
file' (thf/apply-changes updated-file changes2)
|
|
|
|
;; ==== Get
|
|
copy-child' (ths/get-shape file' :copy-child)
|
|
line (get-in copy-child' [:content :children 0 :children 0 :children 0])]
|
|
(t/is (= "14" (:font-size line)))
|
|
(t/is (= "Bye" (:text line)))))
|
|
|
|
(t/deftest sync-unchanged-copy-when-changed-both
|
|
(let [;; ==== Setup
|
|
file (-> (thf/sample-file :file1)
|
|
(tho/add-frame-with-text :main-root :main-child "hello world")
|
|
(thc/make-component :component1 :main-root)
|
|
(thc/instantiate-component :component1 :copy-root {:children-labels [:copy-child]}))
|
|
page (thf/current-page file)
|
|
main-child (ths/get-shape file :main-child)
|
|
|
|
;; ==== Action
|
|
changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page))
|
|
#{(:id main-child)}
|
|
(fn [shape]
|
|
(-> shape
|
|
(assoc-in [:content :children 0 :children 0 :children 0 :font-size] "32")
|
|
(assoc-in [:content :children 0 :children 0 :children 0 :text] "Bye")))
|
|
(:objects page)
|
|
{})
|
|
|
|
updated-file (thf/apply-changes file changes1)
|
|
|
|
changes2 (cll/generate-sync-file-changes (pcb/empty-changes)
|
|
nil
|
|
:components
|
|
(:id updated-file)
|
|
(thi/id :component1)
|
|
(:id updated-file)
|
|
{(:id updated-file) updated-file}
|
|
(:id updated-file))
|
|
|
|
file' (thf/apply-changes updated-file changes2)
|
|
|
|
;; ==== Get
|
|
copy-child' (ths/get-shape file' :copy-child)
|
|
line (get-in copy-child' [:content :children 0 :children 0 :children 0])]
|
|
(t/is (= "32" (:font-size line)))
|
|
(t/is (= "Bye" (:text line)))))
|
|
|
|
(t/deftest sync-updated-attr-copy-when-changed-attribute
|
|
(let [;; ==== Setup
|
|
file0 (-> (thf/sample-file :file1)
|
|
(tho/add-frame-with-text :main-root :main-child "hello world")
|
|
(thc/make-component :component1 :main-root)
|
|
(thc/instantiate-component :component1 :copy-root {:children-labels [:copy-child]}))
|
|
page0 (thf/current-page file0)
|
|
copy-child (ths/get-shape file0 :copy-child)
|
|
|
|
changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page0))
|
|
#{(:id copy-child)}
|
|
(fn [shape]
|
|
(assoc-in shape [:content :children 0 :children 0 :children 0 :font-weight] "700"))
|
|
(:objects (thf/current-page file0))
|
|
{})
|
|
file (thf/apply-changes file0 changes)
|
|
main-child (ths/get-shape file :main-child)
|
|
page (thf/current-page file)
|
|
|
|
;; ==== Action
|
|
changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page))
|
|
#{(:id main-child)}
|
|
(fn [shape]
|
|
(assoc-in shape [:content :children 0 :children 0 :children 0 :font-size] "32"))
|
|
(:objects page)
|
|
{})
|
|
|
|
updated-file (thf/apply-changes file changes1)
|
|
|
|
changes2 (cll/generate-sync-file-changes (pcb/empty-changes)
|
|
nil
|
|
:components
|
|
(:id updated-file)
|
|
(thi/id :component1)
|
|
(:id updated-file)
|
|
{(:id updated-file) updated-file}
|
|
(:id updated-file))
|
|
|
|
file' (thf/apply-changes updated-file changes2)
|
|
|
|
;; ==== Get
|
|
copy-child' (ths/get-shape file' :copy-child)
|
|
line (get-in copy-child' [:content :children 0 :children 0 :children 0])]
|
|
;; The attr doesn't change, because it was touched
|
|
(t/is (= "14" (:font-size line)))
|
|
(t/is (= "hello world" (:text line)))))
|
|
|
|
(t/deftest sync-updated-attr-copy-when-changed-text
|
|
(let [;; ==== Setup
|
|
file0 (-> (thf/sample-file :file1)
|
|
(tho/add-frame-with-text :main-root :main-child "hello world")
|
|
(thc/make-component :component1 :main-root)
|
|
(thc/instantiate-component :component1 :copy-root {:children-labels [:copy-child]}))
|
|
page0 (thf/current-page file0)
|
|
copy-child (ths/get-shape file0 :copy-child)
|
|
|
|
changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page0))
|
|
#{(:id copy-child)}
|
|
(fn [shape]
|
|
(assoc-in shape [:content :children 0 :children 0 :children 0 :font-weight] "700"))
|
|
(:objects (thf/current-page file0))
|
|
{})
|
|
file (thf/apply-changes file0 changes)
|
|
main-child (ths/get-shape file :main-child)
|
|
page (thf/current-page file)
|
|
|
|
;; ==== Action
|
|
changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page))
|
|
#{(:id main-child)}
|
|
(fn [shape]
|
|
(assoc-in shape [:content :children 0 :children 0 :children 0 :text] "Bye"))
|
|
(:objects page)
|
|
{})
|
|
|
|
updated-file (thf/apply-changes file changes1)
|
|
|
|
changes2 (cll/generate-sync-file-changes (pcb/empty-changes)
|
|
nil
|
|
:components
|
|
(:id updated-file)
|
|
(thi/id :component1)
|
|
(:id updated-file)
|
|
{(:id updated-file) updated-file}
|
|
(:id updated-file))
|
|
|
|
file' (thf/apply-changes updated-file changes2)
|
|
|
|
;; ==== Get
|
|
copy-child' (ths/get-shape file' :copy-child)
|
|
line (get-in copy-child' [:content :children 0 :children 0 :children 0])]
|
|
(t/is (= "14" (:font-size line)))
|
|
;; The text is updated because only attrs were touched
|
|
(t/is (= "Bye" (:text line)))))
|
|
|
|
(t/deftest sync-updated-attr-copy-when-changed-both
|
|
(let [;; ==== Setup
|
|
file0 (-> (thf/sample-file :file1)
|
|
(tho/add-frame-with-text :main-root :main-child "hello world")
|
|
(thc/make-component :component1 :main-root)
|
|
(thc/instantiate-component :component1 :copy-root {:children-labels [:copy-child]}))
|
|
page0 (thf/current-page file0)
|
|
copy-child (ths/get-shape file0 :copy-child)
|
|
|
|
changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page0))
|
|
#{(:id copy-child)}
|
|
(fn [shape]
|
|
(assoc-in shape [:content :children 0 :children 0 :children 0 :font-weight] "700"))
|
|
(:objects (thf/current-page file0))
|
|
{})
|
|
file (thf/apply-changes file0 changes)
|
|
main-child (ths/get-shape file :main-child)
|
|
page (thf/current-page file)
|
|
|
|
;; ==== Action
|
|
changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page))
|
|
#{(:id main-child)}
|
|
(fn [shape]
|
|
(-> shape
|
|
(assoc-in [:content :children 0 :children 0 :children 0 :font-size] "32")
|
|
(assoc-in [:content :children 0 :children 0 :children 0 :text] "Bye")))
|
|
(:objects page)
|
|
{})
|
|
|
|
updated-file (thf/apply-changes file changes1)
|
|
|
|
changes2 (cll/generate-sync-file-changes (pcb/empty-changes)
|
|
nil
|
|
:components
|
|
(:id updated-file)
|
|
(thi/id :component1)
|
|
(:id updated-file)
|
|
{(:id updated-file) updated-file}
|
|
(:id updated-file))
|
|
|
|
file' (thf/apply-changes updated-file changes2)
|
|
|
|
;; ==== Get
|
|
copy-child' (ths/get-shape file' :copy-child)
|
|
line (get-in copy-child' [:content :children 0 :children 0 :children 0])]
|
|
;; The attr doesn't change, because it was touched
|
|
(t/is (= "14" (:font-size line)))
|
|
;; The text is updated because only attrs were touched
|
|
(t/is (= "Bye" (:text line)))))
|
|
|
|
(t/deftest sync-updated-text-copy-when-changed-attribute
|
|
(let [;; ==== Setup
|
|
file0 (-> (thf/sample-file :file1)
|
|
(tho/add-frame-with-text :main-root :main-child "hello world")
|
|
(thc/make-component :component1 :main-root)
|
|
(thc/instantiate-component :component1 :copy-root {:children-labels [:copy-child]}))
|
|
page0 (thf/current-page file0)
|
|
copy-child (ths/get-shape file0 :copy-child)
|
|
|
|
changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page0))
|
|
#{(:id copy-child)}
|
|
(fn [shape]
|
|
(assoc-in shape [:content :children 0 :children 0 :children 0 :text] "Hi"))
|
|
(:objects (thf/current-page file0))
|
|
{})
|
|
file (thf/apply-changes file0 changes)
|
|
main-child (ths/get-shape file :main-child)
|
|
page (thf/current-page file)
|
|
|
|
;; ==== Action
|
|
changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page))
|
|
#{(:id main-child)}
|
|
(fn [shape]
|
|
(assoc-in shape [:content :children 0 :children 0 :children 0 :font-size] "32"))
|
|
(:objects page)
|
|
{})
|
|
|
|
updated-file (thf/apply-changes file changes1)
|
|
|
|
changes2 (cll/generate-sync-file-changes (pcb/empty-changes)
|
|
nil
|
|
:components
|
|
(:id updated-file)
|
|
(thi/id :component1)
|
|
(:id updated-file)
|
|
{(:id updated-file) updated-file}
|
|
(:id updated-file))
|
|
|
|
file' (thf/apply-changes updated-file changes2)
|
|
|
|
;; ==== Get
|
|
copy-child' (ths/get-shape file' :copy-child)
|
|
line (get-in copy-child' [:content :children 0 :children 0 :children 0])]
|
|
;; The attr is updated because only text were touched
|
|
(t/is (= "32" (:font-size line)))
|
|
(t/is (= "Hi" (:text line)))))
|
|
|
|
(t/deftest sync-updated-text-copy-when-changed-text
|
|
(let [;; ==== Setup
|
|
file0 (-> (thf/sample-file :file1)
|
|
(tho/add-frame-with-text :main-root :main-child "hello world")
|
|
(thc/make-component :component1 :main-root)
|
|
(thc/instantiate-component :component1 :copy-root {:children-labels [:copy-child]}))
|
|
page0 (thf/current-page file0)
|
|
copy-child (ths/get-shape file0 :copy-child)
|
|
|
|
changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page0))
|
|
#{(:id copy-child)}
|
|
(fn [shape]
|
|
(assoc-in shape [:content :children 0 :children 0 :children 0 :text] "Hi"))
|
|
(:objects (thf/current-page file0))
|
|
{})
|
|
file (thf/apply-changes file0 changes)
|
|
main-child (ths/get-shape file :main-child)
|
|
page (thf/current-page file)
|
|
|
|
;; ==== Action
|
|
changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page))
|
|
#{(:id main-child)}
|
|
(fn [shape]
|
|
(assoc-in shape [:content :children 0 :children 0 :children 0 :text] "Bye"))
|
|
(:objects page)
|
|
{})
|
|
|
|
updated-file (thf/apply-changes file changes1)
|
|
|
|
changes2 (cll/generate-sync-file-changes (pcb/empty-changes)
|
|
nil
|
|
:components
|
|
(:id updated-file)
|
|
(thi/id :component1)
|
|
(:id updated-file)
|
|
{(:id updated-file) updated-file}
|
|
(:id updated-file))
|
|
|
|
file' (thf/apply-changes updated-file changes2)
|
|
|
|
;; ==== Get
|
|
copy-child' (ths/get-shape file' :copy-child)
|
|
line (get-in copy-child' [:content :children 0 :children 0 :children 0])]
|
|
(t/is (= "14" (:font-size line)))
|
|
;; The text doesn't change, because it was touched
|
|
(t/is (= "Hi" (:text line)))))
|
|
|
|
(t/deftest sync-updated-text-copy-when-changed-both
|
|
(let [;; ==== Setup
|
|
file0 (-> (thf/sample-file :file1)
|
|
(tho/add-frame-with-text :main-root :main-child "hello world")
|
|
(thc/make-component :component1 :main-root)
|
|
(thc/instantiate-component :component1 :copy-root {:children-labels [:copy-child]}))
|
|
page0 (thf/current-page file0)
|
|
copy-child (ths/get-shape file0 :copy-child)
|
|
|
|
changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page0))
|
|
#{(:id copy-child)}
|
|
(fn [shape]
|
|
(assoc-in shape [:content :children 0 :children 0 :children 0 :text] "Hi"))
|
|
(:objects (thf/current-page file0))
|
|
{})
|
|
file (thf/apply-changes file0 changes)
|
|
main-child (ths/get-shape file :main-child)
|
|
page (thf/current-page file)
|
|
|
|
;; ==== Action
|
|
changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page))
|
|
#{(:id main-child)}
|
|
(fn [shape]
|
|
(-> shape
|
|
(assoc-in [:content :children 0 :children 0 :children 0 :font-size] "32")
|
|
(assoc-in [:content :children 0 :children 0 :children 0 :text] "Bye")))
|
|
(:objects page)
|
|
{})
|
|
|
|
updated-file (thf/apply-changes file changes1)
|
|
|
|
changes2 (cll/generate-sync-file-changes (pcb/empty-changes)
|
|
nil
|
|
:components
|
|
(:id updated-file)
|
|
(thi/id :component1)
|
|
(:id updated-file)
|
|
{(:id updated-file) updated-file}
|
|
(:id updated-file))
|
|
|
|
file' (thf/apply-changes updated-file changes2)
|
|
|
|
;; ==== Get
|
|
copy-child' (ths/get-shape file' :copy-child)
|
|
line (get-in copy-child' [:content :children 0 :children 0 :children 0])]
|
|
;; The attr is updated because only text were touched
|
|
(t/is (= "32" (:font-size line)))
|
|
;; The text doesn't change, because it was touched
|
|
(t/is (= "Hi" (:text line)))))
|
|
|
|
(t/deftest sync-updated-both-copy-when-changed-attribute
|
|
(let [;; ==== Setup
|
|
file0 (-> (thf/sample-file :file1)
|
|
(tho/add-frame-with-text :main-root :main-child "hello world")
|
|
(thc/make-component :component1 :main-root)
|
|
(thc/instantiate-component :component1 :copy-root {:children-labels [:copy-child]}))
|
|
page0 (thf/current-page file0)
|
|
copy-child (ths/get-shape file0 :copy-child)
|
|
|
|
changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page0))
|
|
#{(:id copy-child)}
|
|
(fn [shape]
|
|
(-> shape
|
|
(assoc-in [:content :children 0 :children 0 :children 0 :font-weight] "700")
|
|
(assoc-in [:content :children 0 :children 0 :children 0 :text] "Hi")))
|
|
(:objects (thf/current-page file0))
|
|
{})
|
|
file (thf/apply-changes file0 changes)
|
|
main-child (ths/get-shape file :main-child)
|
|
page (thf/current-page file)
|
|
|
|
;; ==== Action
|
|
changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page))
|
|
#{(:id main-child)}
|
|
(fn [shape]
|
|
(assoc-in shape [:content :children 0 :children 0 :children 0 :font-size] "32"))
|
|
(:objects page)
|
|
{})
|
|
|
|
updated-file (thf/apply-changes file changes1)
|
|
|
|
changes2 (cll/generate-sync-file-changes (pcb/empty-changes)
|
|
nil
|
|
:components
|
|
(:id updated-file)
|
|
(thi/id :component1)
|
|
(:id updated-file)
|
|
{(:id updated-file) updated-file}
|
|
(:id updated-file))
|
|
|
|
file' (thf/apply-changes updated-file changes2)
|
|
|
|
;; ==== Get
|
|
copy-child' (ths/get-shape file' :copy-child)
|
|
line (get-in copy-child' [:content :children 0 :children 0 :children 0])]
|
|
;; The attr doesn't change, because it was touched
|
|
(t/is (= "14" (:font-size line)))
|
|
(t/is (= "Hi" (:text line)))))
|
|
|
|
(t/deftest sync-updated-both-copy-when-changed-text
|
|
(let [;; ==== Setup
|
|
file0 (-> (thf/sample-file :file1)
|
|
(tho/add-frame-with-text :main-root :main-child "hello world")
|
|
(thc/make-component :component1 :main-root)
|
|
(thc/instantiate-component :component1 :copy-root {:children-labels [:copy-child]}))
|
|
page0 (thf/current-page file0)
|
|
copy-child (ths/get-shape file0 :copy-child)
|
|
|
|
changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page0))
|
|
#{(:id copy-child)}
|
|
(fn [shape]
|
|
(-> shape
|
|
(assoc-in [:content :children 0 :children 0 :children 0 :font-weight] "700")
|
|
(assoc-in [:content :children 0 :children 0 :children 0 :text] "Hi")))
|
|
(:objects (thf/current-page file0))
|
|
{})
|
|
file (thf/apply-changes file0 changes)
|
|
main-child (ths/get-shape file :main-child)
|
|
page (thf/current-page file)
|
|
|
|
;; ==== Action
|
|
changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page))
|
|
#{(:id main-child)}
|
|
(fn [shape]
|
|
(assoc-in shape [:content :children 0 :children 0 :children 0 :text] "Bye"))
|
|
(:objects page)
|
|
{})
|
|
|
|
updated-file (thf/apply-changes file changes1)
|
|
|
|
changes2 (cll/generate-sync-file-changes (pcb/empty-changes)
|
|
nil
|
|
:components
|
|
(:id updated-file)
|
|
(thi/id :component1)
|
|
(:id updated-file)
|
|
{(:id updated-file) updated-file}
|
|
(:id updated-file))
|
|
|
|
file' (thf/apply-changes updated-file changes2)
|
|
|
|
;; ==== Get
|
|
copy-child' (ths/get-shape file' :copy-child)
|
|
line (get-in copy-child' [:content :children 0 :children 0 :children 0])]
|
|
(t/is (= "14" (:font-size line)))
|
|
;; The text doesn't change, because it was touched
|
|
(t/is (= "Hi" (:text line)))))
|
|
|
|
(t/deftest sync-updated-both-copy-when-changed-both
|
|
(let [;; ==== Setup
|
|
file0 (-> (thf/sample-file :file1)
|
|
(tho/add-frame-with-text :main-root :main-child "hello world")
|
|
(thc/make-component :component1 :main-root)
|
|
(thc/instantiate-component :component1 :copy-root {:children-labels [:copy-child]}))
|
|
page0 (thf/current-page file0)
|
|
copy-child (ths/get-shape file0 :copy-child)
|
|
|
|
changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page0))
|
|
#{(:id copy-child)}
|
|
(fn [shape]
|
|
(-> shape
|
|
(assoc-in [:content :children 0 :children 0 :children 0 :font-weight] "700")
|
|
(assoc-in [:content :children 0 :children 0 :children 0 :text] "Hi")))
|
|
(:objects (thf/current-page file0))
|
|
{})
|
|
file (thf/apply-changes file0 changes)
|
|
main-child (ths/get-shape file :main-child)
|
|
page (thf/current-page file)
|
|
|
|
;; ==== Action
|
|
changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page))
|
|
#{(:id main-child)}
|
|
(fn [shape]
|
|
(-> shape
|
|
(assoc-in [:content :children 0 :children 0 :children 0 :font-size] "32")
|
|
(assoc-in [:content :children 0 :children 0 :children 0 :text] "Bye")))
|
|
(:objects page)
|
|
{})
|
|
|
|
updated-file (thf/apply-changes file changes1)
|
|
|
|
changes2 (cll/generate-sync-file-changes (pcb/empty-changes)
|
|
nil
|
|
:components
|
|
(:id updated-file)
|
|
(thi/id :component1)
|
|
(:id updated-file)
|
|
{(:id updated-file) updated-file}
|
|
(:id updated-file))
|
|
|
|
file' (thf/apply-changes updated-file changes2)
|
|
|
|
;; ==== Get
|
|
copy-child' (ths/get-shape file' :copy-child)
|
|
line (get-in copy-child' [:content :children 0 :children 0 :children 0])]
|
|
;; The attr doesn't change, because it was touched
|
|
(t/is (= "14" (:font-size line)))
|
|
;; The text doesn't change, because it was touched
|
|
(t/is (= "Hi" (:text line)))))
|
|
|
|
(t/deftest sync-updated-structure-same-attrs-copy-when-changed-attribute
|
|
(let [;; ==== Setup
|
|
file0 (-> (thf/sample-file :file1)
|
|
(tho/add-frame-with-text :main-root :main-child "hello world")
|
|
(thc/make-component :component1 :main-root)
|
|
(thc/instantiate-component :component1 :copy-root {:children-labels [:copy-child]}))
|
|
page0 (thf/current-page file0)
|
|
copy-child (ths/get-shape file0 :copy-child)
|
|
|
|
changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page0))
|
|
#{(:id copy-child)}
|
|
(fn [shape]
|
|
(let [line (get-in shape [:content :children 0 :children 0 :children 0])]
|
|
(update-in shape [:content :children 0 :children 0 :children]
|
|
#(conj % line))))
|
|
(:objects (thf/current-page file0))
|
|
{})
|
|
file (thf/apply-changes file0 changes)
|
|
main-child (ths/get-shape file :main-child)
|
|
page (thf/current-page file)
|
|
|
|
;; ==== Action
|
|
changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page))
|
|
#{(:id main-child)}
|
|
(fn [shape]
|
|
;; Update the attrs on all the content tree
|
|
(-> shape
|
|
(assoc-in [:content :children 0 :children 0 :children 0 :font-size] "32")
|
|
(assoc-in [:content :children 0 :children 0 :font-size] "32")))
|
|
(:objects page)
|
|
{})
|
|
|
|
updated-file (thf/apply-changes file changes1)
|
|
|
|
changes2 (cll/generate-sync-file-changes (pcb/empty-changes)
|
|
nil
|
|
:components
|
|
(:id updated-file)
|
|
(thi/id :component1)
|
|
(:id updated-file)
|
|
{(:id updated-file) updated-file}
|
|
(:id updated-file))
|
|
|
|
file' (thf/apply-changes updated-file changes2)
|
|
|
|
;; ==== Get
|
|
copy-child' (ths/get-shape file' :copy-child)
|
|
line (get-in copy-child' [:content :children 0 :children 0 :children 0])]
|
|
;; The attr is updated because all the attrs on the structure are equal
|
|
(t/is (= "32" (:font-size line)))
|
|
(t/is (= "hello world" (:text line)))))
|
|
|
|
(t/deftest sync-updated-structure-same-attrs-copy-when-changed-text
|
|
(let [;; ==== Setup
|
|
file0 (-> (thf/sample-file :file1)
|
|
(tho/add-frame-with-text :main-root :main-child "hello world")
|
|
(thc/make-component :component1 :main-root)
|
|
(thc/instantiate-component :component1 :copy-root {:children-labels [:copy-child]}))
|
|
page0 (thf/current-page file0)
|
|
copy-child (ths/get-shape file0 :copy-child)
|
|
|
|
changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page0))
|
|
#{(:id copy-child)}
|
|
(fn [shape]
|
|
(let [line (get-in shape [:content :children 0 :children 0 :children 0])]
|
|
(update-in shape [:content :children 0 :children 0 :children]
|
|
#(conj % line))))
|
|
(:objects (thf/current-page file0))
|
|
{})
|
|
file (thf/apply-changes file0 changes)
|
|
main-child (ths/get-shape file :main-child)
|
|
page (thf/current-page file)
|
|
|
|
;; ==== Action
|
|
changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page))
|
|
#{(:id main-child)}
|
|
(fn [shape]
|
|
(assoc-in shape [:content :children 0 :children 0 :children 0 :text] "Bye"))
|
|
(:objects page)
|
|
{})
|
|
|
|
updated-file (thf/apply-changes file changes1)
|
|
|
|
changes2 (cll/generate-sync-file-changes (pcb/empty-changes)
|
|
nil
|
|
:components
|
|
(:id updated-file)
|
|
(thi/id :component1)
|
|
(:id updated-file)
|
|
{(:id updated-file) updated-file}
|
|
(:id updated-file))
|
|
|
|
file' (thf/apply-changes updated-file changes2)
|
|
|
|
;; ==== Get
|
|
copy-child' (ths/get-shape file' :copy-child)
|
|
line (get-in copy-child' [:content :children 0 :children 0 :children 0])]
|
|
(t/is (= "14" (:font-size line)))
|
|
;; The text doesn't change, because the structure was touched
|
|
(t/is (= "hello world" (:text line)))))
|
|
|
|
(t/deftest sync-updated-structure-same-attrs-copy-when-changed-both
|
|
(let [;; ==== Setup
|
|
file0 (-> (thf/sample-file :file1)
|
|
(tho/add-frame-with-text :main-root :main-child "hello world")
|
|
(thc/make-component :component1 :main-root)
|
|
(thc/instantiate-component :component1 :copy-root {:children-labels [:copy-child]}))
|
|
page0 (thf/current-page file0)
|
|
copy-child (ths/get-shape file0 :copy-child)
|
|
|
|
changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page0))
|
|
#{(:id copy-child)}
|
|
(fn [shape]
|
|
(let [line (get-in shape [:content :children 0 :children 0 :children 0])]
|
|
(update-in shape [:content :children 0 :children 0 :children]
|
|
#(conj % line))))
|
|
(:objects (thf/current-page file0))
|
|
{})
|
|
file (thf/apply-changes file0 changes)
|
|
main-child (ths/get-shape file :main-child)
|
|
page (thf/current-page file)
|
|
|
|
;; ==== Action
|
|
changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page))
|
|
#{(:id main-child)}
|
|
(fn [shape]
|
|
;; Update the attrs on all the content tree
|
|
(-> shape
|
|
(assoc-in [:content :children 0 :children 0 :children 0 :font-size] "32")
|
|
(assoc-in [:content :children 0 :children 0 :font-size] "32")
|
|
(assoc-in [:content :children 0 :children 0 :children 0 :text] "Bye")))
|
|
(:objects page)
|
|
{})
|
|
|
|
updated-file (thf/apply-changes file changes1)
|
|
|
|
changes2 (cll/generate-sync-file-changes (pcb/empty-changes)
|
|
nil
|
|
:components
|
|
(:id updated-file)
|
|
(thi/id :component1)
|
|
(:id updated-file)
|
|
{(:id updated-file) updated-file}
|
|
(:id updated-file))
|
|
|
|
file' (thf/apply-changes updated-file changes2)
|
|
|
|
;; ==== Get
|
|
copy-child' (ths/get-shape file' :copy-child)
|
|
line (get-in copy-child' [:content :children 0 :children 0 :children 0])]
|
|
;; The attr is updated because all the attrs on the structure are equal
|
|
(t/is (= "32" (:font-size line)))
|
|
;; The text doesn't change, because the structure was touched
|
|
(t/is (= "hello world" (:text line)))))
|
|
|
|
(t/deftest sync-updated-structure-diff-attrs-copy-when-changed-attribute
|
|
(let [;; ==== Setup
|
|
file0 (-> (thf/sample-file :file1)
|
|
(tho/add-frame-with-text :main-root :main-child "hello world")
|
|
(thc/make-component :component1 :main-root)
|
|
(thc/instantiate-component :component1 :copy-root {:children-labels [:copy-child]}))
|
|
page0 (thf/current-page file0)
|
|
copy-child (ths/get-shape file0 :copy-child)
|
|
|
|
changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page0))
|
|
#{(:id copy-child)}
|
|
(fn [shape]
|
|
(let [line (-> (get-in shape [:content :children 0 :children 0 :children 0])
|
|
(assoc :font-weight "700"))]
|
|
(update-in shape [:content :children 0 :children 0 :children]
|
|
#(conj % line))))
|
|
(:objects (thf/current-page file0))
|
|
{})
|
|
file (thf/apply-changes file0 changes)
|
|
main-child (ths/get-shape file :main-child)
|
|
page (thf/current-page file)
|
|
|
|
;; ==== Action
|
|
changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page))
|
|
#{(:id main-child)}
|
|
(fn [shape]
|
|
;; Update the attrs on all the content tree
|
|
(-> shape
|
|
(assoc-in [:content :children 0 :children 0 :children 0 :font-size] "32")
|
|
(assoc-in [:content :children 0 :children 0 :font-size] "32")))
|
|
(:objects page)
|
|
{})
|
|
|
|
updated-file (thf/apply-changes file changes1)
|
|
|
|
changes2 (cll/generate-sync-file-changes (pcb/empty-changes)
|
|
nil
|
|
:components
|
|
(:id updated-file)
|
|
(thi/id :component1)
|
|
(:id updated-file)
|
|
{(:id updated-file) updated-file}
|
|
(:id updated-file))
|
|
|
|
file' (thf/apply-changes updated-file changes2)
|
|
|
|
;; ==== Get
|
|
copy-child' (ths/get-shape file' :copy-child)
|
|
line (get-in copy-child' [:content :children 0 :children 0 :children 0])]
|
|
;; The attr doesn't change, because not all the attrs on the structure are equal
|
|
(t/is (= "14" (:font-size line)))
|
|
(t/is (= "hello world" (:text line)))))
|
|
|
|
(t/deftest sync-updated-structure-diff-attrs-copy-when-changed-text
|
|
(let [;; ==== Setup
|
|
file0 (-> (thf/sample-file :file1)
|
|
(tho/add-frame-with-text :main-root :main-child "hello world")
|
|
(thc/make-component :component1 :main-root)
|
|
(thc/instantiate-component :component1 :copy-root {:children-labels [:copy-child]}))
|
|
page0 (thf/current-page file0)
|
|
copy-child (ths/get-shape file0 :copy-child)
|
|
|
|
changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page0))
|
|
#{(:id copy-child)}
|
|
(fn [shape]
|
|
(let [line (-> (get-in shape [:content :children 0 :children 0 :children 0])
|
|
(assoc :font-weight "700"))]
|
|
(update-in shape [:content :children 0 :children 0 :children]
|
|
#(conj % line))))
|
|
(:objects (thf/current-page file0))
|
|
{})
|
|
file (thf/apply-changes file0 changes)
|
|
main-child (ths/get-shape file :main-child)
|
|
page (thf/current-page file)
|
|
|
|
;; ==== Action
|
|
changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page))
|
|
#{(:id main-child)}
|
|
(fn [shape]
|
|
(assoc-in shape [:content :children 0 :children 0 :children 0 :text] "Bye"))
|
|
(:objects page)
|
|
{})
|
|
|
|
updated-file (thf/apply-changes file changes1)
|
|
|
|
changes2 (cll/generate-sync-file-changes (pcb/empty-changes)
|
|
nil
|
|
:components
|
|
(:id updated-file)
|
|
(thi/id :component1)
|
|
(:id updated-file)
|
|
{(:id updated-file) updated-file}
|
|
(:id updated-file))
|
|
|
|
file' (thf/apply-changes updated-file changes2)
|
|
|
|
;; ==== Get
|
|
copy-child' (ths/get-shape file' :copy-child)
|
|
line (get-in copy-child' [:content :children 0 :children 0 :children 0])]
|
|
(t/is (= "14" (:font-size line)))
|
|
;; The text doesn't change, because the structure was touched
|
|
(t/is (= "hello world" (:text line)))))
|
|
|
|
(t/deftest sync-updated-structure-diff-attrs-copy-when-changed-both
|
|
(let [;; ==== Setup
|
|
file0 (-> (thf/sample-file :file1)
|
|
(tho/add-frame-with-text :main-root :main-child "hello world")
|
|
(thc/make-component :component1 :main-root)
|
|
(thc/instantiate-component :component1 :copy-root {:children-labels [:copy-child]}))
|
|
page0 (thf/current-page file0)
|
|
copy-child (ths/get-shape file0 :copy-child)
|
|
|
|
changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page0))
|
|
#{(:id copy-child)}
|
|
(fn [shape]
|
|
(let [line (-> (get-in shape [:content :children 0 :children 0 :children 0])
|
|
(assoc :font-weight "700"))]
|
|
(update-in shape [:content :children 0 :children 0 :children]
|
|
#(conj % line))))
|
|
(:objects (thf/current-page file0))
|
|
{})
|
|
file (thf/apply-changes file0 changes)
|
|
main-child (ths/get-shape file :main-child)
|
|
page (thf/current-page file)
|
|
|
|
;; ==== Action
|
|
changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page))
|
|
#{(:id main-child)}
|
|
(fn [shape]
|
|
;; Update the attrs on all the content tree
|
|
(-> shape
|
|
(assoc-in [:content :children 0 :children 0 :children 0 :font-size] "32")
|
|
(assoc-in [:content :children 0 :children 0 :font-size] "32")
|
|
(assoc-in [:content :children 0 :children 0 :children 0 :text] "Bye")))
|
|
(:objects page)
|
|
{})
|
|
|
|
updated-file (thf/apply-changes file changes1)
|
|
|
|
changes2 (cll/generate-sync-file-changes (pcb/empty-changes)
|
|
nil
|
|
:components
|
|
(:id updated-file)
|
|
(thi/id :component1)
|
|
(:id updated-file)
|
|
{(:id updated-file) updated-file}
|
|
(:id updated-file))
|
|
|
|
file' (thf/apply-changes updated-file changes2)
|
|
|
|
;; ==== Get
|
|
copy-child' (ths/get-shape file' :copy-child)
|
|
line (get-in copy-child' [:content :children 0 :children 0 :children 0])]
|
|
;; The attr doesn't change, because not all the attrs on the structure are equal
|
|
(t/is (= "14" (:font-size line)))
|
|
;; The text doesn't change, because the structure was touched
|
|
(t/is (= "hello world" (:text line)))))
|
|
|
|
(t/deftest sync-copy-touched-only-in-content-group
|
|
;; A copy text whose `:touched` has `:content-group` but no text subgroup,
|
|
;; as files from before the subgroups hold it, keeps its own content
|
|
;; when the main changes.
|
|
(let [;; ==== Setup
|
|
file (-> (thf/sample-file :file1)
|
|
(tho/add-frame-with-text :main-root :main-child "hello world")
|
|
(thc/make-component :component1 :main-root)
|
|
(thc/instantiate-component :component1 :copy-root {:children-labels [:copy-child]}))
|
|
copy-child (ths/get-shape file :copy-child)
|
|
file (-> file
|
|
(ths/update-shape :copy-child :content
|
|
(assoc-in (:content copy-child)
|
|
[:children 0 :children 0 :children 0 :text]
|
|
"copy text"))
|
|
(ths/update-shape :copy-child :touched #{:content-group}))
|
|
page (thf/current-page file)
|
|
|
|
;; ==== Action
|
|
changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page))
|
|
#{(thi/id :main-child)}
|
|
(fn [shape]
|
|
(assoc-in shape [:content :children 0 :children 0 :children 0 :font-size] "32"))
|
|
(:objects page)
|
|
{})
|
|
|
|
updated-file (thf/apply-changes file changes1)
|
|
|
|
changes2 (cll/generate-sync-file-changes (pcb/empty-changes)
|
|
nil
|
|
:components
|
|
(:id updated-file)
|
|
(thi/id :component1)
|
|
(:id updated-file)
|
|
{(:id updated-file) updated-file}
|
|
(:id updated-file))
|
|
|
|
file' (thf/apply-changes updated-file changes2)
|
|
|
|
;; ==== Get
|
|
copy-child' (ths/get-shape file' :copy-child)
|
|
line (get-in copy-child' [:content :children 0 :children 0 :children 0])]
|
|
;; with no subgroup, sync takes the "nothing touched" branch and writes
|
|
;; the main's content
|
|
(tm/known-failure "F50" "copy text" "hello world" (:text line))
|
|
(t/is (= #{:content-group} (:touched copy-child')))))
|