From f437c3b654baffe3f6e025e8241a7a5cd4f50cb2 Mon Sep 17 00:00:00 2001 From: Alexander Wunschik Date: Mon, 26 Jun 2017 11:14:16 +0200 Subject: [PATCH] started work towards automatic regression testing --- .gemini.js | 20 ++ .../yandex-icons/plain/PhantomJS~current.png | Bin 0 -> 19268 bytes .../yandex-icons/plain/PhantomJS~ref.png | Bin 0 -> 11318 bytes .../yandex-search/plain/PhantomJS~ref.png | Bin 0 -> 5969 bytes .../yandex-search/with text/PhantomJS~ref.png | Bin 0 -> 7475 bytes gemini/reports/index.html | 221 ++++++++++++++ gemini/reports/report.css | 286 ++++++++++++++++++ gemini/reports/report.min.js | 2 + .../screens/yandex-icons/plain/PhantomJS.png | Bin 0 -> 11318 bytes .../screens/yandex-search/plain/PhantomJS.png | Bin 0 -> 5969 bytes .../yandex-search/with text/PhantomJS.png | Bin 0 -> 7475 bytes gulpfile.js | 195 ++++++++---- package.json | 5 +- test/gemini/demo1.js | 8 + test/gemini/demo2.js | 5 + 15 files changed, 677 insertions(+), 65 deletions(-) create mode 100644 .gemini.js create mode 100644 gemini/reports/images/yandex-icons/plain/PhantomJS~current.png create mode 100644 gemini/reports/images/yandex-icons/plain/PhantomJS~ref.png create mode 100644 gemini/reports/images/yandex-search/plain/PhantomJS~ref.png create mode 100644 gemini/reports/images/yandex-search/with text/PhantomJS~ref.png create mode 100644 gemini/reports/index.html create mode 100644 gemini/reports/report.css create mode 100644 gemini/reports/report.min.js create mode 100644 gemini/screens/yandex-icons/plain/PhantomJS.png create mode 100644 gemini/screens/yandex-search/plain/PhantomJS.png create mode 100644 gemini/screens/yandex-search/with text/PhantomJS.png create mode 100644 test/gemini/demo1.js create mode 100644 test/gemini/demo2.js diff --git a/.gemini.js b/.gemini.js new file mode 100644 index 00000000..94b7d27c --- /dev/null +++ b/.gemini.js @@ -0,0 +1,20 @@ +module.exports = { + rootUrl: "http://yandex.com", + + browsers: { + PhantomJS: { + desiredCapabilities: { + browserName: "phantomjs" + } + } + }, + + system: { + plugins: { + 'html-reporter': { + enabled: true, + path: 'gemini/reports' + } + } + } +}; diff --git a/gemini/reports/images/yandex-icons/plain/PhantomJS~current.png b/gemini/reports/images/yandex-icons/plain/PhantomJS~current.png new file mode 100644 index 0000000000000000000000000000000000000000..ca695d8e08eae06a8e0f0ca5d0c3fdd2ca3b9ac6 GIT binary patch literal 19268 zcmeIa`Cn3b|2IynIi)srwOU%2s6(cfrsiJRSh$wtzE&=YqUD+*qAlahl$wB=D>d$- zqA0jayWvJ@Xs%Q)h$tke2ngKA>wDk-!RLqX_x@hz@$d)E!T0ifJzx9#@Ygk`D@wl{ z{RIR9DM7DZb^(EQxPd_1K)ZGVcj#6YZ$O|EAn4_bH|`fMPR6(RxVBpV!`ctNi&|2;{5#S5z`Lj&S-b!3vVF^r()jIV*k_kc z2qd?cZm#9^<-wvbSiZ=DZV{489`S2e`d$=I%mya>|Iu~kj-|$A%40{3Be}x~d6QTR zbIj6~&HZ~+8evwCLQB?0LrTZDZ{DfD76#THeo!rs0N=K4bKJZI+D*2Niq)+bXJvh`DK$UhDYIV(fWubWH?_|p8d0HI#ck6t0gsPUlLsT3hxi$;_abvJ0mipmp z^A=Fb_rd$2^bgdoJEh)RKxYbV(_^;HVWTlM#ewMyg7Pil(RUHzjN%!R=yUx|13g;l zm;wlN@RlXawrvLp^cK<3=dlFkMu5>*Ng?FODeHrbo z&yk-8HWY`-?Xex2w1ZGvZ4nZ~5s#LK`e5E-I?QNeP&H@11nlp?zwA9~gI)A-WMYO* z36hu|)2kS|c58IX5(t!1KB?NwHE#`>_V+(GsI&$2{Lm(uM77tq7RntI4YX(yBu4)R z$FFdP4;MWJhpm8N1W}R8gMY?js$|npCwBct7Z_X3ZU&1o!I9i+TppC-Y|#F;tqhYy z80)ews+;bC4%m}y(qe_+QA?UHIYg2@(@^?R9AqM z0Shqt%(e=dhAJ=N<_E-bK@I6GkKdzF_wl{EmBFARav+u0dJ5S!OA>V)LIG5LLeYGg z$pDLN?9N0_!e!|YB8}+UZ;in;c*Z+oI$>gPZMzk%3L>r4s!fJUqI~V#LH%e5vv4L2 zYIUPO^3%*8l6arV>c zY<$8+r}MYoCM|w-6pZ+Db97Do^wec<90i?9yAOF1K(GD@`)gN?o0BsE{bdz<%+Gsd zO6dYxExf?L?snD7(Pm>y?dXufwGbA#guq4)EtrtmZDT9%z&ey#c^pEV4w+P6bn9nk zyL~$Vz%>@|P>CcHbLh=%+mfkl*~aqM{j<#*N+Wrn!bB})wzJdS5&5}GW9Htg9rkKH zPyCS3oGHGEXIL(ih0~uZ48bGF0$M12=6R++J~poXggru5P$T;xh+0>u>-|zuoKV;I z_qbFKFBw=G*t5m?n1S~rQwZ~T~1oD zHwpOxpXSqq%`(sPv%My)=gr~IT;07+nMYDxk`rD(9F6J}$%=ZfItZD*FDc0`tTMgKsWb2}u`a(T=rY1rv)l3QXqIM1Rldn>3f z-rgaA%;HEQAJ;;z)6J_%eNa{zjiXn({kBOgR}&^+F`V?LLG~8XyEqzQ0;v zF_V&1crtZ?x45D<@e9C>w$)*87H8$bnVTE)K6mFb5+rGLy*IUe3&5j+(jXGci7@-~ z;V>=EyY8pYs7g^Bj4~P{DwL9s8^CWkV*+One3(P1x9Dkipx)MW@mnm;#>RCe^|+Y^ z@QkovB)7?HQzKh|nBD_BgqB1_)Bk#%fsj4bF@&%JkphYGNb zXcbiXpgGu9c1Eb@&DMs_wbohN+G0X+v8A@Vzx=)x^2fo>o-f;oP*Q(+ul1oDj+pde zU#;l5bNrd65EB2FP7XeP)A9dK-*;d$fH21RmolgeOe6-qa(!bJ+T~Ut55eF|R}9T` z1^URw;)`a)R7UE2jLJmTj0_yc$g#9~L;->J6ab1qH?r3E1wF;(HO>XH@0F0IN)=7{ z&tjuzPI7|9PeTM;2%4Ve)DBVTO6q@l-0)PoZB);p$N`9dM?#&M+Pbh0Ow-rDe}*Uj zqSQJ)#rBNIJ3E?8I6(UH^?LN`A@h4=x8hf~o%@_hvTC~QgcGSjxolKMzGvf-w0Y_~luI+k_FNI`sSj!(qBF<&u(g>sHM*p5`3X|cT!8OW z(}z&A(est*f_zJstb!#N_AryTpuCjL#0$qd=mI{KiGmvYMdq!nfECoEVjj2fBufCL@ZU!iIM}Xh} zpRik=J*^yBlt$e6Hc%)NAO&=L;n4vbwLhP%5`O`m{(HNdIr1JtJa+nP*Y6eO+YPXR zqLbnB%ZSAK$*tg^pM(*&q2|(3TN3SE<>l|Bw?^Lms;^NAKiQzkPHAoV?>!LJ>pZnV7Y8N;nA}CX|nG z+CA_K8u}KIyT+-y&}iHPL)cEC*ay=9jk^j&+hKoP(+9n>V6TW}*ZkSMrpW*U|1|i< zU`h06mG~Z3S2Qv?d1{+z#U!G?(3Zp&_s;aHkDlTsN)zeXlW5*wqWA9p&z+N&a*qAv zQUf2)ehB9Iy7g8#f3>jBRL!n6@wH+~i7Xb@zul;vDjRh0iDfSe1{s1jcPstwdH$09xV z7l1NPP8}f>O?nng1%hVNqCG};5B*Z3R}jboqmR8?qdN0rygVz?v_$KmW|XHL5Nzw& zDFT5tJ9LK|^V!Tgcu3*17AWPUcXYpzME~7CS1Fs$K((h*VE@1yKBQU}@5ZU@J6?Hg z;3Z6MLc@|p`V}32Fwbex&iYc&7Bo|`NJVqB)24M2du)nQV|9m-hd{uC=k@S2-}EF3 zpp-42nt>7T?Dtq&oB#_)=FmC&9He(K1kAC|Zpq}E6T&Y|JD=ELSlS|AyS*#x;9O19 zdc2v{^FTKvOFdd7CP|Zq#3Y@jl|hbFX@8-3>d?9vD=p*4&dHXI~cINxP%#Td`jmE?-UhgNG^-1J`m|U$3g4tqn&z{zVnga;BMn>y#%S8f;USp9<=7nqQ1zBaH+Lw zPKxy-jd!Wcn*{}93yDbUO>mt4Gvec7*^|?LM`?o)JUDL>=7;13$6)$lJ7e3lX=Dcf zEaaiRChh5pa*7__?UT3)+&I2)EH^O8NE+V5k)u4%mYJshhxy%ty-N5_@l1mR`y@ubmi5j#Ia&9J&;>7d~*m$*hup9fg=BQ5a@8>xS!FW zu7|@pzf<*q;Zn|Nd3EZ^P9Tv9c&Sluc1({uy6%p>()KHm@n3WYDh;o;{u8;GSDysF z4LZF`ylE74wh}fUoY+*Kj;BZ1J1@A44Yq+ij{V1Em>U3Tbc)CUAlUzRuljfE_c68@ ze<6&k2_10aU&DApxpw?jFlSE`x&-5MV@a@nF`@v>tD+oV3}K&K47(nEQEVj(!8$lc zIb)bw30E*>w&i)d)A4161(8o+xZfmTkFDIbJ%cWLwcXw8 zfyjF{tfJ{YTq1!q2VvAp1M`#h zX;4V&pZ(Y*6Iuo|IV%tgc3y*xtU;}eSG4G}))))RSER;2?ooHQ6EGdbxBLd^utQWJ zW)d5oJ41jfd){@teUhBiW7$yOewIeZP8jToMHB@}!I^t(d^ZWRZ$<%<=kHvG{IHNo zSUsf84)t#K!L$=rD^?n*ilIS0j`W{_HF}Dkl@CAnd33(ON0neVBE61$Qgp#4LMbqD93GQP)L?OE;t%0-~VH%n~Www&3O22Qw*33DO2Nl12fCLm}O z+-~nb5payY`%vUU2);sd^qi&*KjZbeoST53b9NiDg!-91K-_%Y-XKQ4{gbj4Sm>#( zgwv;nosPu7gYE9d#^sXQ%L7fU3TEWu--h}!CMv}-B>$cOs7cWG!@rdu0n0AiND)2T@Qr?Sh4t5MQW8{-6qbe5g~Bd)77Y2>}sY78r-m zni2U@#vwFk%tS8V$0}#02doYy-Ad!5?M(6d&ZYyz@;#?abZFZkBk*43aieY3BkpK@ zVvmWmvsyT#hgb?E;vz1pIk5kkWXDAa@qr9@A z>&sZ4h9_rxdHW60&u$`WUwIvf=%O9Si#qIfofH)}4tK$Ywchk#ACX(1e9JB+D9&q3 zYw)YU(zdO4cDhk<`_2(m=D&o)4A&D}7;A}nbN7I<+1wa^lxuV~e+1l+D zkAc%-?}TWVV3KMP)Xa+5I#uXE&&2C_{0&ZUFjxJgm3wVL_SEZn2>Y1F@jj7vwOLpD zV4K#68@^WIe&2soW^M*|;SFzSL7(g$KyKw?k{3`lr-TE_oP1P5atkH=reckgy<&Be zhUWRzMli=UsIEFY0UY$Hc0Xo=3YR_tH@gPOvN7LVZ;&H;!K|_a9>|1onS_9>+_~RF zdfkh44?D&Wz7Q5{7l61#PD;Xzlm;dl8wkH$oOU4vs6rzg!%mdmgS?&%_U|eh6Am^# zxaIH6Ir`M;$csgFMw^b|&*p6(Dh`})Kdbqy5Qm(r#HIK)S}vtB;=c?_D~F2}A$gVk z-$a^h%k}Zfrn=WlkkOC*$e2|y9;)-oOT|Gy*WjnO2JO&LPx$6uURFob_veK(v{GnYC(DM&uFI}o$pId4mzM#$F$Ykn2m;0g3J}=U2E>bYq7g))=Ia( z@Wad?Lyx0Tppu5r9WR|0ZmUODBHHZ`q6P*@8(TAUv)!FR35#R`-dlgAfesDb!BXay zIJ5^N)tp%lBX8kLRSIsoQ2sS9&zz!;8p_g3@~p(YSItr9@HkfxI=SCb-%+Q80{gZ; zkCOo0n(cqJ(8!*6e?jWWCUPFW-07z6h6pQ-{*dU>wl%ag2`I5m4)dP8bs0bl6rSuh z5T+!+4B`V~D_PC~2LK@EM;_rukgAZp>{!54gt&4BmMUcC)lup-y5k13Ml)3qV&91F z=~PCD%Y*cya}V*TAc@fk{&QJvJ7eq``aPA}mR2o2Ad^`&YkM|Qq+fC2uba!`KQ%=Z zjID7PIVKO2{1*nhbbvX@e*VZ$wRNJgb>}u*ReR+rIoWDhSepIWOQnYE9Yz=XE>O=z zTbocTb5PB_aRrP8W{nrc1~K~bIOPa-V9VP%Q)*=<3cbQ)kKyC{)<|bxx}rpLbaaIgpt(FM5^_2T>LKb=yMS3`#wed+i%?<^nM7$ z^9QS9yJN^o18RsV@sN2S+NdG-EAzWM-0Xff>GwY!bsFJyLf0x6?njdsj|0|s+gTzD zX!oT2s#V|f22RDDcy9?AEq?fUk68w1hs|m`UyHPzvbiAX@7VG zXEzyqYukY?c4VVtJHZ5{dvcq5t{5R%w*Wh6GXD^=?Racsat~nzS-R)$xw_1#{*fkk zdye_fRI47XB0A&U*ve69lMdAF=!Lx5!L|@Nqih0oJjaL#LtpHi6T1?qmZ3_);>HvunPGj&bst6fH=buD7|y|{`w4)Y^-Hs|wJ>>`F9HSHvbLdLE9 zeF=?Nx+~uEi1@+{!L7A3+3fNopB7@&=E&SGi>xWniih_u_Yju*!@s1#xQ|s~ezR1d z#>>vAb&TKrjV#Q~8%yRwN!$R{@w5n`&tylTe2p^(^IoHXD^y5b=CI=SA{Q|n^}AjC z(P>z5iF?IL!bXnrxbn(Np58zVT$=veMB386qo}(y`~7(;36?fw3qfHroY?O1L%2NyG-!q$TOQ?= zwxs67Npe`M?+Wc#?#-8aJN3LGSt#7{>bYPGWu+4G+k$?LZ?9Wj?O&rqISh$RY`8Q> zhdNzNs72kfLpP&qH-kxZpUtGeMzGGBeXim_pbl|hTUSGZ?@SgU{&cGZx6nwiZq zxLsBuZnJtdx?#b8`{rOA&5VOilsm0e%cgP-{&aP*ZR1hs!T1V%^_)pj+O(=-Bi6^= zk@vZ5Vjy%!DUst6akBy4LoUvnS!GX{AUZSqf_EZ4hgd@lk-isK?~4g5-80kVkcN<#P?k6f_fKEBF&k1UNP+4T7^3ts{xZb#c{=X(l-a1E zrVY^VS|ZOz)-n<$Y{^xfV-e8QHwT);3QwKm4tY8C*P{wcrxDOTs7?L=WYB& z02t)OzpTcT08~D?qEi{VFoScd5Dl8i!{CC7j=1rwNA`xk&+v{n_DN+}VipZv(Y?rK ze`wUVg=4%41}de2NaKfD1z?~-6ybz%SFUTpX8fPC03@z{>Gmoo?qHYGoKbySq!(*V zhi!Rh^a<>NXZl!3+L%}o%B{{}K93r}VzwZ!_Jr~Kmy($j<~BH|u99JHOuGnG1J;R6 zrK(wJ%^vt^Yv=zOS+U*Vini%_&4&%J03*o5PNR{ctl>^WJ#Kr(l5MfpOeBkew- z)WT4^bWdqEF6D=F*s7Y(ctk(0Zue2Bo|EDO8KWR=5bfLGz1^igoZ$M-WOXOnL@MKDF|`veLAzs? z22IZZ9b(X@>i~LSQ;XV~CRJz4|KDN{?l{g1c<3Y-X&THSFB>r{SP! zbOW`Gcl3h9EN|o$9LW31<0X-fv`Yv*bM4yO7WD|pq0$4}5vAMPgUhlV*Sq0jljCdB zDcqj-a};N-gf?Szh?pmAnrws0t`ly1#X6*ed+|~`y7zT z7>PoHMZ9(b)D9#O<9KXs7%4UWs^ak4tOi85kx7s`T~*vJI~laMlm^KgTjDzN{{i!y zXvImSu{D3lBz!Szu=#F#ql;K>(KuXp9g@04EDOxQ4>7mUOKh-(x%-|K=1k@NGuh`v zvzj!a>B9zk4Itgg_j*(eC1pPJ@un~!VrR{%?be!(X zuv5&pDjM`(;BQuSh*T2^L+ZWL3bYxbfnME0RDtEWQ`@#UI`S^kBcLSqRinL|PXcb9 zGoz(KlXDGHKK0>V59rzRyTHBaK0})i|L3lN>%wgC$jDstRem$r5Sw)Gve&uhNlduE zqqEcCRT4axf2j1>$c06N6!C%;&}t-1QMM7XW zkiBkpQJxrUpb#_n`iP)``-I@EEp$Wk@-iiOcO6X;(Eg!Uh>>%!&fVj{s3A{($_`P& zhL%J?)d6%Em*@^MDGT&AwpJx)qZ~0nnFsEjjI=8cb7|YR?uxmBwaA(2h7Q+ccUsV@ z5aa&EGefAR$lzK_YX=Tvx!HB8C~u}3tY3qGp`{6S7$#VB34_+mE1sDE6WlrD?OVT^ z&}zWEg%ZnE_rJ!+DGnGxSdiRM^P`y#Egd>FcBRNs0&X>+!JvQ+_(OB5hdVpQ=p-_~ zKghmfBW37n)Ftu~6K3LQ_F#l+ z$2&b5(fv8b1LF;AgSVWaUBOPcc~h^u@|xi4OlOi;ZX5&u_yDZ9JFWV*_;!zo)B8IV zD5w;IVOR?c|5$omHam_k)2kIE`>RV1XGaa>vqVIQ&>eMg^5sHae%`j_9Wr!(Zca^DFC?DvxTB&VndvmzxQ0KDLlz*ssX5E_J_p5dLS#PdnjzyWA z{RlCgx2MvIdGbpcR&sw+?jSp1DU=mFYSa_|V;NnXhpmIploF06FuHpMqzy0C5IJ3H z(e1N-)v0BJ-7#G_PFf0MdWLO&W zrA#W4gUl)egGQL}p(~w4 zCq*yx37Qr}>SFbre=64C=c|QnP~c#U>+!X-TAHBbcyj+dE@ch|@!eii5SR&$FWX+S zlf+C6AZyR&pTpE-O>Jo@f9XRvgmGU2vGigRtjAJVev)g**w_zw%|*EQsi3uLFU%{r z)G@=bK&9vBf<>$uvFdoYI=1FnRGl+$D#t5QH^w~UMl9VaDyGNsu1k;Q=RGxbn0==$ z3^z}W*(>_VG*R)UF!aH$JpQQ-W5|{<_0sKoB#DF{|G?#uS4|_^H51HgyFw-HA>D4Q zY3fj-Y`h2)b$sf1RIzo=zHbxYZ4#@{(h0hE*~Am7eZn8qf+#xo`M!F~rc+Eck0KcP zUM=p`jQ(J|%J5M2?J<+tLcA-&5NHQ0z#e>nwl)WYM_*)`A-yA7U87cb@}g}{mga=W zHb*T)=j{v&$?&4#>{BpJjc2aA$q-|vW9xxwh)kPM4>Tv!ryUCOo;+()hi)SXxSd_Q=2hOHb`uJgpLdy(OBW*uX zxLaY1A1091jK|#8PyV;}lHfy4{n{U+t3~R)n|yWEMhw2}ijyk1`O98M&ZRS3!J8}0 z@eeCm6gH^O%nRBlfnETp{z8+AU#wFb)oSB0c!V)W%`!Obf=N21X^5yA6UVwd_+7zW z@KC8nOLOmXK0GnX$hwsxV=zdw1ku{71sDQhW>lM6ke|xf=0XCs?{LMoDp0GMYq=Vb zE%;S<@7lnGXQ?CFi9bXMN-N)fZ@BN(HiCTAS(53fSUAi%-&EUI1=&&~w%WPR!_jLb zr^@ZxIH6}vMeZZ#Nx{Ccxpwz5&Hj>zj6X8au1&$s=kJfa2dsULy zyzr0-*c!33^;T5En1i*TSYfuIgt5MLGPlqjG7 zdB<+&^6)l`j3pOREJt>uV9HoCKy(#I&&xJU%Dvn3t+0V3aEWzkpdFyA__f&#ib&jO zNE9v}g-jmy`ApfE!SS+ElkpS21wax?!$l9R#E1u;J0_}6H!bj7Agq|AM1QO&`q^J)317aaHuXvV~LqBud1__X&)d;F4~=YzdKr^5wR3F*T&A;Lzav zPSSWD?_EWRLvLln67#R@ZgqN41wLohujR_xeP*cX&nExbNjWkaQ~KG^Y`>eY#(p<1 zUHJx*$GQI*jW1NFqrxwAf5GbvtUC;k#f<2An#%k|e{0l-ngEs7J?Ehn7 z3S3YgxXHAv1)|O*jWjhdf zC4>5l)dS9Kb74Q^^+$mEy^}yWYi)5Qp1xL*P;5SV8^vHwTq@? z>i2CZzcEe?Q+v`<(l-=(&P;u}hHZ!eTUvIGm?YYkon?*U)KxI1^gdLdr6no}UDt9; zSw zy#RCa{9tn7zB@ zVWnY{bjvb(^)*FQ9EY)ov?q>gqg1yN^bi-FaNmwu!gS&bagyrM58tO)mXK`+5LuXC z$2N{Vo2l$FwiDG6Roci>M1cLx|L21D`K+InPzhow&6cW?&rM+#Kf5zCi-n(#%Rin{4bO5L*-Eo*=jCe9yNog|V*QIziEdh!RAH)wzw&?} z-uwiij{18tf4C@W+1>iN>VUb#eH^mCybUoyeDP#G0IhsG7*{Lf>ef)65Fd}If{rwsbXaffP`tSOl zA9Fxi@N+7=2qGlo+>5BW`#^~|?Y^z9HHmLZqkB>=NJ=|)O5gTLy^`BQA$fR|(#AO- zHAlq;^r40~Y z#JPtznNF<-tsVIrxL3SP7r!UO_^?m8x-e2!yu*R(tlm zbyk-Fi`Y4@kSFL{1e|tc2xHZx-^;t>JT_An&TSX}nE77Sx}kvYt>dkG7$ezXjX&P4 zlB6ej{l-MI)9$i)!Ep{}hRq%#O=TcMRvnvZ`&B0KD=UFTzH3l7uaj6x0(4Duhb;?Q zc^<{{6G`cF@6(D39kr-hI(4lPaTY%`JZ}q@qJ`Nkx+`;HZbrr-e%$RZ@2Vlcf6~Z( zvi5OG8>KfVf-1g?>D?#2WA|)&Bvk2qBOHN> z237yXNRoVWU7Zf|AD*E2F?T>xtIG_V*IpAA5Cjg?lwuCs3XgXcOeWs}%1KX_**JHy z+_3ZEfI`{IOEaA^{a*JV?rVbh=!xNn0UFcILdOsNpX9>Lm22qgao190T1tK zeV#q_@E3;CS|S%8Wf|;-kOLjd`Xi-ki&iiOb4vHEA#ljK{7PBOlTRJV&EN!Q_1KEI zW7?%FWs=K1s7||D2XuE9?uBfUVFmOYPfcC(rn+L}jtR+X_6dINL4;xa<7^l4XQ{iZ zJQiXdwKDt97zL%v;T5BT?5>F#V$@!vZuA(&M)t&iH~`dcmUxm=`z z3~>km0ZBxSw&12w=QN*)ydkK%Wb)gFbFoOje1y!QC$=an%8BFaa8BV{{`0PyhS$S@ z|2Z_XnPOP7teMo=T4qVAuo>$m*J|IUOqDmtnA$8(or zX0Aj}lnq6H%T1O}h=qm13mNS(iGaCQ8s)wa&gfdVoNA{woBkZDT#Q*yi~bVH>%WIC z&N4yE|E_6%J7dKOYZjM}&nPjauncOrTgJwF-O)gPSQPL@WW>+v18yD=Vj*983?-u$ zo0s?dc~Rr(S9v@mfG8f7zQu$3kWZ#pO+4Dm0?!Pi3~331YubW2qdZCeRN=lD^=hY! z(l}OGAO{G2PA{7Uv0weOz<>~|BeMAm`e!Ws@-R#5!#F*KI48Db?YPF*a?MGgfJD+R z3(V~@D#MT9`@2zH=V+)S8y8}L8DCxE(jnUhIwDF{x9-lOp^@Dg#PVYxnGX){ru|rOE@T({%dayzHcruc6uJSARAF2bN}%d8Rz%K!SV& z!}}jt^?!%>F9QEX;J*m`7lHpG@P8!&U5fPx5a<`d=I;XhU%A2mfla-lUu(xFZo9h^ zuAXj7m;ZR84|jq|KHT$w^wbBe!wUmK4^Yg${QBQ9OK zv_SJ1{Q3PYuanm$F}D48*2m`k5v{X16~Xl4PQyoc*z@Eew~R*rmh7# zdU{hiSy@@})eD=s%LW-Phed+AoTH-nrbmt(89_{SBqX@G4dbZq^6%Zd=j-IYbiKs3 zf1)*-HLl}cmvqL&r1`#hg&p~?0|zX9U0qi<78nG3zCh61Rn!>69%P3U#k!?6-0rp- z)Y^Cg#cJvLb|$Wtw8!(N?zgRN9K_s1)D0abv~B&u@xa zUQyxS7|HC?RZ>z?XalBdE-jsT#UWCy+GC4;{P=-r@CZj!lcjaEfq|}C;JLdd7+e~` z?2=NQzTY!TKW-j3)kwGUK7aGgqd}=e$h*J%{!oRnks z$(AN5PS41@db zTN@fi-{N@Oy!oA^U3~wale)UP0E5hRJl^7<(kJNts!G`);T&J z4XmZX9*~P9CpT9;tleqc`P-Af|CUY1`0V)9i4=A{e*C!i(ys5{)6}Q-Uz%TEGHq>b zea~jIM`TqS05bCN#nHxizbKlf&7spC*O=t65xW&jLiJtp!Zi#)u% z63;*S1ljjjsjgo~izdLr^N;qn#Vw76eSh;f-4eOB2q>MtN7J3_Lo``jhj@X&^Xs^O z&pu3@+cKTO`2F|adu?_p(rC0p1NlZ_oKG)pw9|gB8f|}aP}gj*F@!DyzCkTA2(o)$ z#XYpi(!4%bP+@~!+x$N|7(g^`uCAR&FYSu#5(OtXISn*XqEG4QMk&t{=mnNhdTiw>$Zk3^AF1_jK5_5~j?MWLiqMq$GiW`Q4{(M~?P27@&w^yeEzS2*PH;k>C%1$}SI zVs1s9`6gLHx|FR~cYbRR3<^5%{{4H+TpVuW?4!MAG4r2JT3L13dwF@y(GHb=2UKW$ z(u`VH7s32%zjns&|IQNZ+rJ;yj2K@-TTK%Q1j+fM>1$sBTYyB5Vv`VZnY5j5E#Fw# zdr6{Vy>WL5kjico0Js}~uG$8MggEQ!==3fPRXDo^1YA$gV~ zM*%1npXcV9=mUGZY-97b0zk{#S(zMGH1zfBdICqDlan(IFnI~ku7R*ScfO94C-=U7 zs9>#l^3lx9%x;@qH|P5D#>byFTSv`&%&k>XHHk=C$PcSa_*N7@B@)`CDKn(=A2vbQ z*ptxElXvRgw^ykqR-o61m}Fqao^v+E?Fo3jOv-o3-EEse*Y zPg?&u<#E~#o1dRQObM{Fvm>flt$$mco12?n8gI7NNkVo1T;6->&nHhLf z=SV=Hby3s-P)O-Zo3yDL?(WU3l1!___J)S#3!KQee<(St96l4^064sny_Y`r^>t{T zJbBXS(O%o9hwsUAbiMsD-rs8I>FHtZR8g}q1;o>{_flG6VWD{&;6WOzs~5}1< z-F4C@mfd9FTU9mcb>l|UN~(g|SBucW(vghg=EFWNE>W?k4?dB8dT`*tfkuFNYbF8~ zors!$nU;+H`R%pu>gp=mLO2mEUz6}RC&uOGvN8^z{n7P!_aWmI_K-G`UTn$q!Cv$8 zv!X<^1{8t6NyD(=8ed08M+JPcn2rA1w&c)LRTJ)Vu3uuP7Yc=X3z$QDRaI3Ez-_x^ k2b)bs{lD>A=kTebZGMhhJnev2)$ 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 QLN1Gng66B@mzMwjANvt=U;qFB literal 0 HcmV?d00001 diff --git a/gemini/reports/index.html b/gemini/reports/index.html new file mode 100644 index 00000000..017e6557 --- /dev/null +++ b/gemini/reports/index.html @@ -0,0 +1,221 @@ + + + + Gemini report + + + + +
+
Total Tests
3
+
Passed
2
+
Failed
1
+
Skipped
0
+
Retries
0
+
+ + + + + + + + + + + +
+
+ yandex-search + +
+
+ +
+
+ plain + +
+
+
+ +
+
+
+ + + +
+
+
+
+
Meta-info
+
+
{
+    "url": "/",
+    "file": "test/gemini/demo1.js",
+    "sessionId": "20cafe60-5a4f-11e7-8dde-e99d1aa2245a"
+}
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ with text + +
+
+
+
+ PhantomJS + + +
+
+
+
+ + + +
+
+
+
+
Meta-info
+
+
{
+    "url": "/",
+    "file": "test/gemini/demo1.js",
+    "sessionId": "20cafe60-5a4f-11e7-8dde-e99d1aa2245a"
+}
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ yandex-icons + +
+
+ +
+
+ plain + +
+
+
+
+ PhantomJS + + +
+
+
+
+ + + +
+
+
+
+
Meta-info
+
+
{
+    "url": "/foo",
+    "file": "test/gemini/demo2.js",
+    "sessionId": "20cafe60-5a4f-11e7-8dde-e99d1aa2245a"
+}
+
+
+
+
Error
+    at /home/delphin/workspaces/workspace_vis/vis/node_modules/gemini/lib/browser/client-bridge.js:42:39
+    at tryCatcher (/home/delphin/workspaces/workspace_vis/vis/node_modules/bluebird/js/release/util.js:16:23)
+    at Promise._settlePromiseFromHandler (/home/delphin/workspaces/workspace_vis/vis/node_modules/bluebird/js/release/promise.js:512:31)
+    at Promise._settlePromise (/home/delphin/workspaces/workspace_vis/vis/node_modules/bluebird/js/release/promise.js:569:18)
+    at Promise._settlePromise0 (/home/delphin/workspaces/workspace_vis/vis/node_modules/bluebird/js/release/promise.js:614:10)
+    at Promise._settlePromises (/home/delphin/workspaces/workspace_vis/vis/node_modules/bluebird/js/release/promise.js:693:18)
+    at Async._drainQueue (/home/delphin/workspaces/workspace_vis/vis/node_modules/bluebird/js/release/async.js:133:16)
+    at Async._drainQueues (/home/delphin/workspaces/workspace_vis/vis/node_modules/bluebird/js/release/async.js:143:10)
+    at Immediate.Async.drainQueues (/home/delphin/workspaces/workspace_vis/vis/node_modules/bluebird/js/release/async.js:17:14)
+    at runCallback (timers.js:651:20)
+    at tryOnImmediate (timers.js:624:5)
+    at processImmediate [as _immediateCallback] (timers.js:596:5)
+ +
+
+
+
+
+
+ +
+
+
+
+ + + + diff --git a/gemini/reports/report.css b/gemini/reports/report.css new file mode 100644 index 00000000..dbd3d411 --- /dev/null +++ b/gemini/reports/report.css @@ -0,0 +1,286 @@ +.report { + font: 14px Helvetica Neue, Arial, sans-serif; +} + +.summary__key { + font-weight: bold; + display: inline; +} + +.summary__key::after { + content: ':'; +} + +.summary__key_has-fails { + color: #c00; +} + +.summary__value { + margin-left: 5px; + margin-right: 20px; + display: inline; +} + +.button { + background: #fff; + border: 1px solid #ccc; + border-radius: 2px; + outline: 0; +} + +.button:hover { + border-color: #555; +} + +.button.pressed, +.button:active { + background: #eee; +} + +.button_checked { + background: #ffeba0; + border-color: #cebe7d; +} + +.image-box { + padding: 5px; + border: 1px solid #ccc; + background: #c9c9c9; +} + +.image-box__exp-with-act { + display: inline-block; +} + +.report_show-only-diff .image-box__exp-with-act { + display: none; +} + +.image-box__image { + padding: 0 5px; + display: inline-block; + vertical-align: top; +} + +.section__title { + font-weight: bold; + cursor: pointer; + + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.section__title_skipped { + color: #ccc; + cursor: default; + + -moz-user-select: text; + -webkit-user-select: text; + -ms-user-select: text; + user-select: text; +} + +.section__title:before, .meta-info__switcher:before { + display: inline-block; + margin-right: 2px; + vertical-align: middle; + content: '\25bc'; + color: black; +} + +.section_status_success > .section__title { + color: #038035; +} + +.section_status_fail > .section__title { + color: #c00; +} + +.section_status_skip > .section__title, +.section_status_skip > .section__title:hover { + color: #ccc; + cursor: default; +} + +.section_status_skip > .section__title::before { + content: none; +} + +.section__title:hover { + color: #2d3e50; +} + +.section__body { + padding-left: 15px; +} + +.section__body_guided { + border-left: 1px dotted #ccc; +} + +.section_collapsed .section__body { + display: none; +} + +.section__icon { + display: inline-block; + width: 19px; + height: 19px; + vertical-align: top; + padding: 0 3px; + border: none; + opacity: 0.5; + cursor: pointer; +} + +.section__icon:hover { + opacity: 1; +} + +.section__icon:before { + display: block; + width: 100%; + height: 100%; + content: ''; + background-repeat: no-repeat; + background-size: 100%; + background-position: center; +} + +.section__icon_view-local:before { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjwhRE9DVFlQRSBzdmcgIFBVQkxJQyAnLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4nICAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz48c3ZnIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgLTAuNzA5IC0zMi4wODEgMTQxLjczMiAxNDEuNzMyIiBoZWlnaHQ9IjE0MS43MzJweCIgaWQ9IkxpdmVsbG9fMSIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSItMC43MDkgLTMyLjA4MSAxNDEuNzMyIDE0MS43MzIiIHdpZHRoPSIxNDEuNzMycHgiIHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxnIGlkPSJMaXZlbGxvXzgwIj48cGF0aCBkPSJNODkuNjY4LDM4Ljc4NmMwLTEwLjc3My04LjczMS0xOS41MTItMTkuNTEtMTkuNTEyUzUwLjY0NiwyOC4wMSw1MC42NDYsMzguNzg2YzAsMTAuNzc0LDguNzMyLDE5LjUxMSwxOS41MTIsMTkuNTExICAgQzgwLjkzNCw1OC4yOTcsODkuNjY4LDQ5LjU2MSw4OS42NjgsMzguNzg2IE0xMjguMzUyLDM4LjcyN2MtMTMuMzE1LDE3LjU5OS0zNC40MjYsMjguOTcyLTU4LjE5MywyOC45NzIgICBjLTIzLjc3LDAtNDQuODc5LTExLjM3My01OC4xOTQtMjguOTcyQzI1LjI3OSwyMS4xMjksNDYuMzg5LDkuNzU2LDcwLjE1OCw5Ljc1NkM5My45MjcsOS43NTYsMTE1LjAzNiwyMS4xMjksMTI4LjM1MiwzOC43MjcgICAgTTE0MC4zMTQsMzguNzZDMTI1LjY2NiwxNS40NzgsOTkuNzI1LDAsNzAuMTU4LDBTMTQuNjQ4LDE1LjQ3OCwwLDM4Ljc2YzE0LjY0OCwyMy4zMTIsNDAuNTkxLDM4LjgxLDcwLjE1OCwzOC44MSAgIFMxMjUuNjY2LDYyLjA3MiwxNDAuMzE0LDM4Ljc2Ii8+PC9nPjxnIGlkPSJMaXZlbGxvXzFfMV8iLz48L3N2Zz4=); +} + +.section__icon_copy-to-clipboard:before { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjwhRE9DVFlQRSBzdmcgIFBVQkxJQyAnLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4nICAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz48c3ZnIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxMiA1MTIiIGhlaWdodD0iNTEycHgiIGlkPSJMYXllcl8xIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiB3aWR0aD0iNTEycHgiIHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxwYXRoIGQ9Ik00NjguNDkzLDEwMS42MzdMMzcxLjk1NSw1LjA5OEgxNTkuNTd2NzcuMjMxSDQzLjcyNHY0MjQuNzY5aDMwOC45MjN2LTc3LjIzMWgxMTUuODQ2VjEwMS42Mzd6ICAgTTM3MS45NTUsMzIuNDAxbDY5LjIzNiw2OS4yMzVoLTY5LjIzNlYzMi40MDF6IE02My4wMzEsNDg3Ljc5VjEwMS42MzdoMTczLjc2OXY5Ni41MzhoOTYuNTM4VjQ4Ny43OUg2My4wMzF6IE0yNTYuMTA4LDEwOS42MzIgIGw2OS4yMzYsNjkuMjM1aC02OS4yMzZWMTA5LjYzMnogTTM1Mi42NDcsNDEwLjU2VjE3OC44NjdsLTk2LjUzOC05Ni41MzhoLTc3LjIzMVYyNC40MDZoMTczLjc2OXY5Ni41MzhoOTYuNTM4VjQxMC41NkgzNTIuNjQ3eiIgZmlsbD0iIzM3NDA0RCIvPjwvc3ZnPg==); +} + +.section_collapsed .section__title:before, +.meta-info_collapsed .meta-info__switcher:before { + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + transform: rotate(-90deg); +} + +.reason { + background: #f6f5f3; + border: 1px solid #ccc; + padding: 5px; + font: 12px Consolas, Monaco, monospace; +} + +.state-button { + position: relative; + height: 22px; + display: inline-block; + box-shadow: 0 0 1px #000; + border: 1px solid #fff; + outline: none; + background: #fff; + cursor: pointer; +} + +.cswitcher__item, .tab-switcher__button { + width: 22px; +} + +.cswitcher__item_selected.cswitcher__item::before { + content: ''; + position: absolute; + top: 0; + left: 0; + background: rgba(4, 4, 4, 0.3) no-repeat 3px 2px url('data:image/svg+xml;utf8,'); + height: 20px; + width: 20px; +} + +.cswitcher_color_1 { + background: #c9c9c9; +} + +.cswitcher_color_2 { + background: #d5ff09; +} + +.cswitcher_color_3 { + background-image: url('data:image/svg+xml;utf8,'); +} + +.collapsed { + display: none; +} + +.skipped__list { + margin: 10px 0; + font-weight: bold; + color: #ccc; +} + +a:link, +a:visited { + text-decoration: none; +} + +a:hover, +a:active { + text-decoration: underline; +} + +.tab__item { + display: none; +} + +.tab__item_active { + display: block; +} + +.tab-switcher, .cswitcher { + display: inline-block; + vertical-align: top; + padding: 5px; +} + +.cswitcher:before { + content: 'Background:'; + padding-right: 4px; +} + +.tab-switcher:before { + content: 'Attempts:'; + padding-right: 4px; +} + +.tab-switcher__button_active { + background: #ffeba0; +} + +.meta-info { + margin: 5px; +} + +.meta-info__switcher { + display: inline-block; + cursor: pointer; +} + +.meta-info__content { + margin: 5px 0; + background: #f6f5f3; + padding: 5px; +} + +.meta-info_collapsed .meta-info__content { + display: none; +} + +.text-input { + outline: 0; + line-height: 14px; + padding: 2px 5px; + border: 1px solid #ccc; + border-radius: 2px; +} diff --git a/gemini/reports/report.min.js b/gemini/reports/report.min.js new file mode 100644 index 00000000..d7d3b6f5 --- /dev/null +++ b/gemini/reports/report.min.js @@ -0,0 +1,2 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o .section__body > .image-box .tab__item_active img");forEach.call(sections,function(section){if(section.classList.contains("section_status_fail")){section.classList.remove("section_collapsed")}else{section.classList.add("section_collapsed")}})}function expandRetries(){loadLazyImages(document,".has-retries > .section__body > .image-box .tab__item_active img");forEach.call(sections,function(section){if(section.classList.contains("has-retries")){section.classList.remove("section_collapsed")}else{section.classList.add("section_collapsed")}})}function handleColorSwitch(target,sources){var imageBox=findClosest(target,"image-box");sources.forEach(function(item){item.classList.remove("cswitcher__item_selected")});forEach.call(imageBox.classList,function(cls){if(/cswitcher_color_\d+/.test(cls)){imageBox.classList.remove(cls)}});target.classList.add("cswitcher__item_selected");imageBox.classList.add("cswitcher_color_"+target.dataset.id)}function handleRetriesSwitch(target){var imageBox=target.closest(".image-box");switch_(imageBox.querySelector(".tab"),"tab__item_active");switch_(imageBox.querySelector(".tab-switcher"),"tab-switcher__button_active");loadLazyImages(imageBox,".tab__item_active img");function switch_(elem,selector){forEach.call(elem.children,function(item){item.classList.remove(selector);if(target.getAttribute("data-position")===item.getAttribute("data-position")){item.classList.add(selector)}})}}function bodyClick(e){var target=e.target;if(target.classList.contains("cswitcher__item")){handleColorSwitch(target,filter.call(target.parentNode.childNodes,function(node){return node.nodeType===Node.ELEMENT_NODE}))}if(target.classList.contains("tab-switcher__button")){handleRetriesSwitch(target)}if(target.classList.contains("meta-info__switcher")){toggleMetaInfo(target)}}function toggleMetaInfo(target){target.closest(".meta-info").classList.toggle("meta-info_collapsed")}function showOnlyDiff(e){e.target.classList.toggle("button_checked");document.body.classList.toggle("report_show-only-diff")}function findClosest(context,cls){while(context=context.parentNode){if(context.classList.contains(cls)){return context}}}function loadLazyImages(elem,selector){forEach.call(elem.querySelectorAll(selector),function(img){if(img.dataset.src&&img.src!==img.dataset.src){img.src=img.dataset.src}})}function showSkippedList(){document.getElementById("showSkipped").classList.toggle("pressed");document.getElementById("skippedList").classList.toggle("collapsed")}function handleHostChange(){var textInput=document.getElementById("viewHostInput");var viewButtons=document.querySelectorAll(".section__icon_view-local");textInput.addEventListener("change",function(){setViewLinkHost(textInput.value);if(window.localStorage){window.localStorage.setItem("_gemini-replace-host",textInput.value)}});if(window.localStorage){var host=window.localStorage.getItem("_gemini-replace-host");if(host){setViewLinkHost(host);textInput.value=host}}function setViewLinkHost(host){viewButtons.forEach(function(item){var href=item.dataset.suiteViewLink,parsedHost;if(host){parsedHost=url.parse(host,false,true);href=url.format(Object.assign(url.parse(href),{host:parsedHost.slashes?parsedHost.host:host,protocol:parsedHost.slashes?parsedHost.protocol:null,hostname:null,port:null}))}item.setAttribute("href",href)})}}function handleClipboard(){forEach.call(document.querySelectorAll(".section__icon_copy-to-clipboard"),function(clipboard){new Clipboard(clipboard)})}document.addEventListener("DOMContentLoaded",function(){document.getElementById("expandAll").addEventListener("click",expandAll);document.getElementById("collapseAll").addEventListener("click",collapseAll);document.getElementById("expandErrors").addEventListener("click",expandErrors);document.getElementById("showSkipped").addEventListener("click",showSkippedList);document.getElementById("showRetries").addEventListener("click",expandRetries);document.getElementById("showOnlyDiff").addEventListener("click",showOnlyDiff);document.body.addEventListener("click",bodyClick);forEach.call(document.querySelectorAll(".section"),function(section){section.querySelector(".section__title").addEventListener("click",function(){loadLazyImages(section,":scope > .section__body > .image-box .tab__item_active img");section.classList.toggle("section_collapsed")})});forEach.call(document.querySelectorAll(".button"),function(button){button.addEventListener("click",function(e){e.stopPropagation()})})});handleClipboard();handleHostChange();expandErrors()})()},{clipboard:9,url:6}],2:[function(require,module,exports){(function(global){(function(root){var freeExports=typeof exports=="object"&&exports&&!exports.nodeType&&exports;var freeModule=typeof module=="object"&&module&&!module.nodeType&&module;var freeGlobal=typeof global=="object"&&global;if(freeGlobal.global===freeGlobal||freeGlobal.window===freeGlobal||freeGlobal.self===freeGlobal){root=freeGlobal}var punycode,maxInt=2147483647,base=36,tMin=1,tMax=26,skew=38,damp=700,initialBias=72,initialN=128,delimiter="-",regexPunycode=/^xn--/,regexNonASCII=/[^\x20-\x7E]/,regexSeparators=/[\x2E\u3002\uFF0E\uFF61]/g,errors={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},baseMinusTMin=base-tMin,floor=Math.floor,stringFromCharCode=String.fromCharCode,key;function error(type){throw new RangeError(errors[type])}function map(array,fn){var length=array.length;var result=[];while(length--){result[length]=fn(array[length])}return result}function mapDomain(string,fn){var parts=string.split("@");var result="";if(parts.length>1){result=parts[0]+"@";string=parts[1]}string=string.replace(regexSeparators,".");var labels=string.split(".");var encoded=map(labels,fn).join(".");return result+encoded}function ucs2decode(string){var output=[],counter=0,length=string.length,value,extra;while(counter=55296&&value<=56319&&counter65535){value-=65536;output+=stringFromCharCode(value>>>10&1023|55296);value=56320|value&1023}output+=stringFromCharCode(value);return output}).join("")}function basicToDigit(codePoint){if(codePoint-48<10){return codePoint-22}if(codePoint-65<26){return codePoint-65}if(codePoint-97<26){return codePoint-97}return base}function digitToBasic(digit,flag){return digit+22+75*(digit<26)-((flag!=0)<<5)}function adapt(delta,numPoints,firstTime){var k=0;delta=firstTime?floor(delta/damp):delta>>1;delta+=floor(delta/numPoints);for(;delta>baseMinusTMin*tMax>>1;k+=base){delta=floor(delta/baseMinusTMin)}return floor(k+(baseMinusTMin+1)*delta/(delta+skew))}function decode(input){var output=[],inputLength=input.length,out,i=0,n=initialN,bias=initialBias,basic,j,index,oldi,w,k,digit,t,baseMinusT;basic=input.lastIndexOf(delimiter);if(basic<0){basic=0}for(j=0;j=128){error("not-basic")}output.push(input.charCodeAt(j))}for(index=basic>0?basic+1:0;index=inputLength){error("invalid-input")}digit=basicToDigit(input.charCodeAt(index++));if(digit>=base||digit>floor((maxInt-i)/w)){error("overflow")}i+=digit*w;t=k<=bias?tMin:k>=bias+tMax?tMax:k-bias;if(digitfloor(maxInt/baseMinusT)){error("overflow")}w*=baseMinusT}out=output.length+1;bias=adapt(i-oldi,out,oldi==0);if(floor(i/out)>maxInt-n){error("overflow")}n+=floor(i/out);i%=out;output.splice(i++,0,n)}return ucs2encode(output)}function encode(input){var n,delta,handledCPCount,basicLength,bias,j,m,q,k,t,currentValue,output=[],inputLength,handledCPCountPlusOne,baseMinusT,qMinusT;input=ucs2decode(input);inputLength=input.length;n=initialN;delta=0;bias=initialBias;for(j=0;j=n&¤tValuefloor((maxInt-delta)/handledCPCountPlusOne)){error("overflow")}delta+=(m-n)*handledCPCountPlusOne;n=m;for(j=0;jmaxInt){error("overflow")}if(currentValue==n){for(q=delta,k=base;;k+=base){t=k<=bias?tMin:k>=bias+tMax?tMax:k-bias;if(q0&&len>maxKeys){len=maxKeys}for(var i=0;i=0){kstr=x.substr(0,idx);vstr=x.substr(idx+1)}else{kstr=x;vstr=""}k=decodeURIComponent(kstr);v=decodeURIComponent(vstr);if(!hasOwnProperty(obj,k)){obj[k]=v}else if(isArray(obj[k])){obj[k].push(v)}else{obj[k]=[obj[k],v]}}return obj};var isArray=Array.isArray||function(xs){return Object.prototype.toString.call(xs)==="[object Array]"}},{}],4:[function(require,module,exports){"use strict";var stringifyPrimitive=function(v){switch(typeof v){case"string":return v;case"boolean":return v?"true":"false";case"number":return isFinite(v)?v:"";default:return""}};module.exports=function(obj,sep,eq,name){sep=sep||"&";eq=eq||"=";if(obj===null){obj=undefined}if(typeof obj==="object"){return map(objectKeys(obj),function(k){var ks=encodeURIComponent(stringifyPrimitive(k))+eq;if(isArray(obj[k])){return map(obj[k],function(v){return ks+encodeURIComponent(stringifyPrimitive(v))}).join(sep)}else{return ks+encodeURIComponent(stringifyPrimitive(obj[k]))}}).join(sep)}if(!name)return"";return encodeURIComponent(stringifyPrimitive(name))+eq+encodeURIComponent(stringifyPrimitive(obj))};var isArray=Array.isArray||function(xs){return Object.prototype.toString.call(xs)==="[object Array]"};function map(xs,f){if(xs.map)return xs.map(f);var res=[];for(var i=0;i",'"',"`"," ","\r","\n","\t"],unwise=["{","}","|","\\","^","`"].concat(delims),autoEscape=["'"].concat(unwise),nonHostChars=["%","/","?",";","#"].concat(autoEscape),hostEndingChars=["/","?","#"],hostnameMaxLen=255,hostnamePartPattern=/^[+a-z0-9A-Z_-]{0,63}$/,hostnamePartStart=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,unsafeProtocol={javascript:true,"javascript:":true},hostlessProtocol={javascript:true,"javascript:":true},slashedProtocol={http:true,https:true,ftp:true,gopher:true,file:true,"http:":true,"https:":true,"ftp:":true,"gopher:":true,"file:":true},querystring=require("querystring");function urlParse(url,parseQueryString,slashesDenoteHost){if(url&&util.isObject(url)&&url instanceof Url)return url;var u=new Url;u.parse(url,parseQueryString,slashesDenoteHost);return u}Url.prototype.parse=function(url,parseQueryString,slashesDenoteHost){if(!util.isString(url)){throw new TypeError("Parameter 'url' must be a string, not "+typeof url)}var queryIndex=url.indexOf("?"),splitter=queryIndex!==-1&&queryIndex127){newpart+="x"}else{newpart+=part[j]}}if(!newpart.match(hostnamePartPattern)){var validParts=hostparts.slice(0,i);var notHost=hostparts.slice(i+1);var bit=part.match(hostnamePartStart);if(bit){validParts.push(bit[1]);notHost.unshift(bit[2])}if(notHost.length){rest="/"+notHost.join(".")+rest}this.hostname=validParts.join(".");break}}}}if(this.hostname.length>hostnameMaxLen){this.hostname=""}else{this.hostname=this.hostname.toLowerCase()}if(!ipv6Hostname){this.hostname=punycode.toASCII(this.hostname)}var p=this.port?":"+this.port:"";var h=this.hostname||"";this.host=h+p;this.href+=this.host;if(ipv6Hostname){this.hostname=this.hostname.substr(1,this.hostname.length-2);if(rest[0]!=="/"){rest="/"+rest}}}if(!unsafeProtocol[lowerProto]){for(var i=0,l=autoEscape.length;i0?result.host.split("@"):false;if(authInHost){result.auth=authInHost.shift();result.host=result.hostname=authInHost.shift()}}result.search=relative.search;result.query=relative.query;if(!util.isNull(result.pathname)||!util.isNull(result.search)){result.path=(result.pathname?result.pathname:"")+(result.search?result.search:"")}result.href=result.format();return result}if(!srcPath.length){result.pathname=null;if(result.search){result.path="/"+result.search}else{result.path=null}result.href=result.format();return result}var last=srcPath.slice(-1)[0];var hasTrailingSlash=(result.host||relative.host||srcPath.length>1)&&(last==="."||last==="..")||last==="";var up=0;for(var i=srcPath.length;i>=0;i--){last=srcPath[i];if(last==="."){srcPath.splice(i,1)}else if(last===".."){srcPath.splice(i,1);up++}else if(up){srcPath.splice(i,1);up--}}if(!mustEndAbs&&!removeAllDots){for(;up--;up){srcPath.unshift("..")}}if(mustEndAbs&&srcPath[0]!==""&&(!srcPath[0]||srcPath[0].charAt(0)!=="/")){srcPath.unshift("")}if(hasTrailingSlash&&srcPath.join("/").substr(-1)!=="/"){srcPath.push("")}var isAbsolute=srcPath[0]===""||srcPath[0]&&srcPath[0].charAt(0)==="/";if(psychotic){result.hostname=result.host=isAbsolute?"":srcPath.length?srcPath.shift():"";var authInHost=result.host&&result.host.indexOf("@")>0?result.host.split("@"):false;if(authInHost){result.auth=authInHost.shift();result.host=result.hostname=authInHost.shift()}}mustEndAbs=mustEndAbs||result.host&&srcPath.length;if(mustEndAbs&&!isAbsolute){srcPath.unshift("")}if(!srcPath.length){result.pathname=null;result.path=null}else{result.pathname=srcPath.join("/")}if(!util.isNull(result.pathname)||!util.isNull(result.search)){result.path=(result.pathname?result.pathname:"")+(result.search?result.search:"")}result.auth=relative.auth||result.auth;result.slashes=result.slashes||relative.slashes;result.href=result.format();return result};Url.prototype.parseHost=function(){var host=this.host;var port=portPattern.exec(host);if(port){port=port[0];if(port!==":"){this.port=port.substr(1)}host=host.substr(0,host.length-port.length)}if(host)this.hostname=host}},{"./util":7,punycode:2,querystring:5}],7:[function(require,module,exports){"use strict";module.exports={isString:function(arg){return typeof arg==="string"},isObject:function(arg){return typeof arg==="object"&&arg!==null},isNull:function(arg){return arg===null},isNullOrUndefined:function(arg){return arg==null}}},{}],8:[function(require,module,exports){(function(global,factory){if(typeof define==="function"&&define.amd){define(["module","select"],factory)}else if(typeof exports!=="undefined"){factory(module,require("select"))}else{var mod={exports:{}};factory(mod,global.select);global.clipboardAction=mod.exports}})(this,function(module,_select){"use strict";var _select2=_interopRequireDefault(_select);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj};function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}var _createClass=function(){function defineProperties(target,props){for(var i=0;i0&&arguments[0]!==undefined?arguments[0]:{};this.action=options.action;this.emitter=options.emitter;this.target=options.target;this.text=options.text;this.trigger=options.trigger;this.selectedText=""}},{key:"initSelection",value:function initSelection(){if(this.text){this.selectFake()}else if(this.target){this.selectTarget()}}},{key:"selectFake",value:function selectFake(){var _this=this;var isRTL=document.documentElement.getAttribute("dir")=="rtl";this.removeFake();this.fakeHandlerCallback=function(){return _this.removeFake()};this.fakeHandler=document.body.addEventListener("click",this.fakeHandlerCallback)||true;this.fakeElem=document.createElement("textarea");this.fakeElem.style.fontSize="12pt";this.fakeElem.style.border="0";this.fakeElem.style.padding="0";this.fakeElem.style.margin="0";this.fakeElem.style.position="absolute";this.fakeElem.style[isRTL?"right":"left"]="-9999px";var yPosition=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.addEventListener("focus",window.scrollTo(0,yPosition));this.fakeElem.style.top=yPosition+"px";this.fakeElem.setAttribute("readonly","");this.fakeElem.value=this.text;document.body.appendChild(this.fakeElem);this.selectedText=(0,_select2.default)(this.fakeElem);this.copyText()}},{key:"removeFake",value:function removeFake(){if(this.fakeHandler){document.body.removeEventListener("click",this.fakeHandlerCallback);this.fakeHandler=null;this.fakeHandlerCallback=null}if(this.fakeElem){document.body.removeChild(this.fakeElem);this.fakeElem=null}}},{key:"selectTarget",value:function selectTarget(){this.selectedText=(0,_select2.default)(this.target);this.copyText()}},{key:"copyText",value:function copyText(){var succeeded=void 0;try{succeeded=document.execCommand(this.action)}catch(err){succeeded=false}this.handleResult(succeeded)}},{key:"handleResult",value:function handleResult(succeeded){this.emitter.emit(succeeded?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function clearSelection(){if(this.target){this.target.blur()}window.getSelection().removeAllRanges()}},{key:"destroy",value:function destroy(){this.removeFake()}},{key:"action",set:function set(){var action=arguments.length>0&&arguments[0]!==undefined?arguments[0]:"copy";this._action=action;if(this._action!=="copy"&&this._action!=="cut"){throw new Error('Invalid "action" value, use either "copy" or "cut"')}},get:function get(){return this._action}},{key:"target",set:function set(target){if(target!==undefined){if(target&&(typeof target==="undefined"?"undefined":_typeof(target))==="object"&&target.nodeType===1){if(this.action==="copy"&&target.hasAttribute("disabled")){throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute')}if(this.action==="cut"&&(target.hasAttribute("readonly")||target.hasAttribute("disabled"))){throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes')}this._target=target}else{throw new Error('Invalid "target" value, use a valid Element')}}},get:function get(){return this._target}}]);return ClipboardAction}();module.exports=ClipboardAction})},{select:14}],9:[function(require,module,exports){(function(global,factory){if(typeof define==="function"&&define.amd){define(["module","./clipboard-action","tiny-emitter","good-listener"],factory)}else if(typeof exports!=="undefined"){factory(module,require("./clipboard-action"),require("tiny-emitter"),require("good-listener"))}else{var mod={exports:{}};factory(mod,global.clipboardAction,global.tinyEmitter,global.goodListener);global.clipboard=mod.exports}})(this,function(module,_clipboardAction,_tinyEmitter,_goodListener){"use strict";var _clipboardAction2=_interopRequireDefault(_clipboardAction);var _tinyEmitter2=_interopRequireDefault(_tinyEmitter);var _goodListener2=_interopRequireDefault(_goodListener);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}var _createClass=function(){function defineProperties(target,props){for(var i=0;i0&&arguments[0]!==undefined?arguments[0]:{};this.action=typeof options.action==="function"?options.action:this.defaultAction;this.target=typeof options.target==="function"?options.target:this.defaultTarget;this.text=typeof options.text==="function"?options.text:this.defaultText}},{key:"listenClick",value:function listenClick(trigger){var _this2=this;this.listener=(0,_goodListener2.default)(trigger,"click",function(e){return _this2.onClick(e)})}},{key:"onClick",value:function onClick(e){var trigger=e.delegateTarget||e.currentTarget;if(this.clipboardAction){this.clipboardAction=null}this.clipboardAction=new _clipboardAction2.default({action:this.action(trigger),target:this.target(trigger),text:this.text(trigger),trigger:trigger,emitter:this})}},{key:"defaultAction",value:function defaultAction(trigger){return getAttributeValue("action",trigger)}},{key:"defaultTarget",value:function defaultTarget(trigger){var selector=getAttributeValue("target",trigger);if(selector){return document.querySelector(selector)}}},{key:"defaultText",value:function defaultText(trigger){return getAttributeValue("text",trigger)}},{key:"destroy",value:function destroy(){this.listener.destroy();if(this.clipboardAction){this.clipboardAction.destroy();this.clipboardAction=null}}}]);return Clipboard}(_tinyEmitter2.default);function getAttributeValue(suffix,element){var attribute="data-clipboard-"+suffix;if(!element.hasAttribute(attribute)){return}return element.getAttribute(attribute)}module.exports=Clipboard})},{"./clipboard-action":8,"good-listener":13,"tiny-emitter":15}],10:[function(require,module,exports){var DOCUMENT_NODE_TYPE=9;if(typeof Element!=="undefined"&&!Element.prototype.matches){var proto=Element.prototype;proto.matches=proto.matchesSelector||proto.mozMatchesSelector||proto.msMatchesSelector||proto.oMatchesSelector||proto.webkitMatchesSelector}function closest(element,selector){while(element&&element.nodeType!==DOCUMENT_NODE_TYPE){if(element.matches(selector))return element;element=element.parentNode}}module.exports=closest},{}],11:[function(require,module,exports){var closest=require("./closest");function delegate(element,selector,type,callback,useCapture){var listenerFn=listener.apply(this,arguments);element.addEventListener(type,listenerFn,useCapture);return{destroy:function(){element.removeEventListener(type,listenerFn,useCapture)}}}function listener(element,selector,type,callback){return function(e){e.delegateTarget=closest(e.target,selector);if(e.delegateTarget){callback.call(element,e)}}}module.exports=delegate},{"./closest":10}],12:[function(require,module,exports){exports.node=function(value){return value!==undefined&&value instanceof HTMLElement&&value.nodeType===1};exports.nodeList=function(value){var type=Object.prototype.toString.call(value);return value!==undefined&&(type==="[object NodeList]"||type==="[object HTMLCollection]")&&"length"in value&&(value.length===0||exports.node(value[0]))};exports.string=function(value){return typeof value==="string"||value instanceof String};exports.fn=function(value){var type=Object.prototype.toString.call(value);return type==="[object Function]"}},{}],13:[function(require,module,exports){var is=require("./is");var delegate=require("delegate");function listen(target,type,callback){if(!target&&!type&&!callback){throw new Error("Missing required arguments")}if(!is.string(type)){throw new TypeError("Second argument must be a String")}if(!is.fn(callback)){throw new TypeError("Third argument must be a Function")}if(is.node(target)){return listenNode(target,type,callback)}else if(is.nodeList(target)){return listenNodeList(target,type,callback)}else if(is.string(target)){return listenSelector(target,type,callback)}else{throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}}function listenNode(node,type,callback){node.addEventListener(type,callback);return{destroy:function(){node.removeEventListener(type,callback)}}}function listenNodeList(nodeList,type,callback){Array.prototype.forEach.call(nodeList,function(node){node.addEventListener(type,callback)});return{destroy:function(){Array.prototype.forEach.call(nodeList,function(node){node.removeEventListener(type,callback)})}}}function listenSelector(selector,type,callback){return delegate(document.body,selector,type,callback)}module.exports=listen},{"./is":12,delegate:11}],14:[function(require,module,exports){function select(element){var selectedText;if(element.nodeName==="SELECT"){element.focus();selectedText=element.value}else if(element.nodeName==="INPUT"||element.nodeName==="TEXTAREA"){var isReadOnly=element.hasAttribute("readonly");if(!isReadOnly){element.setAttribute("readonly","")}element.select();element.setSelectionRange(0,element.value.length);if(!isReadOnly){element.removeAttribute("readonly")}selectedText=element.value}else{if(element.hasAttribute("contenteditable")){element.focus()}var selection=window.getSelection();var range=document.createRange();range.selectNodeContents(element);selection.removeAllRanges();selection.addRange(range);selectedText=selection.toString()}return selectedText}module.exports=select},{}],15:[function(require,module,exports){function E(){}E.prototype={on:function(name,callback,ctx){var e=this.e||(this.e={});(e[name]||(e[name]=[])).push({fn:callback,ctx:ctx});return this},once:function(name,callback,ctx){var self=this;function listener(){self.off(name,listener);callback.apply(ctx,arguments)}listener._=callback;return this.on(name,listener,ctx)},emit:function(name){var data=[].slice.call(arguments,1);var evtArr=((this.e||(this.e={}))[name]||[]).slice();var i=0;var len=evtArr.length;for(i;i$ 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 QLN1Gng66B@mzMwjANvt=U;qFB literal 0 HcmV?d00001 diff --git a/gulpfile.js b/gulpfile.js index 74fc9870..6b5687d2 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,6 +1,7 @@ var fs = require('fs'); var async = require('async'); var gulp = require('gulp'); +var opn = require('opn'); var gutil = require('gulp-util'); var concat = require('gulp-concat'); var cleanCSS = require('gulp-clean-css'); @@ -9,24 +10,34 @@ var webpack = require('webpack'); var uglify = require('uglify-js'); var rimraf = require('rimraf'); var argv = require('yargs').argv; - -var ENTRY = './index.js'; -var HEADER = './lib/header.js'; -var DIST = './dist'; -var VIS_JS = 'vis.js'; -var VIS_MAP = 'vis.map'; -var VIS_MIN_JS = 'vis.min.js'; -var VIS_CSS = 'vis.css'; -var VIS_MIN_CSS = 'vis.min.css'; -var INDIVIDUAL_JS_BUNDLES = [ - {entry: './index-timeline-graph2d.js', filename: 'vis-timeline-graph2d.min.js'}, - {entry: './index-network.js', filename: 'vis-network.min.js'}, - {entry: './index-graph3d.js', filename: 'vis-graph3d.min.js'} -]; -var INDIVIDUAL_CSS_BUNDLES = [ - {entry: ['./lib/shared/**/*.css', './lib/timeline/**/*.css'], filename: 'vis-timeline-graph2d.min.css'}, - {entry: ['./lib/shared/**/*.css', './lib/network/**/*.css'], filename: 'vis-network.min.css'} -]; +var exec = require('child_process').exec; +var spawn = require('child_process').spawn; + +var ENTRY = './index.js'; +var HEADER = './lib/header.js'; +var DIST = './dist'; +var VIS_JS = 'vis.js'; +var VIS_MAP = 'vis.map'; +var VIS_MIN_JS = 'vis.min.js'; +var VIS_CSS = 'vis.css'; +var VIS_MIN_CSS = 'vis.min.css'; +var INDIVIDUAL_JS_BUNDLES = [{ + entry: './index-timeline-graph2d.js', + filename: 'vis-timeline-graph2d.min.js' +}, { + entry: './index-network.js', + filename: 'vis-network.min.js' +}, { + entry: './index-graph3d.js', + filename: 'vis-graph3d.min.js' +}]; +var INDIVIDUAL_CSS_BUNDLES = [{ + entry: ['./lib/shared/**/*.css', './lib/timeline/**/*.css'], + filename: 'vis-timeline-graph2d.min.css' +}, { + entry: ['./lib/shared/**/*.css', './lib/network/**/*.css'], + filename: 'vis-network.min.css' +}]; // generate banner with today's date and correct version function createBanner() { @@ -34,8 +45,8 @@ function createBanner() { var version = require('./package.json').version; return String(fs.readFileSync(HEADER)) - .replace('@@date', today) - .replace('@@version', version); + .replace('@@date', today) + .replace('@@version', version); } var bannerPlugin = new webpack.BannerPlugin(createBanner(), { @@ -44,17 +55,15 @@ var bannerPlugin = new webpack.BannerPlugin(createBanner(), { }); var webpackModule = { - loaders: [ - { - test: /\.js$/, - exclude: /node_modules/, - loader: 'babel-loader', - query: { - cacheDirectory: true, // use cache to improve speed - babelrc: true // use the .baberc file - } + loaders: [{ + test: /\.js$/, + exclude: /node_modules/, + loader: 'babel-loader', + query: { + cacheDirectory: true, // use cache to improve speed + babelrc: true // use the .baberc file } - ], + }], // exclude requires of moment.js language files wrappedContextRegExp: /$^/ @@ -70,7 +79,7 @@ var webpackConfig = { sourcePrefix: ' ' }, module: webpackModule, - plugins: [ bannerPlugin ], + plugins: [bannerPlugin], cache: true, // generate details sourcempas of webpack modules @@ -90,14 +99,14 @@ var uglifyConfig = { // create a single instance of the compiler to allow caching var compiler = webpack(webpackConfig); -function handleCompilerCallback (err, stats) { +function handleCompilerCallback(err, stats) { if (err) { gutil.log(err.toString()); } if (stats && stats.compilation && stats.compilation.errors) { // output soft errors - stats.compilation.errors.forEach(function (err) { + stats.compilation.errors.forEach(function(err) { gutil.log(err.toString()); }); @@ -107,27 +116,83 @@ function handleCompilerCallback (err, stats) { } } +var phantomjsPort = 4444; +gulp.task('gemini-tests', function(cb) { + var phantomjsProcess = spawn('phantomjs', ['--webdriver=' + phantomjsPort]); + var completed = false; + var hasError = false; + + phantomjsProcess.stdout.on('data', function(data) { + if (data.toString().indexOf('running on port') >= 0) { + gutil.log("Started phantomjs webdriver"); + + var geminiProcess = spawn('gemini', ['test', 'test/gemini']); + geminiProcess.stdout.on('data', function(data) { + var msg = data.toString().replace(/\n$/g, ''); + if (msg.startsWith('✓')) { + gutil.log(gutil.colors.green(msg)); + } else if (msg.startsWith('✘')) { + hasError = true; + gutil.log(gutil.colors.red(msg)); + } else { + gutil.log(msg); + } + }); + geminiProcess.stderr.on('data', function(data) { + if (!(data.toString().indexOf('DeprecationWarning:') >= 0)) { + hasError = true; + gutil.log(gutil.colors.red(data.toString().replace(/\n$/g, + ''))); + } + }); + geminiProcess.on('close', function(code) { + completed = true; + phantomjsProcess.kill(); + }); + } + }); + phantomjsProcess.stderr.on('data', function(data) { + gutil.log(gutil.colors.red(data)); + }); + phantomjsProcess.on('close', function(code) { + if (code && !completed) { + return cb(new Error('✘ phantomjs failed with code: ' + code + + '\n' + + 'Check that port ' + phantomjsPort + + ' is free and that there are no other ' + + 'instances of phantomjs running. (`killall phantomjs`)')); + } + gutil.log("Stoped phantomjs webdriver"); + + if (hasError) { + opn('./gemini/reports/index.html'); + } + + cb(); + }); +}); + // clean the dist/img directory -gulp.task('clean', function (cb) { +gulp.task('clean', function(cb) { rimraf(DIST + '/img', cb); }); -gulp.task('bundle-js', function (cb) { +gulp.task('bundle-js', function(cb) { // update the banner contents (has a date in it which should stay up to date) bannerPlugin.banner = createBanner(); - compiler.run(function (err, stats) { + compiler.run(function(err, stats) { handleCompilerCallback(err, stats); cb(); }); }); // create individual bundles for timeline+graph2d, network, graph3d -gulp.task('bundle-js-individual', function (cb) { +gulp.task('bundle-js-individual', function(cb) { // update the banner contents (has a date in it which should stay up to date) bannerPlugin.banner = createBanner(); - async.each(INDIVIDUAL_JS_BUNDLES, function (item, callback) { + async.each(INDIVIDUAL_JS_BUNDLES, function(item, callback) { var webpackTimelineConfig = { entry: item.entry, output: { @@ -138,12 +203,12 @@ gulp.task('bundle-js-individual', function (cb) { sourcePrefix: ' ' }, module: webpackModule, - plugins: [ bannerPlugin, new webpack.optimize.UglifyJsPlugin() ], + plugins: [bannerPlugin, new webpack.optimize.UglifyJsPlugin()], cache: true }; var compiler = webpack(webpackTimelineConfig); - compiler.run(function (err, stats) { + compiler.run(function(err, stats) { handleCompilerCallback(err, stats); callback(); }); @@ -152,48 +217,51 @@ gulp.task('bundle-js-individual', function (cb) { }); // bundle and minify css -gulp.task('bundle-css', function () { +gulp.task('bundle-css', function() { return gulp.src('./lib/**/*.css') - .pipe(concat(VIS_CSS)) - .pipe(gulp.dest(DIST)) - // TODO: nicer to put minifying css in a separate task? - .pipe(cleanCSS()) - .pipe(rename(VIS_MIN_CSS)) - .pipe(gulp.dest(DIST)); + .pipe(concat(VIS_CSS)) + .pipe(gulp.dest(DIST)) + // TODO: nicer to put minifying css in a separate task? + .pipe(cleanCSS()) + .pipe(rename(VIS_MIN_CSS)) + .pipe(gulp.dest(DIST)); }); // bundle and minify individual css -gulp.task('bundle-css-individual', function (cb) { - async.each(INDIVIDUAL_CSS_BUNDLES, function (item, callback) { +gulp.task('bundle-css-individual', function(cb) { + async.each(INDIVIDUAL_CSS_BUNDLES, function(item, callback) { return gulp.src(item.entry) - .pipe(concat(item.filename)) - .pipe(cleanCSS()) - .pipe(rename(item.filename)) - .pipe(gulp.dest(DIST)) - .on('end', callback); + .pipe(concat(item.filename)) + .pipe(cleanCSS()) + .pipe(rename(item.filename)) + .pipe(gulp.dest(DIST)) + .on('end', callback); }, cb); }); -gulp.task('copy', ['clean'], function () { - var network = gulp.src('./lib/network/img/**/*') - .pipe(gulp.dest(DIST + '/img/network')); +gulp.task('copy', ['clean'], function() { + var network = gulp.src('./lib/network/img/**/*') + .pipe(gulp.dest(DIST + '/img/network')); - return network; + return network; }); -gulp.task('minify', ['bundle-js'], function (cb) { +gulp.task('minify', ['bundle-js'], function(cb) { var result = uglify.minify([DIST + '/' + VIS_JS], uglifyConfig); // note: we add a newline '\n' to the end of the minified file to prevent // any issues when concatenating the file downstream (the file ends // with a comment). fs.writeFileSync(DIST + '/' + VIS_MIN_JS, result.code + '\n'); - fs.writeFileSync(DIST + '/' + VIS_MAP, result.map.replace(/"\.\/dist\//g, '"')); + fs.writeFileSync(DIST + '/' + VIS_MAP, result.map.replace(/"\.\/dist\//g, + '"')); cb(); }); -gulp.task('bundle', ['bundle-js', 'bundle-js-individual', 'bundle-css', 'bundle-css-individual', 'copy']); +gulp.task('bundle', ['bundle-js', 'bundle-js-individual', 'bundle-css', + 'bundle-css-individual', 'copy' +]); // read command line arguments --bundle and --minify var bundle = 'bundle' in argv; @@ -204,14 +272,13 @@ if (bundle || minify) { watchTasks = []; if (bundle) watchTasks.push('bundle'); if (minify) watchTasks.push('minify'); -} -else { +} else { // by default, do both bundling and minifying watchTasks = ['bundle', 'minify']; } // The watch task (to automatically rebuild when the source code changes) -gulp.task('watch', watchTasks, function () { +gulp.task('watch', watchTasks, function() { gulp.watch(['index.js', 'lib/**/*'], watchTasks); }); diff --git a/package.json b/package.json index e1d285ee..7e936343 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "main": "./dist/vis.js", "scripts": { "test": "mocha --compilers js:babel-core/register", + "gemini": "gulp gemini-tests", "build": "gulp", "lint": "eslint lib", "watch": "gulp watch", @@ -41,15 +42,16 @@ "babel-core": "^6.6.5", "babel-eslint": "^7.1.1", "babel-loader": "^6.2.4", - "babel-polyfill": "^6.22.0", "babel-plugin-transform-es3-member-expression-literals": "^6.22.0", "babel-plugin-transform-es3-property-literals": "^6.8.0", "babel-plugin-transform-runtime": "^6.22.0", + "babel-polyfill": "^6.22.0", "babel-preset-es2015": "^6.6.0", "babel-runtime": "^6.22.0", "babelify": "^7.3.0", "clean-css": "^4.0.2", "eslint": "^3.15.0", + "gemini": "^5.0.0-alpha.3", "gulp": "^3.9.1", "gulp-clean-css": "^2.3.2", "gulp-concat": "^2.6.1", @@ -59,6 +61,7 @@ "jsdom-global": "^2.1.1", "mocha": "^3.2.0", "mocha-jsdom": "^1.1.0", + "opn": "^5.1.0", "rimraf": "^2.5.4", "uglify-js": "^2.7.5", "uuid": "^3.0.1", diff --git a/test/gemini/demo1.js b/test/gemini/demo1.js new file mode 100644 index 00000000..5c715add --- /dev/null +++ b/test/gemini/demo1.js @@ -0,0 +1,8 @@ +gemini.suite('yandex-search', function(suite) { + suite.setUrl('/') + .setCaptureElements('.main-table') + .capture('plain') + .capture('with text', function(actions, find) { + actions.sendKeys(find('.input__control'), 'hello gemini'); + }); +}); diff --git a/test/gemini/demo2.js b/test/gemini/demo2.js new file mode 100644 index 00000000..656070ec --- /dev/null +++ b/test/gemini/demo2.js @@ -0,0 +1,5 @@ +gemini.suite('yandex-icons', function(suite) { + suite.setUrl('/foo') + .setCaptureElements('.tabs') + .capture('plain'); +});