From 1ee3db59a217d1120dc22d99d936a7c0d6cd101a Mon Sep 17 00:00:00 2001 From: Joshua Black Date: Tue, 4 Feb 2025 12:30:23 +0100 Subject: [PATCH] epam#2748 add regression test with incorrect reference png --- .../integration/ref/rendering/basic.py.out | 2 + .../integration/tests/rendering/basic.py | 11 + .../backwards_substituents_2748.cdxml | 329 ++++++++++++++++++ .../ref/linux/backwards_substituents_2748.png | Bin 0 -> 7430 bytes .../ref/mac/backwards_substituents_2748.png | Bin 0 -> 7430 bytes .../ref/win/backwards_substituents_2748.png | Bin 0 -> 7430 bytes 6 files changed, 342 insertions(+) create mode 100644 api/tests/integration/tests/rendering/molecules/backwards_substituents_2748.cdxml create mode 100644 api/tests/integration/tests/rendering/ref/linux/backwards_substituents_2748.png create mode 100644 api/tests/integration/tests/rendering/ref/mac/backwards_substituents_2748.png create mode 100644 api/tests/integration/tests/rendering/ref/win/backwards_substituents_2748.png diff --git a/api/tests/integration/ref/rendering/basic.py.out b/api/tests/integration/ref/rendering/basic.py.out index dddc112d3f..1d2cfe2ef9 100644 --- a/api/tests/integration/ref/rendering/basic.py.out +++ b/api/tests/integration/ref/rendering/basic.py.out @@ -22,3 +22,5 @@ bond-length-options-3.png rendering status: OK smart-layout-crown.png rendering status: OK ****** Nameless S-Group ***** sa-mono.png rendering status: OK +issue 2748 backwards substituents +backwards_substituents_2748.png rendering status: OK diff --git a/api/tests/integration/tests/rendering/basic.py b/api/tests/integration/tests/rendering/basic.py index 7cc904239e..d391db1187 100644 --- a/api/tests/integration/tests/rendering/basic.py +++ b/api/tests/integration/tests/rendering/basic.py @@ -162,6 +162,17 @@ renderer.renderToFile(mol, joinPathPy("out/sa-mono.png", __file__)) print(checkImageSimilarity("sa-mono.png")) +print("issue 2748 backwards substituents") +indigo.resetOptions() +indigo.setOption("render-background-color", "255, 255, 255") +indigo.setOption("render-output-format", "png") +fname = "backwards_substituents_2748" +png_fname = fname + ".png" +cdxml_fname = joinPathPy("molecules/%s.cdxml" % fname, __file__) +mol = indigo.loadMoleculeFromFile(cdxml_fname) +renderer.renderToFile(mol, joinPathPy("out/" + png_fname, __file__)) +print(checkImageSimilarity(png_fname)) + if isIronPython(): renderer.Dispose() indigo.Dispose() diff --git a/api/tests/integration/tests/rendering/molecules/backwards_substituents_2748.cdxml b/api/tests/integration/tests/rendering/molecules/backwards_substituents_2748.cdxml new file mode 100644 index 0000000000..00fbac226f --- /dev/null +++ b/api/tests/integration/tests/rendering/molecules/backwards_substituents_2748.cdxml @@ -0,0 +1,329 @@ + + + + + + + + + + + + + +SiEt3SiEt3 \ No newline at end of file diff --git a/api/tests/integration/tests/rendering/ref/linux/backwards_substituents_2748.png b/api/tests/integration/tests/rendering/ref/linux/backwards_substituents_2748.png new file mode 100644 index 0000000000000000000000000000000000000000..c7230b106e21340943cd6f4fbd977bcc2fd70dd8 GIT binary patch literal 7430 zcmeHMX*iVa-yVr6LdcTIP(6{oB4i&WAyl$&A^X10*kuxt6h#<&mh6me?6Q>-CPwys zUk76!-pkYf_!N+Bra$jTg) z+S8|E9Ff$#Y)uOhpS%*xr5r=k9I3-vn(nQb_tC%Qh?{F+tcwMf z(?TFNj6?|JJU1MyxrGv<5QKt2&YWj}Kwd!l8_G*dOViWSOG`Jp)9&u=?GYmLbc+I3 zadTF`Fnf~`B2ve$^78US{a%{CRgZNg)*Xa{oHDH4br9M7{QS|;(NZIQg~m0QXtQ za6h`ZvAG#1sE^N#y1>Pil9)J@t;tohl4}%v$M!-{SGu)(2sUj2ENYOm$+*T#`{~mM zQ<+&=Svffmd|t$+q#O@er`%ap-`CRMSh?TgNxVwAZoB1B==KD&H7Ot`SD#@o(C#eG zey*>tZ$z4=@c2WuFLkQcmV>aH7s+M5`|?o#5}^Qg<5^IQ^HHaB0M>_OHxvk$4;cO~ zK^bH)KVUR12tOhf1rF4&ZY>C-o7M@2&I9%JE)&7hmJ~su-B{eWfo>0p`|?JYGF{1m zo|@TL6-&!bDMX#zy1Zz%IonxL6cG_&JYcMhY=rdS2zr8G(ou} zoitTd6XXMr!WggKkK~x~n?Ih5l@axB@g_fvKt~9&{)iPaJV$-kz#ySPUQOFa-bXwx zeE#X<$B+H|YGacAxpr-3u>8j!bCU)K$%t%B{=BZvtC@_E^{pVS{Uar{|Ly%%JKfXQ zy0M=4@TD;W1A}UdcKSIkK9J6gy9=#Q#(hunKI!Gl(=}KbdHIG+wYa0*sVF;L=*caA zR3!qks;jGui(NnrIH`&T99YXf@1gbd^lTE3&1LO#ii(irVg=KLgaksNF^q``-;<(a zV>4gvxdeXITX=yc%^K_6`q9}f9Td-CMaYROl zRarH#CoL__o{&FKW~;R}T9-K#O3#@P6Jt@L*DHK6Jl)zJDGztZ&C6S%&m1ZL6w8oK zIav%vL=q!YbTX=G@ah`}8G6zzJ@z{|svRaK=o z(ve1Ex;pS&*kHfv(}=W~nD6;cD=g`Z)KO7-`W19jvG=BxcU~}m!2SYndq7~@n~Uvl zIo%IuwX!ujlcaU`la7v#&YnG6={%-W@0RmR!ncARIa0@In}8XeouFs+gbb369l5E)NC}R57UcXwLa2(}MwG)M-b3ovWZw@U0q#RGAkFCvv}ePJT$kku)>!wuj$zXRaH0grp+9;0hjqutvA+# z_4Ou_PEop^ylq%hS#z42nunLSzpwB6(4)I|(LFZHJsF{8LOVqospove*?cQByd2pQ zg_-K>`&!X|WI6jp$bExwW%rVrqN1X?qi7SOI-lE@FE_0gT@e@GKHS?(wl6C!bz8t^ zdPTOiwrXo@dlx?b7M$EUuGmHJ-q1^V=ec>NBG2Qzw1H~oZ%xNaXbo>t8fRo=#k({*xH{Gi_Oi=k9^OLkH|4R>d_TW{NFgHO*SogMh`A)g&ZvEaac(#fW8f zAeL=3Z~`fV6;SkiI8!cGPte=jyGwQlvn2t8!;|CVzpU53BoGM8%gX`eeH8&$OB1SI zrLNgp>!q)&i%Uxp;o)A(f6R~yx+Ji57s~Z?tr194)m@5f z*RF}wZAEW6E0FX%k!z!#n2)ml`yLbd4&NqwGL#Dn3Y=D7CKoh2&*NA9Vx)=VJ-%c0 z3vH1wkZmvL<#_qP`unV!f&v1*WKw@-`9Q(KX&iuo#~Jr6EiJzohnX-kBw)%ZClZa z*32}8(!pY5Vy@~k%jHy5i1YD%U!^y(vdS9tw0(ad3nO-$n3_5pZtLtnS5#68A)WE^ z@Jq@oD2ROX=ED(VXlSVONOgH;rc(W&zoNeWfPGQjEUM=Ib|o$|I~z((-62hDfD%~# zsB1D2T$;yzyvD!dD?XW4H?p86I_&*fn`A9a(vbWEY<|Y z9dpP1bIMmA#P>I9Y{V^>ovHyWBSXWx`b+$BawhxqbjX}r7HVq%ZZ2uEKpEi6IIY&e z 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 literal 0 HcmV?d00001 diff --git a/api/tests/integration/tests/rendering/ref/mac/backwards_substituents_2748.png b/api/tests/integration/tests/rendering/ref/mac/backwards_substituents_2748.png new file mode 100644 index 0000000000000000000000000000000000000000..c7230b106e21340943cd6f4fbd977bcc2fd70dd8 GIT binary patch literal 7430 zcmeHMX*iVa-yVr6LdcTIP(6{oB4i&WAyl$&A^X10*kuxt6h#<&mh6me?6Q>-CPwys zUk76!-pkYf_!N+Bra$jTg) z+S8|E9Ff$#Y)uOhpS%*xr5r=k9I3-vn(nQb_tC%Qh?{F+tcwMf z(?TFNj6?|JJU1MyxrGv<5QKt2&YWj}Kwd!l8_G*dOViWSOG`Jp)9&u=?GYmLbc+I3 zadTF`Fnf~`B2ve$^78US{a%{CRgZNg)*Xa{oHDH4br9M7{QS|;(NZIQg~m0QXtQ za6h`ZvAG#1sE^N#y1>Pil9)J@t;tohl4}%v$M!-{SGu)(2sUj2ENYOm$+*T#`{~mM zQ<+&=Svffmd|t$+q#O@er`%ap-`CRMSh?TgNxVwAZoB1B==KD&H7Ot`SD#@o(C#eG zey*>tZ$z4=@c2WuFLkQcmV>aH7s+M5`|?o#5}^Qg<5^IQ^HHaB0M>_OHxvk$4;cO~ zK^bH)KVUR12tOhf1rF4&ZY>C-o7M@2&I9%JE)&7hmJ~su-B{eWfo>0p`|?JYGF{1m zo|@TL6-&!bDMX#zy1Zz%IonxL6cG_&JYcMhY=rdS2zr8G(ou} zoitTd6XXMr!WggKkK~x~n?Ih5l@axB@g_fvKt~9&{)iPaJV$-kz#ySPUQOFa-bXwx zeE#X<$B+H|YGacAxpr-3u>8j!bCU)K$%t%B{=BZvtC@_E^{pVS{Uar{|Ly%%JKfXQ zy0M=4@TD;W1A}UdcKSIkK9J6gy9=#Q#(hunKI!Gl(=}KbdHIG+wYa0*sVF;L=*caA zR3!qks;jGui(NnrIH`&T99YXf@1gbd^lTE3&1LO#ii(irVg=KLgaksNF^q``-;<(a zV>4gvxdeXITX=yc%^K_6`q9}f9Td-CMaYROl zRarH#CoL__o{&FKW~;R}T9-K#O3#@P6Jt@L*DHK6Jl)zJDGztZ&C6S%&m1ZL6w8oK zIav%vL=q!YbTX=G@ah`}8G6zzJ@z{|svRaK=o z(ve1Ex;pS&*kHfv(}=W~nD6;cD=g`Z)KO7-`W19jvG=BxcU~}m!2SYndq7~@n~Uvl zIo%IuwX!ujlcaU`la7v#&YnG6={%-W@0RmR!ncARIa0@In}8XeouFs+gbb369l5E)NC}R57UcXwLa2(}MwG)M-b3ovWZw@U0q#RGAkFCvv}ePJT$kku)>!wuj$zXRaH0grp+9;0hjqutvA+# z_4Ou_PEop^ylq%hS#z42nunLSzpwB6(4)I|(LFZHJsF{8LOVqospove*?cQByd2pQ zg_-K>`&!X|WI6jp$bExwW%rVrqN1X?qi7SOI-lE@FE_0gT@e@GKHS?(wl6C!bz8t^ zdPTOiwrXo@dlx?b7M$EUuGmHJ-q1^V=ec>NBG2Qzw1H~oZ%xNaXbo>t8fRo=#k({*xH{Gi_Oi=k9^OLkH|4R>d_TW{NFgHO*SogMh`A)g&ZvEaac(#fW8f zAeL=3Z~`fV6;SkiI8!cGPte=jyGwQlvn2t8!;|CVzpU53BoGM8%gX`eeH8&$OB1SI zrLNgp>!q)&i%Uxp;o)A(f6R~yx+Ji57s~Z?tr194)m@5f z*RF}wZAEW6E0FX%k!z!#n2)ml`yLbd4&NqwGL#Dn3Y=D7CKoh2&*NA9Vx)=VJ-%c0 z3vH1wkZmvL<#_qP`unV!f&v1*WKw@-`9Q(KX&iuo#~Jr6EiJzohnX-kBw)%ZClZa z*32}8(!pY5Vy@~k%jHy5i1YD%U!^y(vdS9tw0(ad3nO-$n3_5pZtLtnS5#68A)WE^ z@Jq@oD2ROX=ED(VXlSVONOgH;rc(W&zoNeWfPGQjEUM=Ib|o$|I~z((-62hDfD%~# zsB1D2T$;yzyvD!dD?XW4H?p86I_&*fn`A9a(vbWEY<|Y z9dpP1bIMmA#P>I9Y{V^>ovHyWBSXWx`b+$BawhxqbjX}r7HVq%ZZ2uEKpEi6IIY&e z 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 literal 0 HcmV?d00001 diff --git a/api/tests/integration/tests/rendering/ref/win/backwards_substituents_2748.png b/api/tests/integration/tests/rendering/ref/win/backwards_substituents_2748.png new file mode 100644 index 0000000000000000000000000000000000000000..c7230b106e21340943cd6f4fbd977bcc2fd70dd8 GIT binary patch literal 7430 zcmeHMX*iVa-yVr6LdcTIP(6{oB4i&WAyl$&A^X10*kuxt6h#<&mh6me?6Q>-CPwys zUk76!-pkYf_!N+Bra$jTg) z+S8|E9Ff$#Y)uOhpS%*xr5r=k9I3-vn(nQb_tC%Qh?{F+tcwMf z(?TFNj6?|JJU1MyxrGv<5QKt2&YWj}Kwd!l8_G*dOViWSOG`Jp)9&u=?GYmLbc+I3 zadTF`Fnf~`B2ve$^78US{a%{CRgZNg)*Xa{oHDH4br9M7{QS|;(NZIQg~m0QXtQ za6h`ZvAG#1sE^N#y1>Pil9)J@t;tohl4}%v$M!-{SGu)(2sUj2ENYOm$+*T#`{~mM zQ<+&=Svffmd|t$+q#O@er`%ap-`CRMSh?TgNxVwAZoB1B==KD&H7Ot`SD#@o(C#eG zey*>tZ$z4=@c2WuFLkQcmV>aH7s+M5`|?o#5}^Qg<5^IQ^HHaB0M>_OHxvk$4;cO~ zK^bH)KVUR12tOhf1rF4&ZY>C-o7M@2&I9%JE)&7hmJ~su-B{eWfo>0p`|?JYGF{1m zo|@TL6-&!bDMX#zy1Zz%IonxL6cG_&JYcMhY=rdS2zr8G(ou} zoitTd6XXMr!WggKkK~x~n?Ih5l@axB@g_fvKt~9&{)iPaJV$-kz#ySPUQOFa-bXwx zeE#X<$B+H|YGacAxpr-3u>8j!bCU)K$%t%B{=BZvtC@_E^{pVS{Uar{|Ly%%JKfXQ zy0M=4@TD;W1A}UdcKSIkK9J6gy9=#Q#(hunKI!Gl(=}KbdHIG+wYa0*sVF;L=*caA zR3!qks;jGui(NnrIH`&T99YXf@1gbd^lTE3&1LO#ii(irVg=KLgaksNF^q``-;<(a zV>4gvxdeXITX=yc%^K_6`q9}f9Td-CMaYROl zRarH#CoL__o{&FKW~;R}T9-K#O3#@P6Jt@L*DHK6Jl)zJDGztZ&C6S%&m1ZL6w8oK zIav%vL=q!YbTX=G@ah`}8G6zzJ@z{|svRaK=o z(ve1Ex;pS&*kHfv(}=W~nD6;cD=g`Z)KO7-`W19jvG=BxcU~}m!2SYndq7~@n~Uvl zIo%IuwX!ujlcaU`la7v#&YnG6={%-W@0RmR!ncARIa0@In}8XeouFs+gbb369l5E)NC}R57UcXwLa2(}MwG)M-b3ovWZw@U0q#RGAkFCvv}ePJT$kku)>!wuj$zXRaH0grp+9;0hjqutvA+# z_4Ou_PEop^ylq%hS#z42nunLSzpwB6(4)I|(LFZHJsF{8LOVqospove*?cQByd2pQ zg_-K>`&!X|WI6jp$bExwW%rVrqN1X?qi7SOI-lE@FE_0gT@e@GKHS?(wl6C!bz8t^ zdPTOiwrXo@dlx?b7M$EUuGmHJ-q1^V=ec>NBG2Qzw1H~oZ%xNaXbo>t8fRo=#k({*xH{Gi_Oi=k9^OLkH|4R>d_TW{NFgHO*SogMh`A)g&ZvEaac(#fW8f zAeL=3Z~`fV6;SkiI8!cGPte=jyGwQlvn2t8!;|CVzpU53BoGM8%gX`eeH8&$OB1SI zrLNgp>!q)&i%Uxp;o)A(f6R~yx+Ji57s~Z?tr194)m@5f z*RF}wZAEW6E0FX%k!z!#n2)ml`yLbd4&NqwGL#Dn3Y=D7CKoh2&*NA9Vx)=VJ-%c0 z3vH1wkZmvL<#_qP`unV!f&v1*WKw@-`9Q(KX&iuo#~Jr6EiJzohnX-kBw)%ZClZa z*32}8(!pY5Vy@~k%jHy5i1YD%U!^y(vdS9tw0(ad3nO-$n3_5pZtLtnS5#68A)WE^ z@Jq@oD2ROX=ED(VXlSVONOgH;rc(W&zoNeWfPGQjEUM=Ib|o$|I~z((-62hDfD%~# zsB1D2T$;yzyvD!dD?XW4H?p86I_&*fn`A9a(vbWEY<|Y z9dpP1bIMmA#P>I9Y{V^>ovHyWBSXWx`b+$BawhxqbjX}r7HVq%ZZ2uEKpEi6IIY&e z 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 literal 0 HcmV?d00001