From 3e4bf56c2af4e399bc7154af2f32a194e2aea940 Mon Sep 17 00:00:00 2001 From: "Christian P. MOMON" Date: Sun, 26 Nov 2023 02:46:33 +0100 Subject: [PATCH] Moved FileTools.addBeforeExtension in XidynUtils. Added tests. --- .classpath | 1 - lib/README | 1 - lib/devinsy-utils-0.8.0-sources.zip | Bin 24718 -> 0 bytes lib/devinsy-utils-0.8.0.jar | Bin 23647 -> 0 bytes .../xidyn/presenters/PresenterFactory.java | 18 +- .../xidyn/presenters/TranslatorPresenter.java | 6 +- src/fr/devinsy/xidyn/utils/XidynUtils.java | 39 ++++ .../devinsy/xidyn/utils/XidynUtilsTest.java | 168 ++++++++++++++++-- 8 files changed, 207 insertions(+), 26 deletions(-) delete mode 100644 lib/devinsy-utils-0.8.0-sources.zip delete mode 100644 lib/devinsy-utils-0.8.0.jar diff --git a/.classpath b/.classpath index 25e83a6..e9b747e 100644 --- a/.classpath +++ b/.classpath @@ -18,7 +18,6 @@ - diff --git a/lib/README b/lib/README index 8d7a83c..ec52b26 100644 --- a/lib/README +++ b/lib/README @@ -1,7 +1,6 @@ This project is using the following libraries: # Main requirements: -devinsy-utils GNU LGPL useful tools (StringList…) commons-lang3 Apache 2 # Unit testing requirements: diff --git a/lib/devinsy-utils-0.8.0-sources.zip b/lib/devinsy-utils-0.8.0-sources.zip deleted file mode 100644 index 5ccaa1cee88e020ce90ac3431097553f97260362..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24718 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 diff --git a/lib/devinsy-utils-0.8.0.jar b/lib/devinsy-utils-0.8.0.jar deleted file mode 100644 index 10fc71bb3e1114cd6a2fb25d052276d5d6db680d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23647 zcmafaQ;=v;wq#Y^vTfV8ZQHhO+qP}nwr%^C?W#Ms=e>S0-O)31BKBWKoLC<_SFT*S z<)wZBLjnMR0|4-A4NC+3A0Gq&Fo2ARvH*>QtSH^jBmjW?e?!3mc>Y42DT&yU|H51U z9^}90f1ok~vJ#>qO3Jh{qB7A9uz~c*BCn+1VQd%j=R}1qSo@aS+A;xUtOJ6QT#0F#}l6S#5gn1hOd zgm+Q6P;?mGK>KGE007+oR`9RCRhT-`{oesl{{=8Maka2@^7wxM;r|ur;%s64KWOm( z{a+ZjM@=qZ0Dyi7007+ofEG4zHW0P2Hla1LHgIwZQIWF7QbFdK%e|*_qwD28f7VQw}#gf`J!6MZRGq-rn@7)B&6j&vabMg##01fhaQ#2N-_ z5T%B!% z+eJk~TJi|QfZqg{?b8mG$BjYNsrq|!YE^5uL(`4b8q(2J#mll33rJ=bJfqtBB8^Z* zp$~|t=O8EGmati!(hFBCa%D$z0@Y01bFY|V0eOTSR%9VAfIO6Vn1nb!+EBjIfE#%P zT(k&1sRKC?GC!y%TMhl|Pq|rZ-6jc|(p4AwC(ATkgfmNdlN`HCtXIY~XOfzk;wAU# zOqp}65|9g%ti3amuPQ(7Ba8B>)7#6w9WhbSi+&?)cT-qCv>@UjBB2}0{!nzB0=zvk zsOdr&$KaW`H*`|^SP^?H2KT@QNbEq7IVJXKL%s?3;lx`wBhd7QD#j7vVR?8uB8bsx zFQO{BK?>sP`5Y&Yd%&4bg0hFS(JzedViM|pWK6k0<-^>?l((~`6!!DA6nAsW3Nh{q zJbMv((=PT@l!mYtbtAooI{B+AWUqiHEn<%tx?{qf_TVvx4BOt?5z{y1h)hGX7U2@A zg!82oab|X`vOSmxvJ4ZN^moM3!#6UShw$89(Qg!)d4F(EU{bNAO&DE3?!jo~O4@SFmk9-u`A0 zwPVa&DLx}Md)W5V%zhj&^(3>CN`T)%?OUPGJZ|6ffhgv#QvFsoBfOKI>S#RG!Y^XN zO!vGmXE-kupRCmVzA)HpHm^)ablqOQCvR=2fx=1n1$L+-t{{2OBgGJAuLY6r$_cKO zdl-N4SMsp`tOQZ62(XN074HxfhHc_}WWjzf4HY2N!Nt0`ZSBRn#Hs&z>BoH7&fOaW zT59UIZsHFyDCZqs1~{}V4+DvSg^GQ2w2{|2%-&X?n7I3FTS&_|CLz`~ICZUc0A2?E zSV2a-5QkE0oJd(-lS-=6YY+8s+r72TJ59WS&CUFJ5{O&ImS)*&>H=X6Cd=~UU;5xZ z+ROX{_4Wo6uDN3PPC%KyKdqE``uorSLE8VIyYU6}Kw%I7fXlzMgZKZS9jE`|ofwrZ zyCf5A-`$r>gT2mQCRkKEr@$jMJLFmZ^+F*w`6I4KU|44FtG-lt&e!IBi1(wz@$P2P zXt?2|`3Q(c(c8`t=*NTZ28M@v{WWR2QtWTtc6=B5VdPiVMk_iujZAk2?KVJPKOSe(pEJPc-Qa2rmaxFbrVE<#(; zv%k(3nC3M}0v#NCGo&)mX}m9hfNOMVSb1uOYoplUd?8TgtoCn$R21h>F6* zo9QoCkU-D57Bn!A%aq4pK_+{L1M*Z!G`D+{qmpyEd{Erb|Fq?mcoriiN^N%B)L_wN ze$q5_NoqdMZbep}s^$<#H3a^4E$Biszqr(uDe@UP)bQ}tt$}U2f^goPGK1yXF%JAo zMGC~sufbefR+Gfb*rwP)bggW~N;Sl`nrGD&gTkL?oidCgU_SE}lOHn!AhezfK&kdL z0Y;y{c6Na9r-d72f9M^6R{V2~fpor=Qz<}(imqB)bhlkhtn1gfLBMSVSUsMRV;UMb zbrp+=LcW8WUt9mEiZbCquE|9Vnj;63O%sXAgcZr9kJ2+XRRis}-bhyr^w{bN2qTMI zZthSInfnxBVq3&+%B%JF8An6!Oq2=H80s@-R8+NMz>kWR9SjS4^R3@z6%gXNJL*=` z!X06sC(f5(qsl@A?JS-BnIPMq%=qU18={=<$@Ew-StGE6R7Ur-!Wncev-J@ixN^)L zq^I&c&AAKEumy!pPr^B(_MF(dKpr4UL5<~!aC{ZG8lwlYk8Cxb#nAz`J=o2W)V$)2 zyIC>N9NT%Uv+6$1qM#;7?;XpzkK;*R&mk&X-uCThgsg2!Yt)xN!W#s2xDU8Nv_2U) zTP!*v>CH)9LF<*RMYBPFO7OT-VSGYzdGTizFr#R@T$9Q$!a{tf0ui~D#|C&VpE4D*k+ zs1bM!b{yj=H32SB#nD$2X9Q|?X`&hYD0Uvb(8;L;p_C-r9VY6zn}R|#(v+&ER3t9R zxRN0eECZSin8&5z7thnq&@}Huf}(k(H5GTWh~6W(V4C0H8@SM=U6 z^TN?hB6G<*dzCxCWZExQ&cr=4eGGaxFqx}_(_*jYqD`VPLY!k>jGiEvZg5aG)%nFb zWpjvD$MXD|K$)hNPuJW9BINDv&I1&*=T3wg{4Z~>9aF8Z>6gwZ*Dt}!SAF}ukvhp( z@cR}eVv4XV6?@H<n#j}=b0SYrr^PM}%Vd?#%-AI1)3JWQ0|PFGaW{(;fcNyE zfJiJD|*kazM|A6|OHON=*48^~>VJwi$hSTPvecbXh4%MuI4%9|sQSU(T%3S%;i}m99m91! zG11^`S^Q%@CK|^y(b3WHl-v)yW@0n-{M**W+WF!J49qDcn}v8D`#J+nUNlm}(L8G$ zCAwmAl4U4+sqO?uq9=Xf@v$=_$9A%P@gi@6@4}FE^C_8}; zgA{4GvJTypwg_!B>NL_8Lbym4*JcTU#}2u%)1z~Yu0vpnTZW6L&;2N) z>9Jn$A)imz)+=s*+c6XWd|E8hxK_o!Y9Y zgq^a^JnWzh(9Q5_hqv0$b?eTmfby-OTAbSW+iEQa`be0yOnS)ezB2OG;*D3=NXYyR zP!}y+Cqnm%%k}-Fch{(m*2D`@k;`|mNNLFhWTzkrH`#dfQP zZ$7|iky2xr1WyYb`z~99?~tRw0Nso^T09}y5Z+8(5Qc9M3sccOX=M2hb$9g+))vZn z)$yJfO7A#?W;yY}=u3D=?!H#~#|yKRq4vOn!n7EDh`ov$P|_T>8RafSm@<1U0%rcf^vMe3sRpG)gDHI1fY84ObzEc>j?DA{) zALj~Pv{-r;C2fig8%)3coa#PDvhEk6sZI{7Zg~bsjG?pT4;13}5p4o1IGxzcyF`uZ zWYNf!KodI#DnKtO+45w%hj=F@s8=jQXN2fd#fn@H=ldbleYRGR&pQ_EQy;HrO(f)t z9o(L%k2RhTf{Qq>C)JCE&PN_xog&=FbDQNj_owS+FCI^HuD59n{)~OuK&ml7poTeo zUyH0K1<>o6Aa>CT4p8=3B-R37?;_7PpG_7AobYc1nuO8_xp_2&z&>TN%)mSn}X&*c>&yTpXwHM}lT+uuw6a{&HH z$9Yc@D#A1ixgxqfm*6@o>OCpSttsNYDoXttIQ&gKyP@=g%=fWZ`s~kxn$^4SqIjPi z89`@JUSCQ{ngi3ds6^Y*r~1fE{pbz0)qX{`dc?RF`$4`k#CRL)>2KMUQuFramHRW&u1d%|wB%zaahO1GaT_rd=#0+96@X?_@=a|AxhEp-IT?`q9HeF(8+x>ZJX-=dQ__zRkXiDYd);L^%bx2oJ3Tt<;{!k+YmS8vWyw}HutZm2s5F!o zLoajQ{FWKB_^LgCgE2z~Wm1EBpUPOix~@>BaPs2ROP5GNH|*&0j>%$mOPwh^)0}-E z7SiiHt@hl$KW*1RgZ>q=+%h``+Bo8UHmPq(sx)58HoCWz@#0viJc(?|B26#6rLa|% z%(WT2t;-{2z**GRHp>t^rx|;aV|Fe}e1@LvTtg@|s}Y-CqlOlubr{teU);jjcGhks zv7@cr&9zD?#NBqBiPB)oQ3W^CX|{2S{3<+A87VcWi$J@wGFLU&GP#{m+o5v9K#Uku z^tiLMjVc?`l{8T^%XAgF(s@1MjGQ=YSw;4HJqnj@FYAEH*MTy;LT`CzGg5tSQ)q0d zRp%$)_dO>e6*{qR2%hS7iq&d z)nM(zclCa_k=xourq}45B(&!^dFz;9%dEm(bQr$i{jl=nZ1$sRn@AG6?*m z9Ogs9MSy?@e!i!;2(Tt;w`G72b-qgi4)h6k(d*X-*y1P9hgfCcglh3UKutQck{Y3L zH;C7D7j`kj6&>sWd`v>#YPsQ&9&ye0y4KR6qECpD$GLfhpwvmFqJW2 z#`IyA%(IFWlM;sqrQd&=;G|s+$YU3{>7Wk`Pz5Y6(|IxLyFf(y-{-<`0QPpxo zQbGPH%`je^Kqi+d*(_?E|rg;nB;JJ*?9fV;W>Ntv)cx)hfQ;-?$3|) zS+6@n>8?ERhefFa$u9H>ke8zvSuk8^#Ma>ZhIRUy<)_cOoHoIxbtKp*WiNk?NB4i=)QwSW zW?064Y++B}tUSeEB12g)1Pz!XVl>c;jq4}tTq5bt7TjLMlT0y~nUbO`!?>G%=;v`< ztVs=JVai&vmmJW*VEOnXsDv?h*YNk*9hL#Ni3;AUmr{AlTZX6oDkL@@N#T&lX;5 z5E-_eXgXIfwc^ZGzirE#7-^Oc^&hEE)WdWKEkSShce%?A3|>g9oTxVT%^_pF0pMZ2 zftx{dhs41=73}qssaNQq1OfVMWV@C}Zpy>fI}F$97%lLcbBSH4EZ%7pKKI6FJa~x` z)_98wy4EI}8w+BF6-yg!_m{Do?Q`=IwP!(l)9Rhh0kJE#p+L$OBtVSIn-mEzQF?NE zEiii<>`Q6mXG433L@my)fzlpe{n|SW)b<@q+^Zs)U$W@oQXC?@p23$f7%iU_ZaG>S zQLI1aHS-b$bUlHbO>kU-j9{30*6usHpB8Hzl-jH{+kEJ+$tdAt`IZCAKQpmZm#inM%4F5IB2>syl;;EGSl=lV0{`wb-7(wM;n4$ zCh66tX?wJ#<(X>RA3mdvo_wSBrtXUN7{1jy0 z178TCc3IerpQiL7FIj-9@|I9dBlQ>->UqLV_e9_F=FW(;if7-5Rl{E%%$iUQJa)qA ztVAdq2BYl|*U9Kc-)swRDXJtkOnZgsWqn%a5g;bq5O_35(UnO6?XvHUskDl8gop}c zza`a$+CpoX+hv5{EME45AUJCA2(T5V5g*p>=JcF6?_ zwN*}6XRwKvrV)x_X|Ncv0X9^rxxgZ(lzQ)(Ge1UN_k!kNQ4bB@&Zt-JYJd`OjiM|j7pDU4?lTGpo+f63`EyWw%V?I7y&{9M}u zAZ>^jWk>Zl+l$IGT6Z{N|Oeh3MI-)WMR{pFp$L!)Qr2V7uyMyO{`MOVdWLTG-16yjL~ ziu;u9m_%Ukb1vg$&84893o==}5d3fz{F}N@43QIuaK!P%FV@E-$LDrJs8OE9RZi^5}!7PeLDY=+DS)Ewp?UeIOU}avm~` zr*{~j<>TzV!}zrF4ZL5Y0@}+cyCd*6+7%;@bpSn|nOp^otQ2y`KuL( z)uKTLO)v=+%iKc9-{O?C!FH`5L7L1HM@WV%M0n&Nk`}yWRjQ(ZElS_bK@*hHgU*f?$L^E+E?-KAJ z?yLOJ2MUR_!h0&A5=G59}#TNDLvDxac74;M$6nT$@P@VAQ#^W*u5JQGkXZth#XI z$WSJ;ja<7;QgB+@)fVyMM31;Quh&&=t7afYY+R>hX;jM1vAx(J$5y- za5oJ}W?}3i97`IRcEz*?o5P*l8q)7TjSdK+3dvsC7Yh&8`K8<_4aPvrck?itJ29ujDpOs@PF(nbK{*N+_^>eoXZA%w7Ld|Gy`5v#+B(^#Gj7H-qd=wx$8aAQULo{>;gr$-)oAblY)pSw7@>Da!pMrZ|ImyRBVJCa zTC3M*>$3yP#iC9&Tye>8Pt{F5Q-|?qcf^I%H>d{G*Xj_(dvzFP(RtsR;oFT=cf^Xc zc9<3^&9Ek7?LIVO??`6jJ1Bw=@``VO^&W%c!OY?(urG6+qNwlS7Ic^KzBL;Ykt#Yj z9QmB2@CWZ$%q~u*^y>HvXPvr%hV&Db-9dUvRNMom3@I)3v1EVEWJwHuCppeg_hTW3P#X?T<-s)n4?j|LM=Lm15FdU_& z_~$L@r6jQ^_Q_Y$(FkN^3LnSp#YN z){(YFwm+b@np=%=VFr7u^ef(2uMt)PICa){Oh9B+)-x(d0$Rh19W`#_E7V?HbGF1p zEAif((}aUc1Q;uplp#w`N28_`QsFVjkMXF^a}`pPr~@b()vBe8GI$7rECi{j$%qHCg``Yuy{dO&9W_SqfpM zB+s)0?-*B#NcqFU=O{=xo1Q3DQM7!uEyX&V-$luguc7MnI@IJrdky{lA(GYPGnx(w zRwKS^ksLw z2CKpPtHJeFgCN|rl+p|Y%U1z3^ZHZFIkZO+QxNBnaWLGs0*oz+C1M)lrBD(Rzb-8` zXLVl!3!ovH$S&qxu{ugPt-LJ zG&Fg46_b>FhuS-1<@3WeueAgpNv{R!-yM{%1p51ofkSv%p;mbVC%_m?mH?GiWM}5d zIKh`F%bdI&L7CP~f%A93VX-}l}QZdS+S+Om0J!0Q3b1F>b9{}){{wizHzOtN{U}}LO zp_FJXMQ^<3Fg*^n&N?FqtUJ47oXd6cQ1@3^$WDSyV!vWE-!6wpuDgUpzmQx!rd&ME z#ICB;)~OAp(Ef@pJ77(Nh{EQyG&G%ehU@e6o~4QxAm_R|R&A0$LRWKARN3iQ-x06f z6}H@t&bUCu^r6aJwlP;|Gb-pDa^mMH^6K!VJN64O+HaXh{Q+<~&^aEgI(+4i$fruN zoD^ir8}bI*hU)8tEA7mKMW1kRO*y-w%t485!cbk>f0LX;yM1g%jsw)wn!$Zq7*6Us z#1ada)gXLo$w zGqz7hN>+et9N_~lVu{D`NPg6gr?dj-c!qykE~H+YJ7DR8e!2Yk^}!y<`waB461AJ9 zFbLOrZJdbCy|3Z`rS?0pS)pkwo{~4xVtSy^^0BWR!BywFM`ukwT3auvW&>~T+$}ny zx!y4$I?e~n_zpsYhsN*usm$aZx~wry?o4f=V0Rp11{2L9?6nhRD$ZvXSbj6+huZTY zsS6_<8uhV`C5ZK7K@1P=W9wm$^_f;L^7T!!TMp89|GiAJuOcVYvB`Nh0Izc+@VeKL zNpv9WRC5N_H%v}bG|hMRSvIPcrJDO85~rz3oNo2>SgYXd`_lQ-!&~5W?GN6+DsXYv zW$>K8gYNIYPAl2}M}aFj8#w(=&JBP#DV3lJQ7*jFt$KlWz?C2AXzF^^ zE+KDnJ$;kYarSe%eShTlXY*IRzbPsPGb8#?cMO!H?)cy^mPW5m@=zA*ZsUDxj2p0` zmB88_BKn_Zm#M9n3xT>HK%z9@Y+1g@FM3@_wQn522I6>IPy={6$Ye^eR<$&c>Z%@< zJjojTr@B`*wXbs|yOJsKij_!5X@YZ}xM_o|5&r z?sl{mBf3;-j$UWpzSAAm3CKN!bWC~Y9{Zl%*dlywHR6sf-EIWWtX|VO=w1!`!*FaY zlK`WS?#5pJ0!1Ekan6Ufj~#XVKUa`4sPt4Sn99}4aPQ`J?pkZ#IqKIP5=8In1(5O% zO>NgzD28R~{buft@>&eO?T%Bo!^o4(LC^D1p9n~_xV!Pf$sxZ!Gv^wq6^XZQo{M7h zupKYr*UpRsgB;pn9mgM0qbb?hLB(oy9qFTzU@6%t>_0kiigUmmJg8tFA+hVQR}`{O zYi9hP=--Hd={gAjIm|Hd!~%>G^zI(m2YWIhzl_s%FA9mpHnYd_)5Ej51h%sOgs)IeUF$V zJsXW5uDK>bKkYi%+@)hb_<^nZ0yvG)^!VXbysm?3_e zo;|zo1>zp*Ng`*;RV$Anu>7?YO;(PC=z>@(n1j&Ir`>Ff#B$yGViPJIdc66GVN}=> zmHibz@UD7&6JI@SyicTg&#;t6;p!xwbmkOEgQO_CB(209A(06keTZai-7TGgJ!>BN z$}R<}m1-rsryxUHfjV`EsR%BbX=rtwyg19WVd$jGAvi5LFE;Waz4flguwf9;mH+i5?kJhY z_7<0X#8Eo={`GHGmZr?$K+fM8`w{&=$1wjfV=LR)S^swoGe^zCS$PHH&(4I=?zAyJ zRR91WbhtqxJdJ?`KQn{`geeoma6YPTA{u)7bQF`FdUbP&;_{}CnwCwCjke{=Dygz| zRZ6F`p3MrapVy|-huB;NSV^DP*-Td2w0t?(!>-Ss+wJRj@3ZgYLzf&kOg@4ioB<9m z>fj7}?a>hdaxtIm_zI1qOO^HxsvrR`f*^zK+P%d4J;nQ5bFsJR%|~_Y9LSx=`!~q@ zn;|&LgEB*J@zE54H;5k00qi!#gxkbioy6{%%XZBXF3ujf0Yxu{Aj%Dl0YooKzYl>o z)?R`nDanbi#~omYr~H@@!Sa3=C+_M!4^CXLJlWjp;Q~CNyEJbv9Uhz{3SWHO7|Af+ zMLHt+-sb9Vcaf96+hyx%?@w#M&d!XE4NytWXH1Z&&~*5%&3PNr!rQJ4kds!8`y%V% zi!4zpBgj`)(S3Q3NPfQQvn*iE3MNTQITI#Zm(tOYsbN2QY=&Ywi{Y>dyYj|c4 zT_&>nHb<&CIt!fW(F73;1sA53d7NXM$w=a|x@B~1Yr2u@pf#6u*1hp^B$Rda1W1~c zM$R0N-=K7Rau-MEHP@xb$z39r$DEk6PIlCp5i_@o#(J_A-LxKNg zIx2V~mwt(x?nQotCggiZf-$SS2P}a_2_lhcSCwzB4e?8+YihoPxim`v{cl_|A;^D2%6dNJrNY?SgVsgdjR_70}Z=)bO-`*tJDZ=}$gK_^bHP{ihRle=m@ z8w8S899#ynY^4~qi>i!rNU;};h+>N}orDH<+f5j*56(xt3^pe@RhLl50tlvTOe`iO zASkDHnnNY@5(xnXFw5}3cT%B94uWiq)uPks+ zPYgOU($K)CU7ehs+w=0VbeL{2#7s1M*w;)k3Ks@*iZ#CpaL6i{3?|Xrj!jd3QB@J~ zCNxek#@u_GHdr95Q)pSr&HA5mlpcv)Q9w9tbDrA(X)dyhcd2FXxpDO*dPy{aAt`8K zjD)@i|BcL7&5?~VNJB!AnIYrnT-JV52RD#+NtEx=n2!!!n_CsH)9=QSwkFW$4l4mc zIjV>lJ$azZ9c9qxjyO3!AJONIK^c4r^VSM88Mp&VWzdB>XgYc=ppDAi13|rI*Q7u+ z8Rhr*8liJBAdligPpv#xUw(yNx>H1_-ABf%4ZUIb(msC^M(Z7_8K|d^XHQ9B8;&C_ zLE8na0mJD@{%P_466N)kf}14PJ8HGY>4Q3YU7Y6Ik2B~dt?@=A6eKF&*@1^#BFEt~!cv z!s6kEeBWw?E34U%Z1aNo!b?Hr7jx;wgeF{I{FU3g2X;HjDc_x zD}pgHn@Vk`L|Ws-4o%W>pOs?gmU-WUh#r<7+sqe1O1xqW)Ru4Rvb#zu&-j_TzaT#I zXMuOBF)K%vrear^E3sL|keqmb7g&MhiYVHc8p@OF2p`L{tW*4gmcDuRnaPaURDupo zW;{|cX_0?09?j1NHKWaX)-G%*M@2ei8T}haf0qQT=uFyQr#;;1nltv!nnOJf#@p^V z4UXiC%y{a=35f#68>;tAxRd}_NsIOIx7x6jJxAWb6R7n7iZ_@^p9^dsOw1pDoP;It z@LCDy6-R^vL#tx<8Dwv*%A3(jC35u4P*jTY%)xAmH>-EF1I;rpNWh!gachV6M9o)n z5Hxc7s&eGvIs}*adqGXH3_8w)FA)x3-F}Z9$6T~Lyu1OZ@T2%V{ z9ANGK9Rglgi0x^5Ey+yGQ1XAS<UzAWG`x z*BPQFZajUc3&kVPP1cGTr0XrhfT$3BsS){#*b-2V$Wtq{WX%{`lIYuThHO6jAWdN* zsdJN!*i<4U&JD-e44XVtlCjYi1BW;_@z)o@=e!{#LS^zJeI-KHbyJpQ4c?e&E@;(j zl2vksB1_m~NK|$zzUP^BI}s>P10ym&l7B3KTb?(GBQGd7;MG(bU1~A2xj#+6qvku# z5+$mw7b#mPs&j`6NqMATSwJX%5vyIy&8J{G+!)wZC;;M-F+zpe6ZMUCV7gtJN6)|- z!gwDtc6!oO3KOYDx~NmF8WpXF(*)WmS&N3XBXS8t)go-!=d8!_6rvFoLY1Bm_&TtR zif~asBp%}s-ikih65gVFjE(p|oTK}6hvZlV7d$kD*bS0%<&ADy5!?N$S~=d+y&|%q z*=l)egJa`h-k_6f|Go}J`Z$u+Hdc=#iu`VtQoUn`oKp zVd`@a(hA@e-6?+rS_F@?^w)NI@vC&t-f`EDg^P$vth;flzW`l;ZE3~o5Be&$6uRy zBc4&eHBx&we|Fz9DAUodTH!Qma31%1oNtNQ9)I#(ng63ouTgzGHupyw{5LUN3B`xM1%o{C4-SRk{nZ7?vUX< z_ciB?>;t0ZdvEfs=so0Wlp0UkGH6>S8+ljpuuJrtftjX8WMGrBe0)UNl)*^W)$+h4Csc!Qs^p8m!}GyUh{{OSBV zdg&*9MAXlz1|0P$R6i#d_O-%Q_XwLmE9sA`R6}1H;)QOIb*d{1KVSveO$t0XY&JWALWK+^(A$n7r>l>%7}urh&}KUwW%_qnMU{cVRqmnC9-rw zI?NG?E?s?l`Thz0sj{#_;=)H&r8`L4U^<*pL5`9dK6?TvNmeC`V7s`YECB& zJ}NM*GE7yki6)KAd9_8xEC(P*SADz|LOktiRcJr|Mssw@>1w8d-olz?aYWiBN>6Ly z7HJ+&$+30%7LeHF?dC{jgOTPI9&%Q!234wc&tbZYl_-AtjKX@njWwH9tp6tcRipvO z2j_d0)2&)GC>Ek*;bZA?^-3zvR`aSv&P+<(Z!XVj(dQ?a@m+RIqFC=#o$K}l{;nn}=vqFgco1++qZpBNx@3Ss5>C!R@+5svqFOol~flWkvZ+Db6{TP!5lOZylW+OosLMLkXLzuGd)Vb6+DZ+r+a$$P)Tk^B|a1hzjblj6Yj zW=bOYEiKkJ_qAp*bF_5^R`}AdK$W%+$Ra2P^O?{X4}2?(TP7uxNN|jdRNexO6_s>1?yoKz3OUnF#d3?*c`a>AUCqI(M?CaN6(koNKeUQd-cq{oMTVTK; zb24?jx2p2nBh~jLV_qh&R3@$zW-r#u5wXCJ0*Au$kT(=QnHXg5*Xz3!i9!}~_B$Bk zB{1nuZ1)}Czj}o*F~3*8|MJcL-v^!a|G_Jiu>HHLw>5E=ceHc&5VEs1wJ>w}ySo1$ z2Fg*9`pZDbKear#e4Mt1Wpre)GI|w9#4Z7;i^Mkh1q8M^U@{ak>&}VNITkw@Zq}~> z!SMC`)auIA@YJ1xlc6BsnLsG@zXIL>#jDi`8jOO}lgHfZ$ZY#*Yr?r-bG>eQ&b-gK z@@#uQA0O!evHQKDweF39!;01e2{@pq41{6D4A~5 zLt`Fpg0mkHvg02oz#$!Tp^Ye`EdXscYLr0|L!eGknA8|^3~gI4HvUGsy-e1Qa>t>9 zC2bd6feB5T6gw_FrGP%duh&OXd3 zjje4DS!eQBH;|HKG5XYa7I>+as2Z{zx{}E4+B6yW8Pia_oNW|&m^3IQRBH7Nw>R0& zXf==8OuW5(GIhzFGTniK0`~Rfh#qM?ha^X0WEG6 zE1DM&G!9{mr^^C#{mLj!r;T6j*S^}m$gW2?Lo!97ng)XS8auu(5)pp*N{O0wWeT++ z{?hb^rfg{{*Gpwmu0n)u%4Es_4opkL%JF?#9{RWR&(GHSz?cD59vlqdhLk4YhAd0j zw@X`Q5q#t2-w;A(SsoBSr`P`~cgkq)13ecMJ%K zbYHqbq`Q>{=?*C=Mc(nokL$=??^(0vnfYUXp6AS(6MLV%zYi%>(dNZiA2uT?zM|oU0m}}<_s5kWCDOe3s6}6&f78X0$$AzPi~aqAY8!=_ zOl|$_2snU`WboibtiiPb!H`O*JnWEx@{4f*r5BRmjGr>L`o>14%JYsGALNRLgml0{ z(9uLkT*rAL5}C=%9qP9taoLIjgtFr_SsxVQteLJElv@U?%1%xha}L!>+iZGQ(G^w{ z$G;L7bfTwq%r#$Q=rtGjrW)x>%XmR@wwfoRe7a);ArJq2$y&-`>)2!I7)aBBtD{D{ zqZ7J2p0pDw5XH@S%T0UDUD$~aCw-!`Am&ZGMr;$i2}V!sPWa~SucI1M_bK}FP)u)M z^AM3Nmusi(>9;mMFl+5P?X0C0H};s61{NU7#d~yAKhEe?bm%t%Q(q|=!vX=p`7cX# zucEhjGRR-54;#k#xLYAO2R~MGj)qMv7W#A^$Xw`$N0FGj-}6 zZ&~ViS6yAn;7a7lw1DyHPUFNIH}$cv_WL<|ev2XJ?qOe_@=d4MW4Aud%+{1}QX&G} zsP^*?^IOqq%?#KZmZSP8ZjvCn8qEq%g=62O?Losw-^fqZ+U?x2W8?@t#8ln39Dbcj zH+NZ0CgAVg!-nP;(%mtYKC`lOv;~X0K~tYBz;@vOrMbU;rmKuA3QcpbUU1WuV_v5W zQL%?e(o=@2Vin-v$hLK+Na5lx)Y|B8A=M@Yc9I*dFe(dO^v8!%XLTd{-uuv3u()Rr z(8*5S8+^m=+%k~1@R8i`1DsZ8Rv4YRSHyCvPuOG6j6za#u#0*d=i-j?W^5?$x5wns z0`Y2@Mh0!JNT~4oU(F>&YypUXMs<#2Pi>JIIbk1&fg#}`OR9QRMZ0s~o3vNw27g#S zI5itAs#qvlL*I=}XJN-3_yq9e&DYJ-Ym#+X&DADM9&9dGlgtKd>>?MMcQEBwnuE)1 zb994plOn>#SW9StTV0ekaj9{=Q{w}QVlEaBJ&oPv7o92a7w9XIRI3+(J44R{kkHVE z{iK-Z$_K4wAE&4F?QJm&s!tZ@CdBKt)kB#7ecDOi8_p2Lr^#~@!m$`*Oz-5jb^C{zAg^{f(=tdFIM zfq0+SegqJR*YEVI7(E>?Eqm7D0W-!3O7rZKi>UoD(I_?#UL{9T(U6pvtgpid1K;wY z87Di#C)Iy3N^h428EJld;7jV);VuINtv=XC##}Vfa^@0C#J%8j53XSN==Gk7Xe_-R zRiA7{Or5w;nyB1e%2%0u4w5@><#W&~u!{7eEyCV}xXzKhF17=ZZi>$@Ge>Y`6${iy z1vV-)!Dk=$h)#V6v3OUgmzH^d_B-XIrje)eTbjjg)Ss{h+nsvr207ahhs{VKV!j!e zNidzqJbF|Y8nPaTsn+k2s^|CQ_>m|}(tEorb+XvgFly)eG>pR9NCBFMo3`{%E6XC& zV&3JVy7lb8ltJweM{9K7x+i6u4v;TKEPHF?-ix&EFfh{U*Eql+TX5X8{lj0z{H%j~ z90RMh*m)d8NMj_QN*lE_{V^G3@W5CS4>_W zuBK|viXUuIJ2=cGh80RL6T;SsB`(7mIi?aI6*`L}n-EAC5W3uU;U8JnDS<<-7;-e< zR8_ZNpY6uQf9^Ycy*~KHdHC&1U*B(!UfJ<%_b8Dbnj(8Pd(2>RbI$Aq8K~jyND-9Dj@Prvlu6ws9uC8Q8nilV{+iG7Dn!<706~G*B_6nWVXKal2-RMJ;CFb`fxn&iK z*p8TfSjx*&n{tUiMTwl`G?f+Sd}$}oEln)vuV1t5O+iasB=%2Y=#hTj27mwyaPG0`h1CxzLZ#_W`yWVz|r!=QUy1-6npg9J6LfI$2e34HjK}K$VU0 zn~o%u7!|a1hj+#9xy+h##2luwz-Vwa?8x3P{jMi<`Vqj9g{4S2>uF5LI|k_6$-sLd z_7d#hM91K3F1lc{ve;qy=ikHAr|C zfuZ&^Fqe;N!b0tu0e|9McMxstNBaBm$AEeffl&$l9ZNlq%) z2O1t?{OD}DKuywS`)s;i-|n{LJsDKIM^{?$AaCa3Maw7FmSkwdfktniA=XOh51Fh+C(yRvXFBr5AK+N-T37 z*!JAUE@-W)oRNqi6^P}KaFZ7+L1D1Qk ztM^_o4_!y=I2krSQ$wxkD$nSEXaISP3L1vQeLCNhVPZ5BzVl)m1)|kjvyY)9^aEFz zMpTk@rTFRCB0Ohf(mu8UsN~dX>4`m+rFCo>yQKMJ$s|%7{m)T01qcynyhoJ{f%kft}#AgC>0A*fL1Of1p*% zrw-=qaB)>yF4+_C+5$m0`9dAz2}eqsDi_o;&1>nXC#ht#N$;q*-$%9uVhl~Q zvlD6L37QvlGeZ`5>%utAwn9@_;LPzTUdAesy^s=8ClBxr{g~97w`znGZdQeR590X7 zD+sT*BP<*osEGbvMzr>2#zi69>1@JMJND(t2rugX|Dwx>Z$y z3_dG=FkWvGihd_P$^?29>g{4KGhG3S5>#=G%uV&`v~vkGTMV$6^fshjKXm;3}NeGRWR??0`RNXcg# zyuaj9H#iL6g=)asO=uc{nZ-upZK=R9mJDJYOD1AD!r>sv#v~#CB;0zj^jgbzkz2mW zPIFgiaNTQ>ck#=2pUt$l%0GO*>EC;JWJ#(x{irLQ&OR!e;N@yP()BSAtLG1*gxa~4 z`bX})11%(I#vhvJt(HVc-IotYw5A=FGMX(`iGm(=Q6TUlP{GFzDSbZr2)`_`oAGM$ z8Bs0L4!hFl&-x^SmM;+|MUx;w3KTXC0g%n!^Gekd>9i~n=Z%;olGC*Zf+%;umiAQbF}x-Q}|~o5B0Wa23iKlglSZg28y6vm}gOFHc(DRtavi*+yS}l0F?5f4x`LjkljL zA=3WJbgBH6Y7}jG9st!(QZ~*h%*TQ;`wd)M8%7HxbSu$`$YJo5V?( zswpAB_-oqx)J<{OkHV8*){Y^D$6L>@+Z~IgV(B}jnT7dH2JZOzUZhEAi%MyuLwg$ZPq%}vMt8N@4d1+)@pdEn<;_Ax7nFoJ2`TMuf;i6`JzR$ z@nb87-!9ILsf8<(>IX;BWseUyUcpp}z=1y+G_I1h{Bv_mw_1OgGP_q!>nO}4Otlt- z3IJ%k9Rt9ok&;jD<#(xuF@WKT$dy@d?)r0;d{$*xKuK6FFQ2& zu-s2t!M1}Q?g7(v5#YkI+8zfGTqs$5saxIM;cYlP;*=l;Fk$rHutOW@fgp}-u zJyJW}Ub9Ztc-X?Dx=pOLtv#TY3P(E{XQ^-LnEZTj2rX^K&mu3&JIAb{WF@b^8omg$ z{7{;?&TN3bf_iLD$8|~KZL=_)d*KIoF71Uq^Ms+Lw3y;RYULFCd@lms+@*E3$>gpx z1u$xM_G>TI{b?1cmyD~}TS0Oef>e;H5xhOG$%F6QO$ym=8r;2S%(h1Y^5}k<3~w|m z^hcGEREH&Ho4a#+#`9;MXE8Xhr~T8+;wdZTF8a&PZGF?Nwiq3V;BP|h}x=iau! z+8w3E;>`^YEi9|4?p09m{#@c6NcXN>-K>4v+z!VH-&!2YdI+jVvK>_qfiOlKDq?M= z^)r-I^0lq`*=IG!_PWQV8GJG&B#AYKG`;B~t2SksJkH+WL(7UM2U_{GyO;{so)m)# zE9YZZqp(jq+Js2E;p)qIb9wR|(WD)P<#_sLT*9)q*`jiLcoWlGJHooe*Ie-%bQBLL zr{zG56+wI8ym!ZDd|EWo^xAW_cW-tEsk@zvL=)J#6h;qT}op% zsMdLwVML(ORz71RLB{3g?>#M7%7J3B(|BXOV1$PZ+$f&ol)s zT>UsZDXnLYe9)q%9M!le+CTQ0tPu+wb>rO#%pZKotQB{djJHs6C*cHX@5TXaKo_XY zk7jce6}+3jtKa{W0MxArnaaO7@JO=#1kUzy2Zoa1YF*0waWVsPOXJbBS;w~VN%bL=i;i7S-#YdrLe z2yLHX+!5@}q`@P`jcd-yW!;TS!Ky32WFNJ?oIXXpig@Z-PjfuSagpc);FE=tv{&)= zMdKZM1kRj?F=*vESvn$Z&#y6i8D^wVK#3~NF(i15@#`CQO6ijCTlv3-$yZ7}1uWOr zvRkSM64UvHG87wLo;?)59ya(M-?7880nBBs!!pd+!pQBGE1mCsN!9ScmR+u|=B@S9 zB4T|0Xxac~vXH9qywtpW!zlOA>L?jg^vJ-XC+zsyS)y?i)|sK6osv`v6)q%EnM>6L zRJ;9DV`*fe>m93`6lP!g4j?_}*U+sN96TPve~ZmRmr7{Ey0A$3C|9$hjgkS$O|MTWY(2sx0!2WZ~-<4vase6C7pHGVe_ouJIB)Wn*vq{1*#W{qdHy1dVw?`}|KA z{(O>uSbrxW!opyc%x+=E(4XfH*e{wburyfRms^@2R4MH)8mtNoED=_#;+9Abt!(^_ z_=|GIZ!DP7<6Bl5>F+GqLS$GPY=z}54dL#gS2wM}qo1 SKefQ|?tO+%CpH>Czx^L&V{Z)r diff --git a/src/fr/devinsy/xidyn/presenters/PresenterFactory.java b/src/fr/devinsy/xidyn/presenters/PresenterFactory.java index d213120..eba4050 100644 --- a/src/fr/devinsy/xidyn/presenters/PresenterFactory.java +++ b/src/fr/devinsy/xidyn/presenters/PresenterFactory.java @@ -27,7 +27,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; -import fr.devinsy.util.FileTools; +import fr.devinsy.xidyn.utils.XidynUtils; import fr.devinsy.xidyn.utils.cache.Cache; /** @@ -35,8 +35,6 @@ import fr.devinsy.xidyn.utils.cache.Cache; */ public class PresenterFactory { - private static Logger logger = LoggerFactory.getLogger(PresenterFactory.class); - /** * http://thecodersbreakfast.net/index.php?post/2008/02/25/26-de-la-bonne- * implementation-du-singleton-en-java @@ -46,6 +44,8 @@ public class PresenterFactory private final static PresenterFactory INSTANCE = new PresenterFactory(); } + private static Logger logger = LoggerFactory.getLogger(PresenterFactory.class); + private Cache cache; /** @@ -110,7 +110,7 @@ public class PresenterFactory } else { - String localizedSource = FileTools.addBeforeExtension(source.toString(), "-" + locale.getLanguage()); + String localizedSource = XidynUtils.insertBeforeExtension(source.toString(), "-" + locale.getLanguage()); result = this.cache.get(localizedSource); @@ -200,7 +200,7 @@ public class PresenterFactory } else { - File localizedSource = new File(FileTools.addBeforeExtension(source.getAbsolutePath(), "-" + locale.getLanguage())); + File localizedSource = new File(XidynUtils.insertBeforeExtension(source.getAbsolutePath(), "-" + locale.getLanguage())); result = this.cache.get(localizedSource); @@ -271,7 +271,7 @@ public class PresenterFactory { URL localizedSource; - localizedSource = new URL(FileTools.addBeforeExtension(source.getPath(), "-" + locale.getLanguage())); + localizedSource = new URL(XidynUtils.insertBeforeExtension(source.getPath(), "-" + locale.getLanguage())); result = this.cache.get(localizedSource); @@ -383,7 +383,7 @@ public class PresenterFactory } else { - String localizedSource = FileTools.addBeforeExtension(source.toString(), "-" + locale.getLanguage()); + String localizedSource = XidynUtils.insertBeforeExtension(source.toString(), "-" + locale.getLanguage()); result = create(localizedSource); @@ -468,7 +468,7 @@ public class PresenterFactory } else { - File localizedSource = new File(FileTools.addBeforeExtension(source.getAbsolutePath(), "-" + locale.getLanguage())); + File localizedSource = new File(XidynUtils.insertBeforeExtension(source.getAbsolutePath(), "-" + locale.getLanguage())); result = create(localizedSource); @@ -531,7 +531,7 @@ public class PresenterFactory } else { - URL localizedSource = new URL(FileTools.addBeforeExtension(source.getPath(), "-" + locale.getLanguage())); + URL localizedSource = new URL(XidynUtils.insertBeforeExtension(source.getPath(), "-" + locale.getLanguage())); result = create(localizedSource); diff --git a/src/fr/devinsy/xidyn/presenters/TranslatorPresenter.java b/src/fr/devinsy/xidyn/presenters/TranslatorPresenter.java index e21ffe8..64dc8d4 100644 --- a/src/fr/devinsy/xidyn/presenters/TranslatorPresenter.java +++ b/src/fr/devinsy/xidyn/presenters/TranslatorPresenter.java @@ -22,9 +22,9 @@ import java.util.HashMap; import java.util.Locale; import java.util.Map; -import fr.devinsy.util.FileTools; import fr.devinsy.xidyn.XidynException; import fr.devinsy.xidyn.data.TagDataManager; +import fr.devinsy.xidyn.utils.XidynUtils; /** * The Class TranslatorPresenter. @@ -270,7 +270,7 @@ public class TranslatorPresenter implements Presenter } else { - String adaptedSource = FileTools.addBeforeExtension(this.defaultSource, "-" + language); + String adaptedSource = XidynUtils.insertBeforeExtension(this.defaultSource, "-" + language); result = PresenterFactory.create(adaptedSource); if (result.isAvailable()) @@ -279,7 +279,7 @@ public class TranslatorPresenter implements Presenter } else { - adaptedSource = FileTools.addBeforeExtension(this.defaultSource, "_" + language); + adaptedSource = XidynUtils.insertBeforeExtension(this.defaultSource, "_" + language); if (result.isAvailable()) { diff --git a/src/fr/devinsy/xidyn/utils/XidynUtils.java b/src/fr/devinsy/xidyn/utils/XidynUtils.java index 8afcb21..8281481 100644 --- a/src/fr/devinsy/xidyn/utils/XidynUtils.java +++ b/src/fr/devinsy/xidyn/utils/XidynUtils.java @@ -597,6 +597,45 @@ public class XidynUtils return result; } + /** + * Insert before extension. + * + * @param fileName + * the file name + * @param addition + * the addition + * @return the string + */ + public static String insertBeforeExtension(final String fileName, final String addition) + { + String result; + + if (fileName == null) + { + result = null; + } + else if (addition == null) + { + result = fileName; + } + else + { + int separatorIndex = fileName.lastIndexOf('.'); + + if (separatorIndex > 0) + { + result = fileName.substring(0, separatorIndex) + addition + fileName.substring(separatorIndex); + } + else + { + result = fileName + addition; + } + } + + // + return result; + } + /** * Load. * diff --git a/test/fr/devinsy/xidyn/utils/XidynUtilsTest.java b/test/fr/devinsy/xidyn/utils/XidynUtilsTest.java index a5e32e9..516bf98 100644 --- a/test/fr/devinsy/xidyn/utils/XidynUtilsTest.java +++ b/test/fr/devinsy/xidyn/utils/XidynUtilsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2017 Christian Pierre MOMON + * Copyright (C) 2006-2023 Christian Pierre MOMON * * This file is part of Xidyn. * @@ -21,7 +21,7 @@ package fr.devinsy.xidyn.utils; import org.apache.log4j.BasicConfigurator; import org.apache.log4j.Level; import org.apache.log4j.Logger; -import org.fest.assertions.Assertions; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -49,7 +49,7 @@ public class XidynUtilsTest String source = "aaaaahellozzzzz"; String target = XidynUtils.extractBodyContent(source); - Assertions.assertThat(target).isEqualTo("hello"); + Assert.assertEquals(target, "hello"); } /** @@ -61,7 +61,7 @@ public class XidynUtilsTest String source = "aaaaaaahellozzzzz"; String target = XidynUtils.extractBodyContent(source); - Assertions.assertThat(target).isEqualTo(""); + Assert.assertEquals(target, ""); } /** @@ -73,7 +73,7 @@ public class XidynUtilsTest String source = "aaaaazzzzz"; String target = XidynUtils.extractBodyContent(source); - Assertions.assertThat(target).isEqualTo(""); + Assert.assertEquals(target, ""); } /** @@ -85,7 +85,7 @@ public class XidynUtilsTest String source = "aaaaa hello zzzzz"; String target = XidynUtils.extractBodyContent(source); - Assertions.assertThat(target).isEqualTo("hello"); + Assert.assertEquals(target, "hello"); } /** @@ -114,7 +114,7 @@ public class XidynUtilsTest // System.out.println("[" + source + "]"); String target = XidynUtils.extractBodyContent(source); - Assertions.assertThat(target).isEqualTo("WELCOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOME"); + Assert.assertEquals(target, "WELCOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOME"); } /** @@ -126,7 +126,7 @@ public class XidynUtilsTest String source = "aaaaahellozzzzz"; String target = XidynUtils.extractDoctype(source); - Assertions.assertThat(target).isNull(); + Assert.assertNull(target); } /** @@ -138,7 +138,7 @@ public class XidynUtilsTest String source = "aaaaahellozzzzz"; String target = XidynUtils.extractDoctype(source); - Assertions.assertThat(target).isEqualTo(""); + Assert.assertEquals(target, ""); } /** @@ -150,7 +150,7 @@ public class XidynUtilsTest String source = "aaaaahellozzzzz"; String target = XidynUtils.extractDoctype(source); - Assertions.assertThat(target).isEqualTo(""); + Assert.assertEquals(target, ""); } /** @@ -162,7 +162,7 @@ public class XidynUtilsTest String source = "aaaaahellozzzzz"; String target = XidynUtils.extractDoctype(source); - Assertions.assertThat(target).isEqualTo(""); + Assert.assertEquals(target, ""); } /** @@ -174,6 +174,150 @@ public class XidynUtilsTest String source = "aaaaahellozzzzz"; String target = XidynUtils.extractDoctype(source); - Assertions.assertThat(target).isEqualTo(""); + Assert.assertEquals(target, ""); + } + + /** + * Test insert before extension 01. + */ + @Test + public void testInsertBeforeExtension01() + { + String source = null; + + String target = XidynUtils.insertBeforeExtension(source, null); + Assert.assertNull(target); + } + + /** + * Test insert before extension 02. + */ + @Test + public void testInsertBeforeExtension02() + { + String source = null; + + String target = XidynUtils.insertBeforeExtension(source, ""); + Assert.assertNull(target); + } + + /** + * Test insert before extension 03. + */ + @Test + public void testInsertBeforeExtension03() + { + String source = null; + + String target = XidynUtils.insertBeforeExtension(source, "-fr"); + Assert.assertNull(target); + } + + /** + * Test insert before extension 05. + */ + @Test + public void testInsertBeforeExtension05() + { + String source = ""; + + String target = XidynUtils.insertBeforeExtension(source, null); + Assert.assertEquals(target, ""); + } + + /** + * Test insert before extension 06. + */ + @Test + public void testInsertBeforeExtension06() + { + String source = ""; + + String target = XidynUtils.insertBeforeExtension(source, ""); + Assert.assertEquals(target, ""); + } + + /** + * Test insert before extension 07. + */ + @Test + public void testInsertBeforeExtension07() + { + String source = ""; + + String target = XidynUtils.insertBeforeExtension(source, "-fr"); + Assert.assertEquals(target, "-fr"); + } + + /** + * Test insert before extension 08. + */ + @Test + public void testInsertBeforeExtension08() + { + String source = "foo"; + + String target = XidynUtils.insertBeforeExtension(source, null); + Assert.assertEquals(target, "foo"); + } + + /** + * Test insert before extension 09. + */ + @Test + public void testInsertBeforeExtension09() + { + String source = "foo"; + + String target = XidynUtils.insertBeforeExtension(source, ""); + Assert.assertEquals(target, "foo"); + } + + /** + * Test insert before extension 10. + */ + @Test + public void testInsertBeforeExtension10() + { + String source = "foo"; + + String target = XidynUtils.insertBeforeExtension(source, "-fr"); + Assert.assertEquals(target, "foo-fr"); + } + + /** + * Test insert before extension 11. + */ + @Test + public void testInsertBeforeExtension11() + { + String source = "foo.txt"; + + String target = XidynUtils.insertBeforeExtension(source, null); + Assert.assertEquals(target, "foo.txt"); + } + + /** + * Test insert before extension 12. + */ + @Test + public void testInsertBeforeExtension12() + { + String source = "foo.txt"; + + String target = XidynUtils.insertBeforeExtension(source, ""); + Assert.assertEquals(target, "foo.txt"); + } + + /** + * Test insert before extension 13. + */ + @Test + public void testInsertBeforeExtension13() + { + String source = "foo.txt"; + + String target = XidynUtils.insertBeforeExtension(source, "-fr"); + Assert.assertEquals(target, "foo-fr.txt"); } }