From f84cd933a8fb7147e4c4136beced8fe9249db6a1 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 30 Apr 2024 09:45:27 +0200 Subject: [PATCH] :sparkles: Swap and reset generate changes tests --- common/test/cases/swap-and-reset.penpot | Bin 0 -> 17080 bytes .../logic/swap_and_reset_test.cljc | 176 ++++++++++++++++++ 2 files changed, 176 insertions(+) create mode 100644 common/test/cases/swap-and-reset.penpot create mode 100644 common/test/common_tests/logic/swap_and_reset_test.cljc diff --git a/common/test/cases/swap-and-reset.penpot b/common/test/cases/swap-and-reset.penpot new file mode 100644 index 0000000000000000000000000000000000000000..d8ea3188a46b8883eb8f57ffaf42a293dcec5433 GIT binary patch literal 17080 zcmX9_1zc0#+aDo}k}d%qA)*osVt}-i0*+FU919rD7$wrFG}0x~B@!y#O8giKA|j2_ z0wN$S@LvA!K0CYj+!ObS@AI7JKKG1*;YuV5^UCHU=>I&yG7flR}AfL);TB>4d|NqNH;m;kEX-CS|5Bu@MVk5ZlvXm^~%#i<0z&mG4Kup{Au!xDfh zk>CQH?Xh1l3Jj1SIS_GZtb`}d!xiL;cEK(1nBY7~5DY*$#M1}u4nezOApiw95)tR^ zDnd_k@N%(pMH8Gi7-vXm`vp2WH#vj z$^GLcS_bJOyCOTr6z$sVTe1=*uK$wW=nqpc{D9hqzO*(><0z?_dp`Zy)gxeKtrK$s94RVXZd6L>>>5YhMDodIU$1~ zgX0kv_h!ik$B`U_@OK;q(B#-3$~XjE291-;epYEI4MoVx!DKMfHR`|B7Z?&G&7N{z z;C7mTC3s2z*dXGt`$MlJ-HC1hKZpDc%!V<+-oaFVey*wc5xGBK;0D06Jxj=8^=0<{O0dktXK--ir$ZyVvfF(H` ztAs!KpuNJCGK@L^l!|nB|8j&Y1{cW@~}P9_QvFb#YFyNtObUVIVSsEHmv3 zoA&dC`^~$%5nM^0g{u_HAW-RY=`x6p1Q?Si-i_$8wZPmT+^G!1=nn5lQ>Z0P`0o080|iZWt#|64A{G zV0e+j*|Tto9^>ZhM*JbH#pvda#t=w;6rP0}^nkF8KSS;CF~QBj)U?|QsZxLb910Nf z3QK?%qKXagc37~+h5fFdRoCnu>IWVwfFQ?J)+0q!_M9KMQn5^@LuJJm5~DK$I7YkL zJLAaW7!p~^XoUb5YQ{sSWRynXYU#4kig8Zq zva!I>5E-ROMrrGol2P~d56Gwo)5HZjd!n0<1i=@FUARnemGCCud~ie#2?7b{BHt`M3Gg#}j0EgaRREwffG!MfZ}Gwnl2JB=OWXTqQTh3iGYXKKB%CiGjAPZvlnd8R zMTQ-#CN3lR$ui=KN-D>yQ6!Ywv1(Ep0EMKq$dtT1G75+GBDqNbWQ)%Nx5PLQoUwrJ z#TS?W4500aXm@~X9EpqyVQ?n6;v{BZl5l_?iFv>|yPyH)!!E9nQ4tq+mY8*QbEQW+ z6YO1QopJadfJ0;Qbn_x&aGn6>0K5>M;HD9>KGIMqvp1SZK>r}(?7f`PL@W;DM!f8d zBav`K3C|0_xY|!ap?I_l!P$?D3bC;HvHI#GvAki|tkJ4~*q-uK<|Y19SmO2Bz|+ z2=Tw;yQf7)JvoCvUbz7MMTuNMdEI?raKi+mp`&J?tqC#F(KUu>>FQ|;3JTKG>!Y1; z5Htkquth~hk#p*90Nm`+?m#@_DJG-N?SO9L*?(T4eG>FBA2teBh zz`Zlhm(3F}^*LaPB(i$~qP#FSz{&YY0K+f*o0p60DVL*{Cy9XfyHIQs9vCA5z~#b0 z0R3=4JhNC_T#T|SD#C!sC^t|^2|zdOnrV7TNzuiK5;Cgv!ef*Jt(8D|4U{(^0Jyam zt@UKo+l%A-3y(lXHIPxw7u8lWs_kM>2hh2TjOzK=M@IEuH2hb#kADrmD3L!jodM_V zIgcR_F#y?8#$ob`#$m0%_ZJZA0INO`KrYEs!W#et&f#M47XX2)7saR(0Cb@ua8NQT zB&!%50#Y@a=rk$>AbdD6aRF31A`U-13cxfKCJ8adIRoYaAvxe60MGzy!$CCM-2Ld` zK+{F^10WJuZGa#MLXVJy+;s!MDP(jJ4ME(1)dq;ea6%9_S67^mvmZoS5~53j0AA0_ z84Ce$iHZkkApp3v1aNt-2vn7Ts)`}tC)JD{&>iO&A0tBPvf(el$Qn0OEj9 z>VW;i0071^7lZ+UPGrqGBQSu!nmU-^okPoEy`^Q4((X7JL7cY((c$zor*Q39HC)lF z!zUQhag>>_EFB@3nc@6{6{4z$K$0P+n@Zjb>N{4C?*0yV&ZiLc3x(q&&?;JgwH z=pHz}0q+mZV*qE5BOa>?sm=o7^ab9CIGe&{z5xbk{^=0l(Zh2trl167ms3K**COlcme3K$FQ8p;OjV?$edS zkzmj@l$rpr${0g2^`K)_g$vmntLiO-dTm{lgYTP`TrA-ig)B)bJX933S-b$~hYyjn z7br1dQ8ZyOz4`xzyLjrFuP!(y?;}oGaW;0WTwigu>uBI1-MP!C+;vc6b~TAq#~9 zpux%Ev3QJ(9TY1kBZ~w=Odv+b*ui9_?Vtz@QU+~@#Le4zVVrQJ1BTOCyWiGK~KPw1Rn^pntCS#m)2ft6g&opGCa)KSICJQ3a9BRKv;m&n}f+<|~ zDF#*VVqHu#Dn<$SOD`u0{VR;O2^+hdTDz&&;cPhh{ED(s{RCE{mP*sko)l_I8)5(v z-1t2e@baK7ui+**xn^s#eF%RrlRH6|<@s4@#V4rgf}N9A$#y&q(br<2-T#!FliW<%YhDVxl^TuH$;c*~nh;A5Pvt zU$fBg(pwXbkXw;Z+ROa5+SWg)JL|fqVEhYF494hNqg!pt#2()r`75Sxc;8mp z2vN*(yB0Rz@!WyLBDz|O5=$ADCfGPRIn{j_n|!Ep9ZdDYOxhEF8kd}MN+auDNVp=0 zb_Tz1D^pi9i!PUrqxm5v_TzxoJFDay?F($}bah%T^x55?^txZJ2IpaU6LFUr6@L)J z;Hkf&p4Cy#CHTf~9UPU})KzT>K;o?>`3ALkoDN}(q?Z-t2kXrWd=KyBU3roti)8!^ zuj){tqkGjcl;bxM>9@OFZs64@Xv5V_^70zO@$7$mn~}?G5RNvtZjV;_AV%|0~W(IYC6>I2nNgoaDSUd!^&CJmL0SDV!enTCsMYu;Fr znwlgjdj0xpnYO1QJYdAms1hrD``MpH@S-fGylWz+De5NuR!CEvrDNGW10J40M?zMU zRdVWHjY(_!*UNr}Dn0ox0`r2b$D3RR7PncycXSnZzru#srv2yTX(`n`>&b zUr<0dFFaGMD>#Jy6>l)PGCYQra<<@SqNe&RBPVlby~L)Pt>n#{ATRiJZ`-QR9-}%1 zl~8Jyo>(x&Im3vLa|5{zA%$L+VBEo)t?KtHak9>0TrUdv8X6jcOmF1| zGCoOL2b({4iT{#H`-PFAYq)-R^p3Tj#7CCMUu(M3IQUP5LNCK}SZGQvKebup(HjUj zTR7?C6g`ucR5UbO)}=r=saQ@Y`LHNH4)Yp_sE_r_dDhiGov)!?#&I4rFXk#BNn z($;f}SzND@T#uEY7lHGpRywk-GxAYD3!ol*5;#$h7&p~>jrr7iLket0hivXAlej6` zp0L>RN_TpYHzgz_-v8E^5Y@Xgdtm#Re23{o;_O#Qj4vhaw6dAwxd*{>bjEwQMl)lk z#pm-kuX<+58XH&bn@Q#3)GP%{?qYA>*Vg`MI1+Er%rJXkV}C34*ijj`c#s+cVkn&| za1eKJvk5#lvR=H-7=HWd?OeTf>U%mYCQCblZg1XIC24Ln(F+$~U=J zmmf7W%qh4E1=G<{4X!%P)31B$kGDHl$_klqf>F|^9%4L}D&BQ(xDiSCdAbw z?2$Ih0{r!@M2Nw6b&%1UHSxaIpNKyigXuPRD6XbMYrnV4^WJ>N=}pRZ9#apmpr?rb zqR7Tb{Y_3z+xzLaS`WI>vAu81oTewd&R_K3+!BdKyk`lv)(ZQcnNHnxuA`yRvw9RE zDWrGjYKN@wz=O3b?P1da?<3qy=_$}Olp*s9;Prne*Xee@St$A3tT>j=(Xug2)nO@h z76h$na(t%<{JMg8pA!_b6MB^<9#pd4{Dz9{YxH&Z2p3Q5r*qTc+l}^k7DLv(e5ADIw7Vpg?QCad_54J&QXEs?> zLWwf*-Xh&|w!Fvf|GrK0j>>m${NBvPVT*^dD&}mSAas~gLsdIJcdQ?H&c)vqqT*&L zX=&NQ>pyDfX&T|a^^w=kevLI)T1Y{E#3txu^Gvc)0-mNnH95f)RT{wboBQ-#){7hI zS7(1!Q6zIJ#e1wiQeuEI)D3Hq6xFy z6%|1#5`)vWmK6srvSsR{EHDc-h{Eyn z>~E1fd-wA`3zKRhK<}JsawG^si+nFr#k#yihmx%YEcLn4+%Ao0^+dl+P!eDxL+R zO?A<<_$SG|QflVi{pCznzEmFJGnqBl66Uyb?^V|w6aXUzS?r@zT|>`9>aSO(ua30S#(X= z8NEz+<+-LT&Y`0&_`p-}%`W$K4xyWaJ9f*2kQk%1q@w7&Wew{Use8{IQXzy#yFZt8 zLp(;SAL}H3_>{M(VO@GdZ^JoNq~|n$z%?muUP%zA~g_eAm`a2!HI@ zkN7Yv8oOX0J)p5NdtFbBIX7VsUh5>HJ9T;OrS6#`^LA9hT7pK`eDm^hujkgCysfiF z=3EQPZ`or?N^JsmqPxaDP~Ce7=ETSXF(ol-YegmU8&|gu(<`5s=;$zX8i%5aL?329BuvE4_nCs z3U`p_r+@9@?0o2=eBitX#kA?og=IP~6Z#u<^Nt3i950>bQPO}z|MV3P>HAEhK9FqpE~r}O#v~)gq4-m?vJLQHfRBX|_C65Q;4( zou8e`tiAmUD$1TK!{my;+Z0mzxM-GkM0Lk{c4Tt$$=7Fuc)Azs1O?2V^5eN!uhW(q z;w_yhcHw7LEnp~k@A!1%I4LQqVe_)4y@Xgx&nNI(_T>yx35z& z4z@~BhYFOGcU;y;`u(;#6uf(WZ@%j0NXkI;=T#ml_s6iLmrto7V!t|S!e{xPiO!;MKPj@R}c30-`p!6P3Sr!d;NK-xt{%$r_E4Uj~EqUyE;))ay@~2q4qWtKM-<+ z6ozRtQQ2td80&eal!zxTk)ROgI4wR|4vVnc;kB{RAK4D@bw7oNM=dR?42xR*!K#0! zGZP`s5qZTuOs}h1d*MCEfIxWS9#0b*vXYg3CC|(H$xpUwcD(r2M#&1X{}g(pr}~xSvWIXFxSjuF`eW(N zpugU68@u+j{ITT?^7p5ry=4{hbJB59`K3)SHo#L(t9HeZ;He_knI0i;hCw6$5OHFy zf{H~u5CPt*eUjDO+-%NcJZEgOq-Hg4-{^8@S3w^NMf zjp5xnGF%3YPQz1{HuN`ItJ%|rZV0Y@-fjNma$htd0Xg&AC)8$u4#SJN^x~z0m!st1 z@yjG^Ii0H@)F4)*Zb8^~^Ba+0uD^D=ha=)3#SWbHR*+Dj72kIvm!q4v2C_eW7|SH6 z5dub~JmkB))sG)_LLcgKmVNZ7t&`?qH1GtiR~>sV{M+Nu&pGBn zg(A2PiXuYzX?8YLmik7#Nwzqn(k=Z$HL&-+nzK%W$*;#b;YMln2{+X;>OYzD1%h8i zJTK7X&`(h3D!R_1xKaL!{vT}tik8W_cmC4b@Dkk&Jv=-t`27Lzf%;SVfULT3d4_vI zLFbI-2SbL78_tt|->F4E3@cenf7HXvnR6sUc&-fU*~-52xou?^7A7IV^!_((YK*jT z9@IXhR`y&Ac$x$gyq*`>B$&M=+oSaBglsMi5=|sQxnHxV92S~bBel+hEx21)b_A9i z|L7Vn8dO;}_5aeRr_UzYY1GznYGmvRyz8e5jzaMACl`%CuQ5tQQh$)3>5Z}dWXx>y z-pqDdjCq%p%G>Ti*M|+LY@C^vk-yWW-{BQR^LS%p=(Bg9{7dfWe(Ea_qT8M5eJeV+ zx3?#jsaG&EV#sxt{3g8jv8tg%dqTkqPl?C7kT~9N$pWA1eGi|_+kf&|&E@x?BCRZX z-sq8b>D2UQDww=`I48`Zc`Z!Pb69#i7|(OQLztxfR>z|gMoZh{JCv2Zryll3fY)68 z$2moIxPD++ufzi&M*-5+G`L%>ZW~Gk!{YHW(lA*ddyj+Su(D8`oiql4m4nLJA!RXm zJPrqwk(b6nu`*~`J6SndG*(^)kA-9LSUEfb36rOcp_KVjOV7>D%{kO>lq6s$vWuy%9^3WJj*cwUN+w$mK3f67P2|+_RL841U zn#ho#_jR!>MgJX-Aki|?XgMH(g8|aLNI3))E)T=Y<8V;8og7kH4j~U@c5oPZq%7PH z0k^ZWLr5dh^73*r@-SIhyfhq6P3yP*asYU%LiH)9>z;)nhvwFOyBui&UPXyBwHS)? zYlL^Fm)5G{K3$ng`q(-P{`~kxGrHsc_bOG?ANOke+>iTAt!u~a=cf1kjOPLZeD;PI zC_mFNy8ipkLZfJ{20~j?JWCFuW})E|p#%&6DBwZ6s|p1}*(9H{($F4te@*xxWi_5U zGyd((kLj85#7FH=!I;T(*iM9B7F5C*pMFb(-0my+@9Na%dp*$?M6bQq|E8UJ^Z@_xFuOO9;YWnVsPml`EJ`t(^PbxY;j-pNGSQ=d@&tDgoZCMsGL zl>>dffAZo@7H5~ITx^VsZ>Oi*3?3hs&?EM){;8TW$T)gxZSX)PWod-9JNBM`_;MJO zo7*OfzW#B*-3-=!`6u_oYlS`qMXK?HCxIcc;p@eAY|Gcxe|?UMvd%-B5dDoFbenOj zb(?v7!;8dbJ1hi>#Bw5m2Q=O8MvwPf+TCWEFQ5-|L}K~uPk^RW`IQ@Fcd2IkJUaDjv6h0&mV1#8KsBZuv`=odehe=P66|JT$~c_ZPUE`3XO{GP(^ zpPL0_=F5%!-`vOf-vv?coQs^EuQAEk^fG7kArAjWo+9$*$|OSmg%bu5XVT%%Y-)W} z!?$;0w<4k2xA!kcL#^|+XIMl7Kh9FH_6{Q2`MN*6`K}1*_Vw%a(a1RD^ryWGL>z~% zVD=8XtzhuN67L)n`sbq!0Ty)YorM-by?@W!sDxtE?VrjebpN~b&Xq}q;rgn$3{*~D z9s@(-VK^vK4ljqsBXM#_7!odxmqo~8(NGK$jsb9sL1NL;NNEH@P8x%kk%t1mFqoX3 zJk8M}V0VVyDEj*}g}D|wCKmj?DsF@_!6a|k07QfN>b0lz_vmkNq~0r_-R7bupqPJb zYKC6jRV&D6&`EEgL}*?z)Row!3DtR0gO>g(ZOnN6tD$GSQ;&Skf&;=oOW$e#cz?ZW z&*psZwBx0xId{N@_ld$GisBX|jM64RHu&veBAsVGr3q-1I$1KGaz{)RvQ&Nv@rv?k zR1s}iupa#%0izN}DEAU4B=J9sV9Nd?P)JJo6|$z^C2-LWS3U@SQx$@%pz$=crl2fu zy(9(%BEx9R*to%PFB4|cxrw_A3|5O(k8E> zl2B42nxhaxqkf;kXR7Ad9y25(dUjzw7f7t7a_L( zrAknI<)b&Q&f_uao}RnClCOGt8L`!608LjGR+ExgbCmqKfKI&&eF;hF>GovR<>&W+ zTYAKE%?aDI`i8{DGMYSk#3z^NC&UiSn3K(S;`$q;1v1)nRD9t|IN zcHo!!k-=_r?LWH0XdAsZvszx6tZ75&7Qa~oK`7t~{(-MuyY`{C*KXxguB)1$a`m^b zU+2HqVpcaczW&^vct`;-BrsIl*ci(&ad95{J1aqPfV4>@okx$-_h*1NKL-9DF@uT%`uNUpif# zoO+(I-yrp&%BTQE#d~k9t*JRW{yGnSdVZ$#b78@&9)?6l7Zr&_pT3^Hw_>7vL5jXz z{X}AJZd^sht<8_OA63tf6l(uDIPm#ZHpFyhp1?04Fy_6%!OguM{|ZG53}|?Na(t{X z+v-=S=DV|~+Yl6+nUSIT`0*7Q8k)wqPe(RfK&RZ6#Yc~$jjsVR&~S5;sS2>U;4qc>90(+kVWbbJ^i6j%T) zR?VEZz~(3F?fVA?VBV@*@dkjB_Aj6P`9byX-#->^?v?jL78Vxod~|BdTieuEj&2Z?gA(( z96LEVdABZyx3_=C{gDDwTXT(_y)c`h_GW%{wSi*bb=lXuN97l+DO@QkEYz5?628n8 zb3}5b?f2Q0IQYSS0_DyXjpZFnYfODLF9LyKZ^tGn@H|!rGPJ?T>C2GDpOWf z_0_qWkjc=^Cl=2TDL;?n>+0as?E%?0?pU%X0(LQ;Q&5`PNKmzm zeHU~d$jHP*7!-YKX%q}JrN{mx7QTBYvw2c*7-1^zW!e68VyWF33}`a0%huPI2YBWJ z)6v23AWy9eT;zP(|67EU`}Udu3+a!? za|jpaYGCibRs~*M?l%9QYx5^4H9Ra zy#lVMLE58qf(PN?qUk-f_jACna^6Ok-fp0zHu`-GRs6^SNqo+kGn#5aL3z_BAS2ff z5Y9*XPiz0Z23&HBGT8tIxMaIaE2O1|!K(jRUBj1V07Gj-J)4QQ0k2-oTyLxg_-L~( zd8;PCn-j;QCT^C1LQJaWbE>E59aO6abA{^*DgP7uv*(s%!bjDAhl2tm4VS~>W#Dp9 z83Y;*gjYCuI93`5lLq#&$suLrWpHw`(lS^C9x5k;mH}F@P>j5+w7fi29*7R180yEe z!1@MDQhki0rgqSn$phbe`=ek^EW~+^Q)#-5LNkay<@p7eF@9K=wu=2SoHQ61rj0>&LY-N*S}XiUawd` zHE~b&gKmGXw;iJW$#UDlW~<-sESZXl^WX8wi6N3dZFEig;n;)sI>~Qe$Zzodm-D&Y zMGmG_yU;l5s0wc4!3d%6TxNN?0e^%T+6b(N)~wv}H?ZyL>FIJ# ztD+3nwBqI$;xgZCmdvR%QdwXPjSMeFrk}@%bgA4B743cE@1OayX_m*v))L9XuNNU$ zq?Dp?a3(s<;Hrq!*jf?q$0$`-oA8=_7k@m{K&Sx+Mb!nJ>fF-b|7Ki zG2usW0##hxBfZha>Cw?$Z`q^zP(nHF2{H0a>D^l7MEKCb`JM0o7+9OHCXO`ei0u5; zI93Li5X!fRe!F5($Hexy{o5~FL>BnOBo}(GHMa<#lcn9XYR+Hj?NVc^hNduqoKnL` zTA>WHBI@`*ss6~^PXs0d(Ww1jksgso&0pMt%^~>(R|0zte`mpBQ+j4*=Gt$Ksaz6I z(sBO6M4a{beym_wuDkEqAQDG$RO(`tgei_X5~)%2F&Y#b%3Ye!m{WhF+H~yumftw^ zzctd6jsH$oELp40M}+;h*SD3EKfhd&G<%U~t<2y4hI$F}w1YEDmsM}{t&CsHnKP>s zritEBCZRFQ98W=Bh}R%&uwA) zCzO*LTFMXFtMB?stf+$p%)9$69%o5y7s=DMei7zyoX`+om&-d3NU1bE%nz}hcVndT zfA2bT$nWdwkoCw7iTh2YEA^|72UGD$NoXcUMkbko=A$olRSCD)KK&ImF>P{S z-4%)MTbPRFZ?cG!ddLj-y>y0MOJ06ApO@B}Z@(wJXKNzkJYT)4Ixih|7cP@LfOWD? zHleD3XrzVOgtTm*EHvdz80mMtOWT_$z5hPU%z5~|GvD}RhT|_c1}R0b>+JLGg~9TM zCzV2GN}n z$*AV*X7~Mpox;*sAWlYO?PO#yFdP;GY=V`?z>%^@oSnQZ7K^~*xMqlg}BFk_+yf6YsUt*6o%bN70Jk; zrX1H{d~lskRCNB$N9*5~|1Cv07iQuy(m?o*L;`f70nY~qw(r8wb{J`C7!(JPhml3Y zWMOjhNMO%^EL;YG!vFz342^~3aR?b;#{pso33xy`^WkTMz_DqvmbDwoL2U>;728Hm z_SYEF@=3n*dfK&?x6yyH{j_a--ad%gmq~d}f%c!C%Diva<-@^8hf>OLtC8w5-;h}~ z*yV~eNR}@DJydL1#r0@BTNE3|LcSwiLFR{7)E|*$k3$_qJ;YA8V}O?U`PGi!Zalv$ zxY;7andH!br1Ofxa<75$b02i`Qn6#`6R2F$bu`~t^!{LCf5z=sZV23i!4l4(T z+Q|YNneAlpNIdwh{Cl>adms?lf5{@i+2Rpr$3ei<=l$=&l7BTwVciv~4UVU@BGLuV zL`4W+ij#{2-dd?W7yWR^y>HH4arsO_T__c0KKah*tBCi{5~o7eLx!`mwCci3afTUp z$E%EAm7i`L{Py2!&)way*K<5*a+;i6)=evHJ@E)UcslDDf786TZ}-lV`A!PLScR#L zH*)jUSN}xMI`yJ%`rq4}HJpKLDalUIec^lIgE@%_m%3UQjiq!#50*d1aL--4devJ@ z&sy@!Dp4GGk;FCP)i&yVSf4WdI#jIsXYgh4b&x12#x_Un`3H|&W?Q3&Y2kBMB0VHC z^|&;+!MyJGA@+DYo8}-NkTvLgUPWrIz7MiQR%TvnnCAXoTRZaM1+u2lKXGh7q)_(tpL}RxRF{OG+BoOAQm14@7h)B%;6Umf1tn7-f^vSuJ_Y z_&%7ap?_5G-tR;EM@B|ghkLNj$x-io|NB=V?!S&??2%##VY1VNLbJTJ>orj__S1jI zWo)YOaiOdYsQ)*w*Vh;?Uv9tlUezkGj14ItAby&`VR&%+`M%evctLcTsoj@h!3fro z`4h+7cS1?gy?X1L>a~YGSmJ8Jb1s_hk z{vPYGqM*;uC~>UlnPJW(++iqC(9SLs=w+4L9S#(dNrzTx1^%a z&>Hg;*0Bf{tJH}Nap9-77B+LVuX6YWl*(_gIp0nAm=_sMMM`v>&kkttx@|HO-&7XH z;-B9o(^X9P80vxKHhnoYGUH;h^++EX@kcMQX!VoXonyWpF|z_Ov3ANd_4*R3XGNwF z@p_{|6^2mnJf+bfWa>`b@LqUA!sn{^yGwJPzpFj0Xf4CHM1Q9x5mJtn16Hje3Y5J& z40Sp!5O_0(IO>OiqpQJ_L&rcL@vHv4A5yyLWU{Z$g5Q3IsjjX*F_GPAYTJ4$T6<$` zEMnw)kR}WNnMQNL=>XiE18eDMw9U96NjpR|HN9yzeYX5&V`7m{5t^gTW#q+Nq_neo$@CWdSJ zBgXfKM40nK5YtEmM9`=(exZHuQ|9Pgv2Tly{3#f8Yn8cDvYkoddw5tVgPhj9fys+U z!_1gzX+U9!gOGd4BFOg>8l%P&ZIqnW&OghRN9kj(F{!!NB$OZ~=)j#X zRpnjLm5&E=5BD#9bx$rCo!B+WU$+>Riu7n)l)LGdjxVW8@0=y2xQ)GDzbB<_B%+Gt#WBWPbFQDftq`J-5mD-;gI$r*572dqI-FW9x zmuj;`^3)yg+}zx@QrpRN!Rt5PElAwu8dxFRN=?4%haIIeWV;q6K*V#?MBcK+pzb@aFWL^MvLT30ai^1c+jI1_#U$a;m-j`A4j^NkQDp*y z#0*Np04+uLYx>D=p_ z+dBGJtrBXWjzVPF+Co!~N>X9O!9kxJari@(MNIG7=4fjw&>i8Y4U`OItkLo zOgq1O9L*rR^s++8+hw-(sHd~+-vd*IX}Xyj4~$VlZvq#?r7H20IIw=s`Sva{V}tg7 zPjHN5d!ql&#=n0&w&hl1>Whg5CK7`a%%;m|sQM5}{f+-Fvj{8bar0HfT`iBr%Jr*< zhW7S1yh}{-vc7pP|IzD?f1y#^sGK;sL?*sb9p?Ya$kov7)A_t_;qffAgcyT8L43BH zYcfrr*AuNbN)ax!Ex#(o!N}n6@ZSxe1_YQh`1^forGQ(WISrN%rztiiIh7cfL>N15 zgA?N8l-ytD`3n4^pM%HViT-Ux`}m{UC%f7V`r=-d41D0qdzY!2N1dhqG?aT z!pmXhAb;|%z|jIE_EqYXis|3#Cf8iWo)Yb#45UD)o=k91@~;*zkdZeVjQCn_*WNXN zuRl;PT{*CQ5isoVs#BEFJH0}vaEZpk{LKfYUt-TIp!lVHfuEX&i*A1p4$e#eGx%EA zQ5zqhA41oG$YftHU)+45>BnNB`lCtMD!HzJWeUxk?kB~_w0B+{D^_#pMPbdoJ?)Mi zyD!$!C#^sClhy5w_-*Fd-+_;&@Z6BO^E$$n(cys{x0FxWtmDm2b}sBsL>pA4MjvpP zpH1%gNY;B+-w$FnBrF?vNseFQ`Z+Y@jbRjV%05F z)!-gwK-1q(l&P8QZg&aIF>lR}Qtjowk9Jnvj}~Yts96q+sjHQawjuD2l;ZQN6x3(T6iFUjU8%$%f^yv*m_kP1PrDs z38Y%t^%J-pwFhjX`DdxJzU!t!M=A7T7%M_)MJY7ubuhOy?glR%B?u(+xpa)&3GzJp zx$iCD>KX{V)%B6WcJzPMROwq<-r?TriAq?P3Ob#7a};t@GBryjj;H{pIa#kATy?t?|>PZ1Nsre5Nh&RLGcH z0`3(ywZ)y;Y?oBdHysF2#~GtHGrxbLSyF9={YBF-Ck6NVC}b?xcp8{gew!<^xoh(v zM$f9Y|0|PghYj}EbIlT0_Y+{MN8&%7u(KWKHD`ZkviJV}^`4oX{igEG{v@Gq;mOmd zmUDq8eS7Xf9n~-WDw&(MqF6JVr$*P_y1Kf4>q|I)9CY5NG7hAICC}R*VGT+bnp-|B z$=RGfnF%;rY7Sg(ZsD#2?pE;T{87+Z%)#1d!a7O$bbB zJHeTmB8g#LWo60CtN+YxbN=S+LR0*gY3Hzy3p7iX1|L%ssqc!Gl5MFUQ{N4YCkKHz zma`epy)6C0D$5EAQtsxegIQTwd0AO?vx=zT^eoS5U@XgGy@zbU!@lDEXhsb+mOe2Y zi(oj5I#^H$_^7K_O4Gn6=N^NWJ3^^Kw44q2mghZJL-x^BRS`m-pOq;{cCgq--8IVm z%W}D*KbJt6JeM=Xp?cd_H(&g688rQ#Gz(4{2&1c{z8`7uo88~EbG-b!sOq*Hbh=z! zE5G=$426At;#JVVT&J@-y}aCVZpqjc$8ay1KTp%XP~{&nI9FQrPonh2btyD@DCT!d zaH;Z5`3EPhJ)pl%{EO>$t9uDJHiP5;9N+NnACbv5 z_a9u>|4`;op0HF@cmKXT?D4MxdAbk!?0c)ibQ92@N{`~ne!Nqfx^c2~i{c;A+?|X9 z=V!w4c~}Z<%zp^3tqP$VJSW31?O<)QyZ`!kKxa3}BV7 zo~i2!|K^AJs>-h3eRVpoimNNi5srwZ+qj=0lF}iuLdcGJ9W48j=2lEEPq0yF`DWQV zZa`JNue2F$Sp6PLyb%Zg+Ds+ll=g^GnFCwMpf3s;D9~XK*ps99H+k=EU@Rt<{dLEt ze7}Z;$AarZJU>I8xL~xQss)ufs`3F)j>Q(}^3K#p2z8{{F zUn?reFPpp-|E_I6PW?&`{b1})(OQ?%QLT3ux zSiH0AWSY4SY{Y+JzP%;8S75ZR8K~AapJe`gmg0%NjIw256{Y_1s}z=yAV`^)YV=pC zsTNrh>$MagHL;ACitMU%uKoGQO9EYC_a0mkotOF3a`snZEc32q?{3JHnr2p$e-|WZ zF@?YF)m-h)Ld6o!D{t-6?XN*Zj}v3w%*Ad=>_k{HRRISHQU8vvOY_mF_7R;s53;Sm z`c5ddN#J1$3p7W6Ik@_(JnV`rRS_qOit7(4skLC3V)LkG`}Z~=`f)9ZF+ zzXfCrPMNeqr4xAqx^4=q=#L4|!YTy~+NlLRDUCRWu~i;d%&IgBK3uW=oc0o_GU|L26}f^VO`GJm!V>~?Nb?fFT`+UE`(Y% zxy=6k5;4tQHIl`m=tMS>LAtj#@O<~!C&}O4h5j&$nh1V$2Z~xsC4D9y}W6Nov3G5&W=w`3%2)p8~(N}nNuhOZt z){V5}Y4q`xee(EHFx&7?t5YO@;pT3*${U{ovCBnYP z$Ffs>6>kvt9lvf^@y@4eQSMjjJBxi$R|f@ELP0Qr%C)Z?LtG!9>wRZlzL~RN-1?v~ z_SXS;4ej;|;#9R#ml2`Ou%PuT{E?EtCiL;W+ItYmEm?T8u$7R>X$SKC+R4)A;&I(V z_L;QQpLN`m>ERMPE%{xfSC>D~KXc(JxQhI!t=G&EEHIeXhdj)Jmpr^}^})1p`$nwI zn&k(PdsY%*S!Vj>ye;il25;T%tV%#3DMlLpUgxG7tVikvJV!e6QAYf&tqtCZFg;Y* zUoEZu^}Y)Bi0!?kU;cI1low;~w5d6I5fggc>3vZJ21z5~=AxBf28&3`#HnSY2Fzyc8hfIYy9#x zqW{XzYGo5juIIU=9CMesoKJwht)S?Wm?`l8yNpSZ98Q@R6)la&m*({O*b4gGB=$F0 zyp4~#RLyYj{r}#mwsiE%2 (thf/sample-file :file1) + (thc/add-simple-component-with-copy :component-1 :component-1-main-root :component-1-main-child :component-1-copy-root) + (thc/add-simple-component :component-2 :component-2-root :component-2-child)) + + component-1-copy-root (thf/get-shape file :component-1-copy-root) + component-1 (thf/get-component file :component-1) + component-2 (thf/get-component file :component-2) + page (thf/current-page file) + + ;; Action + [new-shape all-parents changes] + (cflh/generate-component-swap (pcb/empty-changes) + (:objects page) + component-1-copy-root + (:data file) + page + {(:id file) file} + (:id component-2) + 0 + nil + {}) + + file' (thf/apply-changes file changes) + + ;; Get + swapped (thf/get-shape-by-id file' (:id new-shape))] + + ;; Check + (t/is (not= (:component-id component-1-copy-root) (:component-id swapped))) + (t/is (= (:id component-2) (:component-id swapped))) + (t/is (= (:id file) (:component-file swapped))))) + +(t/deftest test-swap-nested + (let [;; Setup + file + (-> (thf/sample-file :file1) + (thc/add-simple-component :component-1 :component-1-main-root :component-1-main-child) + (thc/add-frame :component-container) + (thf/instantiate-component :component-1 :component-1-copy-root :parent-label :component-container) + (thf/make-component :component-container-main :component-container) + (thf/instantiate-component :component-container-main :component-container-instance) + (thc/add-simple-component :component-2 :component-2-main-root :component-2-main-child)) + + page (thf/current-page file) + component-1 (thf/get-component file :component-1) + component-2 (thf/get-component file :component-2) + component-3 (thf/get-component file :component-3) + + copy + (->> + (thf/get-shape file :component-container-instance) + :shapes + first + (thf/get-shape-by-id file)) + + libraries {(:id file) file} + + ;; Action + [new-shape all-parents changes] + (cflh/generate-component-swap (pcb/empty-changes) + (:objects page) + copy + (:data file) + page + libraries + (:id component-2) + 0 + nil + {}) + + file' (thf/apply-changes file changes) + libraries' {(:id file') file'} + page' (thf/current-page file') + + ;; Get + swapped (thf/get-shape-by-id file' (:id new-shape)) + component-1-copy-root (thf/get-shape file' :component-1-copy-root) + slot (-> (ctf/find-swap-slot swapped + page' + file' + libraries') + (ctk/build-swap-slot-group))] + + ;; Check + (t/is (not= (:component-id copy) (:component-id swapped))) + (t/is (= (:id component-2) (:component-id swapped))) + (t/is (= (:id file) (:component-file swapped))) + (t/is (contains? (:touched swapped) slot)) + (t/is (= (ctk/get-swap-slot swapped) (:id component-1-copy-root))))) + +(t/deftest test-swap-and-reset-override + (let [;; Setup + file + (-> (thf/sample-file :file1) + (thc/add-simple-component :component-1 :component-1-main-root :component-1-main-child) + (thc/add-frame :component-container) + (thf/instantiate-component :component-1 :component-1-copy-root :parent-label :component-container) + (thf/make-component :component-container-main :component-container) + (thf/instantiate-component :component-container-main :component-container-instance) + (thc/add-simple-component :component-2 :component-2-main-root :component-2-main-child)) + + page (thf/current-page file) + component-1 (thf/get-component file :component-1) + component-2 (thf/get-component file :component-2) + + copy + (->> + (thf/get-shape file :component-container-instance) + :shapes + first + (thf/get-shape-by-id file)) + + ;; Action + [new-shape all-parents changes-swap] + (cflh/generate-component-swap (pcb/empty-changes) + (:objects page) + copy + (:data file) + page + {(:id file) file} + (:id component-2) + 0 + nil + {}) + + file-swap (thf/apply-changes file changes-swap) + page-swap (thf/current-page file-swap) + + changes + (cflh/generate-reset-component (pcb/empty-changes) + file-swap + {(:id file-swap) file-swap} + page-swap + (:id new-shape) + true) + + file' (thf/apply-changes file changes) + page' (thf/current-page file') + ;; Get + reset + (->> + (thf/get-shape file' :component-container-instance) + :shapes + first + (thf/get-shape-by-id file')) + + component-1-copy-root (thf/get-shape file' :component-1-copy-root)] + + ;; Check + (t/is (= (:id component-1) (:component-id reset))) + (t/is (nil? (ctk/get-swap-slot reset)))))