From 77c63f989391a21e2d6e0272a5e4f5282f2f74c6 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Sun, 13 Dec 2015 23:22:57 +0000 Subject: [PATCH 01/37] Run flake8 in all builds on Travis. --- .travis.yml | 12 ------------ flake8-run.sh | 12 +++++------- 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/.travis.yml b/.travis.yml index ad425cc9..24fa867c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,18 +17,6 @@ env: - USE_OPTIONAL=true - USE_OPTIONAL=false -matrix: - exclude: - - python: "2.7" - env: USE_OPTIONAL=false - - python: "3.4" - env: USE_OPTIONAL=false - include: - - python: "2.7" - env: USE_OPTIONAL=false FLAKE=true - - python: "3.4" - env: USE_OPTIONAL=false FLAKE=true - before_install: - git submodule update --init --recursive diff --git a/flake8-run.sh b/flake8-run.sh index d1a587d3..685ec6ab 100755 --- a/flake8-run.sh +++ b/flake8-run.sh @@ -5,10 +5,8 @@ if [[ ! -x $(which flake8) ]]; then exit 1 fi -if [[ $TRAVIS != "true" || $FLAKE == "true" ]]; then - find html5lib/ -name '*.py' -and -not -name 'constants.py' -print0 | xargs -0 flake8 --ignore=E501 - flake1=$? - flake8 --max-line-length=99 --ignore=E126 html5lib/constants.py - flake2=$? - exit $[$flake1 || $flake2] -fi +find html5lib/ -name '*.py' -and -not -name 'constants.py' -print0 | xargs -0 flake8 --ignore=E501 +flake1=$? +flake8 --max-line-length=99 --ignore=E126 html5lib/constants.py +flake2=$? +exit $[$flake1 || $flake2] From 66a3f42444cb1d4d2cfa32f6d1d69243baa6a9fa Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Sun, 13 Dec 2015 23:25:04 +0000 Subject: [PATCH 02/37] Add codecov. --- .coveragerc | 8 ++++++++ .travis.yml | 6 +++++- requirements-install.sh | 4 ++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 .coveragerc diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 00000000..6facf352 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,8 @@ +[run] +branch = True +source = html5lib + +[paths] +source = + html5lib + .tox/*/lib/python*/site-packages/html5lib diff --git a/.travis.yml b/.travis.yml index 24fa867c..94bb87e7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,8 +24,12 @@ install: - bash requirements-install.sh script: - - py.test + - if [[ $TRAVIS_PYTHON_VERSION == pypy* ]]; then py.test; fi + - if [[ $TRAVIS_PYTHON_VERSION != pypy* ]]; then coverage run -m pytest; fi - bash flake8-run.sh after_script: - python debug-info.py + +after_success: + - if [[ $TRAVIS_PYTHON_VERSION != pypy* ]]; then coverage combine && codecov; fi diff --git a/requirements-install.sh b/requirements-install.sh index a8964ea0..8cab142d 100755 --- a/requirements-install.sh +++ b/requirements-install.sh @@ -13,3 +13,7 @@ pip install -U -r requirements-test.txt if [[ $USE_OPTIONAL == "true" ]]; then pip install -U -r requirements-optional.txt fi + +if [[ $CI == "true" ]]; then + pip install -U codecov +fi From b65ae3f3b707e31b790c67134370444d39e33999 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Mon, 25 Apr 2016 02:00:39 +0100 Subject: [PATCH 03/37] Update pytest-expect to 1.1 and its human readable format --- .pytest.expect | Bin 55002 -> 60852 bytes requirements-test.txt | 2 +- tox.ini | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.pytest.expect b/.pytest.expect index e818b51683df6a369de1cb6f44e86dbd9bcc9a27..c9133f40faef31770929a34fd90bc4241b78aab8 100644 GIT binary patch literal 60852 zcmchgO>Z365k>d@72GKSBy0M;{u=HA*Z~40$i}-MFeqvy4@8jyIg+jX`rH=zhEqMF zn$|m)8!rUu)~)JO@0;|8&%4dd?#1Sh51aGd$(!xP=HyfJ!(Y<#li~SE(>yP&`d2q!{`>3Z^8D)c_VVqIA3mR+PJh1tlhf1xG|lS2 z&rVPN{d1(2R8g>-ACs3l7%nTVK`T^4D(MX(+r(l5gG7?DN59wV~Y>dPYi8u-Nh8u-Nh^5FZJ zbQTBTWszaEI0QaIWN|jV@3jYeXJ`OohlZ$01Hkr(8U7K4O#rb&0*Dc`mBjP>)5MCzvui7f3K7bn2f0N-YL z^SA5+SS6)2)K3=@sUPVj0+cla!$8WwFpz+eF=e2vEzo&HQCncGmRew{NW|A|fv#zR zp@^6!I$&4@j$Kk$KX0ZE=$H;zhNli#hD)S=vg&|Q6*vz|eP6#olSq9**1&E&t%=cW zO^jx1V1UoSK~@G1l5wJ0X$!5n3YkdrpZE)UT1k)=!@~Enk-|f1R`fs81{4>!jto*GHs7 zOc#lmFNk$#CKjF&0fI`hCGcl|YqZ+US%{?#+_Z_g%>VYGd+;_l2i`ZTCz|1!Q zRULrOI{*iJdFX%{cmR&}@&Ig#uQLKy-W_m9+%NwW^77A3Nu++YC6W5omPG2uq@EaJB~rhm?HgbPDiNY4z#CdQ zsb8M-4RG=y5rSCY^{SlI5B3tNUld4$AQm_)?;GG!Mj`}kz?p7Oyg88w(8a`?6FC8h z)epo}Keg%;u(a>$A7-H;#e>q;j^apq&}4Sg1KZ#Y}yPTN-dr)Z2>3}Y@4SW8P#)&q=$*Y$#BJ4A0Do`HgE+H^)LME&>BK0`e2l%JJj}f@ID4ar+p4bs z{@$1eab^>#we*J4iBX*S7<)r`n0v$78h6^Z+CN2O%wiaGiNIRg;>o(AU~9_4+Y{M& z$+s7Gku(Lc&lg8QoZ0vrV@fARapvQjFQz=qz0nvaj9kQR)mH$2Z_I-@vx(F?hTG|* z#3;^ujJ=^e%)QY%d!vZks;>b4-k1k*W)rEk^oG)jQJnc0dqa7cd!uvqMiIAFUjh8R zF%RO*CQ@tZ4W$#KIP)>~hVn4?hV%VYF5$#tXFkT>P#)&q zC{LU$pP`7`sy~0)H|+1Hbg5{2i(a&CwSS69V-~}hO9a-^ z7Ed-~lp)=eg?GMaooBauaTiHbfH0IhzQIutXEy%En9_++ocZ|XizyFtZ|DTfHes|y z+*W-B@b|_%h%=i=t)EDB`y2D}cW@=0Tj$#tXFkT>P##ooyg%FhM*a-=v0i-02KmkMey~(0SR#KW4X6L%F=ZF@?tV~B?*fqA^7dM;Bo9%A< zX}kMOZpt1JpuX1M4gzBSCjz;%ioEWPeb+DR+W+gXQV=7#^CDX1+xbwvbN%rZ+A7C- z^|cO~U?V)N3ww_6?LX{yVIE9JVc0bRad68s+c5X~_b&H>WGyFA3${nXwCl(h1@2@! zD$~AMbSJ+CcD2(47T5>u7D2R{67{e<7p7fD!Z3DaJ1Wz@VRq%$z^-1uv+Nc@w3-t2 zusau~T}Q$&c4a#%)4pML<=4QjZpK-5iy&G}iF(+b3)8M6VHmrz9hGU{FuU?=V3$Vs zP7kf63*4D5>^Z`PVQZzfAO^bSnN9Q_Z7)a?Fo{~m+aqDxwFlhEc2uT)v*YdL*T613 z-fA)aW$A&|(gp5J7xoV6tfVw8%+7UT z&k-$(S(%Q)uxplCxuuxhZEkiqO>_GqqAWq{s`^#Q`g+b~L3qC@%{z~zvBi$symtcR zdAV7Z`&*WqQ7?>vLHO3}ktkK!Lt&ig2gM!kBY6bXhxVho!#_v%p>Gr0W#fgGxrpM` zm9UTPxwyl9q>nCoRCo9{u&uJ2*e)A1w9G{mukL({M!OD;<8UA8qwPm^hkpax;GQrn zA4WZFrk5mpO}Ms`ZeR~2<4D`!J%R_DkKzXRIMh?gE#vj5{}~I;bkU?MD_tAYb8Un7 zh#kqa%tvv9d!A{z_Asqq0)R7JH0jDp*T(c*+u%K7M=~w*QQY93XIidVrq|^>1Y~-y zNmceh7ian*ZG-oS9l`X0`6zC1&oO=A+QM`qkNED)?ls}cPP#6pkF*WmBX%Iulldra zaE~)Rxki~zx5KoSG}OvtrU+H_UX`Z#0cG5Ggbg71-guP8onsW=J9aRv>q(g5qR3WM zswRf#%DC?c8pp7VM`_$S&9EG^40pE!v2-zrXOdJ+?`3g}ACTsqN7@LG@2y8|-aCi# zy=M!{+Edaj7fHCPl6A2>m*$;E-awXRJ!ScU_EN{-Z7RBJX0+HzIpX-yIb8Yz#Ha5@Bz{K${q`YL@$Ut+(+{2s6MtI)gAr` zvX6b6*e*{l&@vZMyt?c=j#-iC;tuzbKDy{p-QnNBw#sf|n^}d-C@G?NbtUW@x98#x z_mMu7ZP}0N4*v$W<=ewH^Fsg;?V?H7R=PH@=h_DE5j+xWnUCTI_dL{c{Vk^d50!5) A?f?J) literal 55002 zcmcIt$&wq#5w&%3gu}lg3B3dG)w?ar3%!KsF+Jiy(gevNV>nu4K_wD7&7g*t=H}AGv`B#&F zxZOUj`@Xu^|0(guSC@B}AIkzCK7W1l_U`uU=Xcn}arL_U2>*J!9k$!&KYzJ6y}5j~d;8|{`R?ldHnHa9x3e4ShKv2DiNDS4=l1K*-yJto)!S`mGy6ZEzu*_I zZ+F*U-hBAQ?d6wpu;b!QwcY;g(@&-+-2dkMMGrceNbTi!uU?w9et-U2lM`nT%$h@A z)td|UkL$Ks(|_DoZAbrc+xIK_kDGc`U$Exd49$hd5RCE;2KCMB>#Gk(zhU=LSL=)Y zC+8c{!65Iwxa#k1+iqq5tMiwe9BZ}RM%Mke^H<8a-)T|1Mb=WQVGXtY_558O#8vf2 zELg7tzguQgP2IN_``?|vsfo}5#7Cjqt?Yks{%Wr-@4h;o4;l=hj+JxYZ(x?cK7SJi zCn4sA_R;no4{LqZAw-r(kj-MpX@(YJb?itjC5qUA!8qbjVoRAe zYm!Y}RXo}YIdO={$UVnR96qY+#dL%h$f|QOK;1-0xB^?E473R;rCpRhWwpU6IdB~# zn%#sz*l%aU{@y`ytT|NJr~!w-&VI|NwK_%dV6lIkzgQlSvq>MBg*Me1=1T!9 zj%j4KfG<@bEvySvLpAV!44&c=!_nY3_o#A;34z8PFl-!1Xl_o?B$5L7Qn8$)GGgII z_4eFsCbeGmG(V_Ce-3$PJnZDUYRmh-obR?rC06NB6Ud14*S=mMe{w`qV^{}d4r7id z+dQmxA2v?8tICR1d{eDl$_vf}?=#jo+0c+s-m|;cFLpQA-|ue6%G{IFKS5otTdhFx z9U)C?+TDUn zB$2QmmE631rC>%F~NBSk!1&Var_~o0Jo+Ct8c4#W*w@7dujO%O_m>XQdJpXfP67=Cs3V zjd0|k{(4%#YYJOfx%YJoxfi2;1IV*xF)=j;?O3nX31@}LxaW-Nr927 z@%^f5Siz+n(N0wZD0@635@wb#B34G|>EW1;=CU61f!vN(nuHJsW3i+y&Na%Ty1?Q= zxSMJNdQKGqN77in3v?oRuWI@ZiKPRxjDo85$$ra^(ba3dkki+lFMCU4`pEc} zp%m!GwHNP+WVGFE`1U$_t-K(sq2YfST4-o|?`tUsIC?Y6zhaN}VBpcBCpA4oF4eF- zUZS`vLox}3_be9hq!<(#6GOcNWj7Mm>y>oQiy3N*pp%WQPtNCjX=koe86{bVS)&fa zmbo@kqjZEowd)hOS~TJUPKAiGRM?YZBrA=k?=SZMI$yV=|0T1Jto1n3kc{=5sPDLe zD-ZWjB}Q48)g~=R1U%M#(fxrE%0(0-k-rzIgN+H4(~+t{ z@yN!(Ai}VE8a8}h+4cjksYd%qhb@D-?Zdzm#q(@>f7AdlWMwkd=)i7u9bHM$@@sfz(YK2vU2GJx*zte{pGvS;gAWavWa%~4J|+V-Tp z8QQjkXQ_T9Ewx%#O>q(G5ePQO#S(KM<1EtTh{aP34|olW3$S)1=v3Y)Q_&?E`Y4@b zw2W4!hL6L+?eRCS_QmyL?RM*`v>JNJod{-%vOJ$IU`iDEt@rj6EuN9Y30eq2jII2hn-%~bR&ZN_Q2v+88vniPg zNDSpUq&10PC$U>gDxdI^u9nFS6iz&mQFjV@o(;7Q6pajJK|g8-Cml7X%SnqaTF%T^ z{xgwWxdu29xXpe8^WoT3#0Dld<4~~$VJwLI<-d zU~#D$WSYl8BTUwK7=_8YX>tB2lPRf2hiA}1HS$2h@4ZkMG6<^=&$SiZqO#FoH3!(M z#o)jx>9Jj~HR_K0&q|Rb)WXCq933_lS&F|uE#Bk|<#r&`(N~mdrnKSlJw3G;iuJp| zV2XXO85x>gnFSimck>kqy!it5j_pLXab)P=tG+KjQ&m%OWb&u)_R=wR}uzqIl&vU&L9hr%w>mQ4v$2r5TdPyL7D# zNO&l}6+AYVLP=KkLxWN#`^R-X6tvw3j2p4PjDb}66H!UQ3@v|NR1WzqqcjhCP&^%3 z&y-kMX<|YbogxRv%~W9)!~_(rU|J;DHbTT4c%s4Z0oK3@xT|0|<*`X9$4r*VifdS* zo8dsp1N=r!qY3Id?zl$a_6X-|3RnehQGi&LvkJiW+{wt+e^X&rh&4(y1rTM-CL%vdH16P=-a0?3#`;swNl^YIZ>fql>{Hw<>Lq6$X44=%a+t zpg6_(@tC1a7IF}nv>!t&iJFS%X)V?8(gz+hNIfvC)2dqYHLGE@LYI}u;kve9b_dV9 zE|Tk{%Bl_r);RJA`5YvRQkcX0(?+a-t(M}+6ZDMmv6MSFo`pGr=>5yThptK(plBOj zqm)pNOEWmk?hF&=$YZIZ|9HQ2qB%#%Qt+7{Rpa_h4^&u5{#$RHIrb=;nGYoffG%MkD=`bC#RJDd(}K-~m3xt5jCz7`_N-@L13cw&s9R zqg#0$FXvJY5JH*MAM18{hfhp&=1YZRqeN5)G+Tvwo5)%^PwZ7Ua3%HcK) zi|S*nJn)PQ-=Aq3c`naEX^)mZ87WWosmd?+%Hv3>m02Nm9o{zaY%9Qs2pa>eaMVqL zm4QAs3AZb=2gW54)O{U_)o=%du{%;5_0+y}LFm#hXpiXWxkf;{Sb{J}`@J}u(icG| zLMsoR=}H4@8%-xgn&Q%#+>Nk$ot)X>5a~dtPq5u;h62EZNzBl>)3>sF$0haDPhNz8OwJ1lP(E(nW?wPR7=?v~X+ zjTgmS_i>Lx)L}mh5X)?;X$r;$HqJ+g(l8(`oVlZU>@NKaLiCqpKwx_4v=#@rX8c4D z2lj!JMFq8mEadRc4N-M&<;Ey?ZS|DkPUPYU{1!(aur786M94mi1kKPPQ*hKf6qCmH z$EOR@X$v|c?0i%dSsz~Ca*uunM}FEJr-QA3qIrnV1mHPhquD2 z-7=<)x)ETreE#a80z~nR6d;%J?1>AJUX6F47O6`|!EmxQCd6-K$w`adQo3i4ab!G$ z#Fwh^^fW@eBZrSdd@AqoWHhmn%?Zh4aOqrW{9w4n?DB<$?y2pGm3EgAFva9pE?W0JOa|c%Z_I#d} zsB*vY6O`i*Ur~>VA(}XPl=}O^Jq>>d4&_)h?c<{>>H$4FwQeY1VK=+gMOpL0ls?}O z#aK5ui6e|3AX`6mlfo#+sKaqJeU7;l|I-?j&tD~1c3@6$ZlgnMajYII(AEog&YpV$ zdYL`d8|26Afx7j;SADu(t_?X9lvceyfj4n9_THBa9*}>##xSb8_%WgWv$#zKIl;}8 z_c}_4NBTBSP0o*@u~vi!kCw<|r9V0=L zSW|l8@gcU+#ON0~yGC;R;`ky7V3>5UPTDl`a%A~*L{u6mmlmjrkDqJK7n!(aCZ6(& zVT&`T^cb3AxeT?>I6IA=cz4B*yCXl!h&}wmxE{;hGn~AQXxv_OQXU7!jZX;3vsf zxKWi|Ir);8c4o!keNKB4Zi3UZipHyH$d9NOOcMQ0M-TOAFq1f*v0zV{YK(CG0EKjW zTW)MhErwMB-XTLq$X(G*T=U~*7Wn1@UVrmZCk>6Tp`6}}kyZx$bBjBeaTA801BTf#R8eM6P8 zp+;t3%xEN8NiiBSU2c$BxP~f~6wVjuJvEqMCk*m~M|kAmPHF(yS^|Q~37$0g6AQEWjae0D0Q%Gf84IsAgtGot%Vi*vV$=nX ztl+y${IkLR;Z31pV~#k38Z)olqRUnC@s1UdGOs z<0KX%^(dZel}9)~J_8#E2G*rIc^QEvO_kiu^G2joH&ni(Zje2|7jjcwEt_(5z6@KH zOFLn3V8w%rI;b}ldzZ{aJc68Xr^feQX3S2rR_*AZS?Qw&no0s$4WKcNGkUw^WBWfH zhCSUNg|o*|BHp@#i8+#~K#5_^*}9;oE~!a^Z$nCOZb!>eU17<9zQ!vEp0r*yDQ|wv1n~ug z7quJ$;W=<5Z8Z3S$f}E-Pe&7j?K)ywdb={7l}MsJUajgIJv!K>qfVRIWkRYfl?TAm zR32Y7<6FAT1~oKx*YzR~P{}(?v)I8V1cyFLScWYQ_%fhx;9wH)*=r~B2*YAK&X2ox zWW8pNKGjRQ3` z{N+z#RgLh)THq>8**kAaGJ z6f5DZZ#$Su;Ci7?mx~-_Kh(}0R-_g_at7VS0-55>JZ^DR5;A5mak6vohtMZ|rvwXQ zJpky+djRGZ(c>+K(lB&ee_%spEtPo3V5{00kTm2c#pGG&R7!1Z3|nNVDw_V8n5QEK zrHS~dmp56HY%juzqCAO*-35vh1|((9INDzESV8>olgg3x^}dp9yF9}hiygY91&Z?X z!w7!TJE05N!1&qu@9m_G9HPkJdx4Vpq!U+z_;Mmjulx)+o*@LQF0NkaJ!=~T%F8+N zWAec-6z^Rhrm`!umeBTyuIwL!W$`b%APd3BoTJO5u`}-wp8GilU=J^)r(!4B&#YQW z03GRvtwqZ`ct8(WB@KJIpJCd?n*m&z(H%1D@r-oWyOV(8b5G?k{Vtq zBI(vzK7vbeNvI|?mLU;zp548EvAences}xPn|Ir-Nb^s13w4j1_;? zZ{Rn@OjxevB)qx&K@2HCEp2i*Gjeo&DdS?}0RNT9>hIM={ZsJu>SO;cB;WmL&D zAS)w@G>$4&nv6@kGXz^Q_F;M*KEb}>9HufV-35YuSg*3E!fN0!t?$6OfT7Jmucty9 wn`x@>?^*G%PaUn!Bx{~wf{^8exj*Yb?Mg086c^LN_+ZVW+{t8kE^xB{0~_P|t^fc4 diff --git a/requirements-test.txt b/requirements-test.txt index 0580136a..e24223ef 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -2,6 +2,6 @@ flake8 pytest -pytest-expect>=1.0,<2.0 +pytest-expect>=1.1,<2.0 mock ordereddict ; python_version < '2.7' diff --git a/tox.ini b/tox.ini index 74ccd51e..efaea775 100644 --- a/tox.ini +++ b/tox.ini @@ -5,7 +5,7 @@ envlist = {py26,py27,py33,py34,py35,pypy}-{base,optional} deps = flake8 pytest - pytest-expect>=1.0,<2.0 + pytest-expect>=1.1,<2.0 mock base: six base: webencodings From 04ff4c12f4098c9f1260d50e4c613864a5f8c054 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 3 May 2016 14:59:05 +0200 Subject: [PATCH 04/37] assert that after assigning self.charEncoding it's not None --- html5lib/inputstream.py | 1 + 1 file changed, 1 insertion(+) diff --git a/html5lib/inputstream.py b/html5lib/inputstream.py index 5694efe3..27987a8a 100644 --- a/html5lib/inputstream.py +++ b/html5lib/inputstream.py @@ -430,6 +430,7 @@ def __init__(self, source, encoding=None, parseMeta=True, chardet=True): # Detect encoding iff no explicit "transport level" encoding is supplied if (self.charEncoding[0] is None): self.charEncoding = self.detectEncoding(parseMeta, chardet) + assert self.charEncoding[0] is not None # Call superclass self.reset() From 9ba3b280d8548862703076bbbc2b5377718d4c83 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 3 May 2016 15:05:06 +0200 Subject: [PATCH 05/37] Increase encoding pre-scan length to 1024, per spec from 2011(!) 51babfe760a1dbe28c4521b2070e692ac872550a was the spec change. --- html5lib/inputstream.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html5lib/inputstream.py b/html5lib/inputstream.py index 27987a8a..ad5ca7dc 100644 --- a/html5lib/inputstream.py +++ b/html5lib/inputstream.py @@ -421,7 +421,7 @@ def __init__(self, source, encoding=None, parseMeta=True, chardet=True): # Encoding Information # Number of bytes to use when looking for a meta element with # encoding information - self.numBytesMeta = 512 + self.numBytesMeta = 1024 # Number of bytes to use when using detecting encoding using chardet self.numBytesChardet = 100 # Encoding to use if no other information can be found From 06fade8759f3175af9e37bafb638de42c731025f Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 3 May 2016 16:13:26 +0200 Subject: [PATCH 06/37] Move to a single definition of treeTypes for all tests --- html5lib/tests/support.py | 40 +++++++++++++++---- html5lib/tests/test_treewalkers.py | 59 +++++------------------------ html5lib/tests/tree_construction.py | 13 +++++-- 3 files changed, 52 insertions(+), 60 deletions(-) diff --git a/html5lib/tests/support.py b/html5lib/tests/support.py index 56e09c81..54a64a85 100644 --- a/html5lib/tests/support.py +++ b/html5lib/tests/support.py @@ -13,16 +13,24 @@ os.path.pardir, os.path.pardir))) -from html5lib import treebuilders +from html5lib import treebuilders, treewalkers, treeadapters del base_path # Build a dict of available trees -treeTypes = {"DOM": treebuilders.getTreeBuilder("dom")} +treeTypes = {} -# Try whatever etree implementations are available from a list that are -#"supposed" to work +# DOM impls +treeTypes["DOM"] = { + "builder": treebuilders.getTreeBuilder("dom"), + "walker": treewalkers.getTreeWalker("dom") +} + +# ElementTree impls import xml.etree.ElementTree as ElementTree -treeTypes['ElementTree'] = treebuilders.getTreeBuilder("etree", ElementTree, fullTree=True) +treeTypes['ElementTree'] = { + "builder": treebuilders.getTreeBuilder("etree", ElementTree, fullTree=True), + "walker": treewalkers.getTreeWalker("etree", ElementTree) +} try: import xml.etree.cElementTree as cElementTree @@ -33,14 +41,32 @@ if cElementTree.Element is ElementTree.Element: treeTypes['cElementTree'] = None else: - treeTypes['cElementTree'] = treebuilders.getTreeBuilder("etree", cElementTree, fullTree=True) + treeTypes['cElementTree'] = { + "builder": treebuilders.getTreeBuilder("etree", cElementTree, fullTree=True), + "walker": treewalkers.getTreeWalker("etree", cElementTree) + } try: import lxml.etree as lxml # flake8: noqa except ImportError: treeTypes['lxml'] = None else: - treeTypes['lxml'] = treebuilders.getTreeBuilder("lxml") + treeTypes['lxml'] = { + "builder": treebuilders.getTreeBuilder("lxml"), + "walker": treewalkers.getTreeWalker("lxml") + } + +# Genshi impls +try: + import genshi # flake8: noqa +except ImportError: + pass +else: + treeTypes["genshi"] = { + "builder": treebuilders.getTreeBuilder("dom"), + "adapter": lambda tree: treeadapters.genshi.to_genshi(treewalkers.getTreeWalker("dom")(tree)), + "walker": treewalkers.getTreeWalker("genshi") + } def get_data_files(subdirectory, files='*.dat'): diff --git a/html5lib/tests/test_treewalkers.py b/html5lib/tests/test_treewalkers.py index e59f25ea..1d96ff88 100644 --- a/html5lib/tests/test_treewalkers.py +++ b/html5lib/tests/test_treewalkers.py @@ -11,57 +11,12 @@ except AttributeError: unittest.TestCase.assertEqual = unittest.TestCase.assertEquals -from .support import get_data_files, TestData, convertExpected +import pytest -from html5lib import html5parser, treewalkers, treebuilders, treeadapters, constants -from html5lib.filters.lint import Filter as Lint - - -treeTypes = { - "DOM": {"builder": treebuilders.getTreeBuilder("dom"), - "walker": treewalkers.getTreeWalker("dom")}, -} - -# Try whatever etree implementations are available from a list that are -#"supposed" to work -try: - import xml.etree.ElementTree as ElementTree -except ImportError: - pass -else: - treeTypes['ElementTree'] = \ - {"builder": treebuilders.getTreeBuilder("etree", ElementTree, fullTree=True), - "walker": treewalkers.getTreeWalker("etree", ElementTree)} - -try: - import xml.etree.cElementTree as ElementTree -except ImportError: - pass -else: - treeTypes['cElementTree'] = \ - {"builder": treebuilders.getTreeBuilder("etree", ElementTree, fullTree=True), - "walker": treewalkers.getTreeWalker("etree", ElementTree)} +from .support import get_data_files, TestData, convertExpected, treeTypes - -try: - import lxml.etree as ElementTree # flake8: noqa -except ImportError: - pass -else: - treeTypes['lxml_native'] = \ - {"builder": treebuilders.getTreeBuilder("lxml"), - "walker": treewalkers.getTreeWalker("lxml")} - - -try: - import genshi # flake8: noqa -except ImportError: - pass -else: - treeTypes["genshi"] = \ - {"builder": treebuilders.getTreeBuilder("dom"), - "adapter": lambda tree: treeadapters.genshi.to_genshi(treewalkers.getTreeWalker("dom")(tree)), - "walker": treewalkers.getTreeWalker("genshi")} +from html5lib import html5parser, treewalkers, constants +from html5lib.filters.lint import Filter as Lint import re attrlist = re.compile(r"^(\s+)\w+=.*(\n\1\w+=.*)+", re.M) @@ -89,6 +44,8 @@ def test_all_tokens(self): {'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'html'} ] for treeName, treeCls in sorted(treeTypes.items()): + if treeCls is None: + continue p = html5parser.HTMLParser(tree=treeCls["builder"]) document = p.parse("a
b
c") document = treeCls.get("adapter", lambda x: x)(document) @@ -98,6 +55,8 @@ def test_all_tokens(self): def runTreewalkerTest(innerHTML, input, expected, errors, treeClass): + if treeClass is None: + pytest.skip("Treebuilder not loaded") warnings.resetwarnings() warnings.simplefilter("error") try: @@ -164,6 +123,8 @@ def set_attribute_on_first_child(docfrag, name, value, treeName): def runTreewalkerEditTest(intext, expected, attrs_to_add, tree): """tests what happens when we add attributes to the intext""" treeName, treeClass = tree + if treeClass is None: + pytest.skip("Treebuilder not loaded") parser = html5parser.HTMLParser(tree=treeClass["builder"]) document = parser.parseFragment(intext) for nom, val in attrs_to_add: diff --git a/html5lib/tests/tree_construction.py b/html5lib/tests/tree_construction.py index c1125387..b46f1fc9 100644 --- a/html5lib/tests/tree_construction.py +++ b/html5lib/tests/tree_construction.py @@ -13,18 +13,23 @@ class TreeConstructionFile(pytest.File): def collect(self): tests = TestData(str(self.fspath), "data") for i, test in enumerate(tests): - for treeName, treeClass in sorted(treeTypes.items()): + for treeName, treeAPIs in sorted(treeTypes.items()): + if treeAPIs is not None and "adapter" in treeAPIs: + continue for namespaceHTMLElements in (True, False): if namespaceHTMLElements: nodeid = "%d::%s::namespaced" % (i, treeName) else: nodeid = "%d::%s::void-namespace" % (i, treeName) - item = ParserTest(nodeid, self, - test, treeClass, namespaceHTMLElements) + item = ParserTest(nodeid, + self, + test, + treeAPIs["builder"] if treeAPIs is not None else None, + namespaceHTMLElements) item.add_marker(getattr(pytest.mark, treeName)) if namespaceHTMLElements: item.add_marker(pytest.mark.namespaced) - if treeClass is None: + if treeAPIs is None: item.add_marker(pytest.mark.skipif(True, reason="Treebuilder not loaded")) yield item From 0cb9e89af8a22a83f2f6c1933a9f4be3ef113067 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 3 May 2016 16:42:10 +0200 Subject: [PATCH 07/37] Split out each tree construction test into its own collector --- html5lib/tests/tree_construction.py | 51 ++++++++++++++++++----------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/html5lib/tests/tree_construction.py b/html5lib/tests/tree_construction.py index b46f1fc9..9d6ef74b 100644 --- a/html5lib/tests/tree_construction.py +++ b/html5lib/tests/tree_construction.py @@ -13,25 +13,38 @@ class TreeConstructionFile(pytest.File): def collect(self): tests = TestData(str(self.fspath), "data") for i, test in enumerate(tests): - for treeName, treeAPIs in sorted(treeTypes.items()): - if treeAPIs is not None and "adapter" in treeAPIs: - continue - for namespaceHTMLElements in (True, False): - if namespaceHTMLElements: - nodeid = "%d::%s::namespaced" % (i, treeName) - else: - nodeid = "%d::%s::void-namespace" % (i, treeName) - item = ParserTest(nodeid, - self, - test, - treeAPIs["builder"] if treeAPIs is not None else None, - namespaceHTMLElements) - item.add_marker(getattr(pytest.mark, treeName)) - if namespaceHTMLElements: - item.add_marker(pytest.mark.namespaced) - if treeAPIs is None: - item.add_marker(pytest.mark.skipif(True, reason="Treebuilder not loaded")) - yield item + yield TreeConstructionTest(str(i), self, testdata=test) + + +class TreeConstructionTest(pytest.Collector): + def __init__(self, name, parent=None, config=None, session=None, testdata=None): + super(TreeConstructionTest, self).__init__(name, parent, config, session) + self.testdata = testdata + + def collect(self): + for treeName, treeAPIs in sorted(treeTypes.items()): + for x in self._getParserTests(treeName, treeAPIs): + yield x + + def _getParserTests(self, treeName, treeAPIs): + if treeAPIs is not None and "adapter" in treeAPIs: + return + for namespaceHTMLElements in (True, False): + if namespaceHTMLElements: + nodeid = "%s::namespaced" % treeName + else: + nodeid = "%s::void-namespace" % treeName + item = ParserTest(nodeid, + self, + self.testdata, + treeAPIs["builder"] if treeAPIs is not None else None, + namespaceHTMLElements) + item.add_marker(getattr(pytest.mark, treeName)) + if namespaceHTMLElements: + item.add_marker(pytest.mark.namespaced) + if treeAPIs is None: + item.add_marker(pytest.mark.skipif(True, reason="Treebuilder not loaded")) + yield item def convertTreeDump(data): From bd2f09ce9ae9a94d102432c4b9b21dbdde584a1e Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 3 May 2016 16:53:16 +0200 Subject: [PATCH 08/37] Prepare tree construction tests for moving treewalker tests over --- .pytest.expect | 880 ++++++++++++++-------------- html5lib/tests/tree_construction.py | 13 +- 2 files changed, 450 insertions(+), 443 deletions(-) diff --git a/.pytest.expect b/.pytest.expect index c9133f40..dec81a4a 100644 --- a/.pytest.expect +++ b/.pytest.expect @@ -291,443 +291,443 @@ b'html5lib/tests/test_treewalkers.py::test_treewalker::[868]': FAIL b'html5lib/tests/test_treewalkers.py::test_treewalker::[871]': FAIL b'html5lib/tests/test_treewalkers.py::test_treewalker::[965]': FAIL b'html5lib/tests/test_treewalkers.py::test_treewalker::[966]': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::0::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::0::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::0::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::0::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::0::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::0::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::0::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::0::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::1::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::1::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::1::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::1::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::1::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::1::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::1::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::1::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::2::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::2::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::2::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::2::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::2::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::2::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::2::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::2::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::3::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::3::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::3::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::3::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::3::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::3::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::3::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::3::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::4::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::4::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::4::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::4::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::4::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::4::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::4::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::4::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::0::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::0::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::0::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::0::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::0::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::0::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::0::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::0::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::10::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::10::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::10::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::10::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::10::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::10::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::10::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::10::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::12::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::12::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::12::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::12::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::12::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::12::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::12::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::12::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::15::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::15::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::15::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::15::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::15::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::15::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::15::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::15::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::17::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::17::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::17::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::17::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::17::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::17::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::17::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::17::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::1::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::1::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::1::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::1::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::1::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::1::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::1::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::1::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::20::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::20::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::20::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::20::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::20::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::20::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::20::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::20::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::2::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::2::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::2::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::2::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::2::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::2::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::2::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::2::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::3::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::3::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::3::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::3::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::3::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::3::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::3::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::3::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::5::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::5::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::5::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::5::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::5::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::5::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::5::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::5::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::7::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::7::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::7::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::7::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::7::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::7::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::7::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::7::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests11.dat::2::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests11.dat::2::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests11.dat::2::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests11.dat::2::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests11.dat::2::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests11.dat::2::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests11.dat::2::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests11.dat::2::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::6::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::6::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::6::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::6::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::6::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::6::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::6::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::6::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::7::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::7::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::7::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::7::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::7::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::7::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::7::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::7::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::7::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::7::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::7::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::7::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::7::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::7::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::7::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::7::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::lxml::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::1::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::1::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::1::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::1::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::1::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::1::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::1::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::1::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::2::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::2::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::2::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::2::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::2::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::2::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::2::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::2::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::3::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::3::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::3::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::3::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::3::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::3::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::3::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::3::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::4::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::4::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::4::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::4::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::4::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::4::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::4::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::4::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::0::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::0::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::0::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::0::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::0::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::0::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::0::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::0::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::10::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::10::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::10::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::10::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::10::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::10::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::10::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::10::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::12::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::12::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::12::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::12::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::12::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::12::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::12::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::12::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::15::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::15::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::15::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::15::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::15::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::15::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::15::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::15::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::17::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::17::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::17::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::17::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::17::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::17::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::17::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::17::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::1::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::1::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::1::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::1::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::1::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::1::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::1::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::1::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::20::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::20::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::20::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::20::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::20::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::20::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::20::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::20::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::2::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::2::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::2::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::2::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::2::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::2::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::2::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::2::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::3::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::3::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::3::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::3::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::3::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::3::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::3::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::3::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::5::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::5::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::5::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::5::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::5::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::5::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::5::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::5::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::7::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::7::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::7::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::7::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::7::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::7::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::7::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::7::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests11.dat::2::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests11.dat::2::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests11.dat::2::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests11.dat::2::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests11.dat::2::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests11.dat::2::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests11.dat::2::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests11.dat::2::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::181::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::181::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::181::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::181::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::181::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::181::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::181::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::181::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::183::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::183::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::183::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::183::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::183::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::183::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::183::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::183::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::185::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::185::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::185::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::185::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::185::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::185::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::185::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::185::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::84::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::84::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::84::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::84::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::84::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::84::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::84::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::84::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::86::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::86::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::86::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::86::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::86::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::86::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::86::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::86::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::88::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::88::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::88::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::88::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::88::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::88::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::88::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::88::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::18::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::18::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::18::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::18::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::18::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::18::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::18::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::18::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::21::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::21::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::21::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::21::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::21::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::21::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::21::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::21::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::6::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::6::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::6::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::6::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::6::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::6::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::6::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::6::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::7::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::7::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::7::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::7::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::7::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::7::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::7::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::7::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::7::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::7::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::7::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::7::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::7::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::7::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::7::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::7::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::8::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::8::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::8::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::8::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::8::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::8::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::8::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::8::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests5.dat::16::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests5.dat::16::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests5.dat::16::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests5.dat::16::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests5.dat::16::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests5.dat::16::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests5.dat::16::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests5.dat::16::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::lxml::parser::void-namespace': FAIL diff --git a/html5lib/tests/tree_construction.py b/html5lib/tests/tree_construction.py index 9d6ef74b..85188fe1 100644 --- a/html5lib/tests/tree_construction.py +++ b/html5lib/tests/tree_construction.py @@ -1,5 +1,6 @@ from __future__ import absolute_import, division, unicode_literals +import itertools import warnings import re @@ -23,7 +24,8 @@ def __init__(self, name, parent=None, config=None, session=None, testdata=None): def collect(self): for treeName, treeAPIs in sorted(treeTypes.items()): - for x in self._getParserTests(treeName, treeAPIs): + for x in itertools.chain(self._getParserTests(treeName, treeAPIs), + self._getTreeWalkerTests(treeName, treeAPIs)): yield x def _getParserTests(self, treeName, treeAPIs): @@ -31,21 +33,26 @@ def _getParserTests(self, treeName, treeAPIs): return for namespaceHTMLElements in (True, False): if namespaceHTMLElements: - nodeid = "%s::namespaced" % treeName + nodeid = "%s::parser::namespaced" % treeName else: - nodeid = "%s::void-namespace" % treeName + nodeid = "%s::parser::void-namespace" % treeName item = ParserTest(nodeid, self, self.testdata, treeAPIs["builder"] if treeAPIs is not None else None, namespaceHTMLElements) item.add_marker(getattr(pytest.mark, treeName)) + item.add_marker(pytest.mark.parser) if namespaceHTMLElements: item.add_marker(pytest.mark.namespaced) if treeAPIs is None: item.add_marker(pytest.mark.skipif(True, reason="Treebuilder not loaded")) yield item + def _getTreeWalkerTests(self, treeName, treeAPIs): + if False: + yield + def convertTreeDump(data): return "\n".join(convert(3)(data).split("\n")[1:]) From 7556f22800c5ee2df3261a6b950d1f1b221d592c Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 3 May 2016 18:58:04 +0100 Subject: [PATCH 09/37] Move tree construction treewalker tests to tree_construction.py --- .pytest.expect | 280 +--------------------------- html5lib/tests/test_treewalkers.py | 62 +----- html5lib/tests/tree_construction.py | 89 ++++++++- 3 files changed, 90 insertions(+), 341 deletions(-) diff --git a/.pytest.expect b/.pytest.expect index dec81a4a..0cab7521 100644 --- a/.pytest.expect +++ b/.pytest.expect @@ -16,281 +16,6 @@ b'html5lib/tests/test_tokenizer.py::testTokenizer::[5006]': FAIL b'html5lib/tests/test_tokenizer.py::testTokenizer::[5008]': FAIL b'html5lib/tests/test_tokenizer.py::testTokenizer::[5020]': FAIL b'html5lib/tests/test_tokenizer.py::testTokenizer::[5418]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1111]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1112]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1188]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1453]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1465]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1466]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1467]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1691]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1692]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1693]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1694]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1709]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1710]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1713]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1714]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1717]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1718]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1721]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1722]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1725]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1726]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1729]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1730]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1731]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1732]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1738]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1739]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1783]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1784]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1785]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1786]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1787]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1791]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1829]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1830]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1831]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1832]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1834]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1836]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1839]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1841]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1844]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1846]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1849]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2064]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2178]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2180]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2182]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[218]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[219]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[220]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[221]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2275]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2277]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2279]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2341]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2344]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[236]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[237]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[240]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[241]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2438]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2439]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[244]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[245]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[248]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[249]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[252]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[253]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[256]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[257]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2584]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2585]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[258]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[259]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[265]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2661]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[266]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2926]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2938]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2939]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2940]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[310]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[311]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[312]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[313]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[314]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3164]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3165]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3166]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3167]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3182]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3183]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3186]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3187]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[318]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3190]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3191]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3194]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3195]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3198]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3199]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3202]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3203]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3204]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3205]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3211]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3212]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3256]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3257]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3258]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3259]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3260]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3264]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3302]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3303]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3304]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3305]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3307]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3309]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3312]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3314]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3317]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3319]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3322]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3537]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[356]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[357]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[358]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[359]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[361]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[363]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3651]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3653]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3655]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[366]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[368]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[371]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[373]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3748]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3750]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3752]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[376]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3814]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3817]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3911]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3912]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4057]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4058]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4134]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4399]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4411]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4412]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4413]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4637]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4638]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4639]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4640]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4655]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4656]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4659]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4660]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4663]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4664]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4667]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4668]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4671]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4672]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4675]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4676]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4677]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4678]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4684]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4685]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4729]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4730]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4731]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4732]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4733]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4737]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4775]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4776]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4777]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4778]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4780]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4782]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4785]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4787]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4790]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4792]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4795]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5010]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5124]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5126]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5128]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5221]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5223]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5225]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5287]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5290]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5384]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5385]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5530]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5531]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5607]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5872]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5884]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5885]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5886]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[591]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6110]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6111]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6112]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6113]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6128]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6129]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6132]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6133]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6136]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6137]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6140]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6141]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6144]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6145]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6148]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6149]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6150]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6151]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6157]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6158]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6202]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6203]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6204]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6205]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6206]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6210]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6248]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6249]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6250]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6251]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6253]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6255]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6258]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6260]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6263]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6265]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6268]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6483]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6597]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6599]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6601]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6694]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6696]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6698]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6760]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6763]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6857]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6858]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[7003]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[7004]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[705]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[707]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[7080]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[709]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[7345]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[7357]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[7358]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[7359]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[802]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[804]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[806]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[868]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[871]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[965]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[966]': FAIL u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::ElementTree::parser::namespaced': FAIL @@ -453,12 +178,17 @@ u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::lxml::pars u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::DOM::treewalker': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::ElementTree::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::ElementTree::treewalker': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::cElementTree::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::cElementTree::treewalker': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::genshi::treewalker': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::lxml::treewalker': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::1::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::1::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::1::ElementTree::parser::namespaced': FAIL diff --git a/html5lib/tests/test_treewalkers.py b/html5lib/tests/test_treewalkers.py index 1d96ff88..73af7e49 100644 --- a/html5lib/tests/test_treewalkers.py +++ b/html5lib/tests/test_treewalkers.py @@ -1,10 +1,6 @@ from __future__ import absolute_import, division, unicode_literals -import os -import sys import unittest -import warnings -from difflib import unified_diff try: unittest.TestCase.assertEqual @@ -13,9 +9,9 @@ import pytest -from .support import get_data_files, TestData, convertExpected, treeTypes +from .support import treeTypes -from html5lib import html5parser, treewalkers, constants +from html5lib import html5parser, treewalkers from html5lib.filters.lint import Filter as Lint import re @@ -54,60 +50,6 @@ def test_all_tokens(self): self.assertEqual(expectedToken, outputToken) -def runTreewalkerTest(innerHTML, input, expected, errors, treeClass): - if treeClass is None: - pytest.skip("Treebuilder not loaded") - warnings.resetwarnings() - warnings.simplefilter("error") - try: - p = html5parser.HTMLParser(tree=treeClass["builder"]) - if innerHTML: - document = p.parseFragment(input, innerHTML) - else: - document = p.parse(input) - except constants.DataLossWarning: - # Ignore testcases we know we don't pass - return - - document = treeClass.get("adapter", lambda x: x)(document) - try: - output = treewalkers.pprint(Lint(treeClass["walker"](document))) - output = attrlist.sub(sortattrs, output) - expected = attrlist.sub(sortattrs, convertExpected(expected)) - diff = "".join(unified_diff([line + "\n" for line in expected.splitlines()], - [line + "\n" for line in output.splitlines()], - "Expected", "Received")) - assert expected == output, "\n".join([ - "", "Input:", input, - "", "Expected:", expected, - "", "Received:", output, - "", "Diff:", diff, - ]) - except NotImplementedError: - pass # Amnesty for those that confess... - - -def test_treewalker(): - sys.stdout.write('Testing tree walkers ' + " ".join(list(treeTypes.keys())) + "\n") - - for treeName, treeCls in sorted(treeTypes.items()): - files = get_data_files('tree-construction') - for filename in files: - testName = os.path.basename(filename).replace(".dat", "") - if testName in ("template",): - continue - - tests = TestData(filename, "data") - - for index, test in enumerate(tests): - (input, errors, - innerHTML, expected) = [test[key] for key in ("data", "errors", - "document-fragment", - "document")] - errors = errors.split("\n") - yield runTreewalkerTest, innerHTML, input, expected, errors, treeCls - - def set_attribute_on_first_child(docfrag, name, value, treeName): """naively sets an attribute on the first child of the document fragment passed in""" diff --git a/html5lib/tests/tree_construction.py b/html5lib/tests/tree_construction.py index 85188fe1..fda850ed 100644 --- a/html5lib/tests/tree_construction.py +++ b/html5lib/tests/tree_construction.py @@ -1,13 +1,25 @@ from __future__ import absolute_import, division, unicode_literals import itertools -import warnings import re +import warnings +from difflib import unified_diff import pytest from .support import TestData, convert, convertExpected, treeTypes -from html5lib import html5parser, constants +from html5lib import html5parser, constants, treewalkers +from html5lib.filters.lint import Filter as Lint + +_attrlist_re = re.compile(r"^(\s+)\w+=.*(\n\1\w+=.*)+", re.M) + + +def sortattrs(s): + def replace(m): + lines = m.group(0).split("\n") + lines.sort() + return "\n".join(lines) + return _attrlist_re.sub(replace, s) class TreeConstructionFile(pytest.File): @@ -50,8 +62,16 @@ def _getParserTests(self, treeName, treeAPIs): yield item def _getTreeWalkerTests(self, treeName, treeAPIs): - if False: - yield + nodeid = "%s::treewalker" % treeName + item = TreeWalkerTest(nodeid, + self, + self.testdata, + treeAPIs) + item.add_marker(getattr(pytest.mark, treeName)) + item.add_marker(pytest.mark.treewalker) + if treeAPIs is None: + item.add_marker(pytest.mark.skipif(True, reason="Treebuilder not loaded")) + yield item def convertTreeDump(data): @@ -74,7 +94,7 @@ def runtest(self): input = self.test['data'] fragmentContainer = self.test['document-fragment'] - expected = self.test['document'] + expected = convertExpected(self.test['document']) expectedErrors = self.test['errors'].split("\n") if self.test['errors'] else [] with warnings.catch_warnings(): @@ -89,7 +109,7 @@ def runtest(self): output = convertTreeDump(p.tree.testSerializer(document)) - expected = convertExpected(expected) + expected = expected if self.namespaceHTMLElements: expected = namespaceExpected(r"\1", expected) @@ -117,3 +137,60 @@ def repr_failure(self, excinfo): return excinfo.getrepr(funcargs=True, showlocals=False, style="short", tbfilter=False) + + +class TreeWalkerTest(pytest.Item): + def __init__(self, name, parent, test, treeAPIs): + super(TreeWalkerTest, self).__init__(name, parent) + self.obj = lambda: 1 # this is to hack around skipif needing a function! + self.test = test + self.treeAPIs = treeAPIs + + def runtest(self): + p = html5parser.HTMLParser(tree=self.treeAPIs["builder"]) + + input = self.test['data'] + fragmentContainer = self.test['document-fragment'] + expected = convertExpected(self.test['document']) + + with warnings.catch_warnings(): + warnings.simplefilter("error") + try: + if fragmentContainer: + document = p.parseFragment(input, fragmentContainer) + else: + document = p.parse(input) + except constants.DataLossWarning: + pytest.skip("data loss warning") + + poutput = convertTreeDump(p.tree.testSerializer(document)) + namespace_expected = namespaceExpected(r"\1", expected) + if poutput != namespace_expected: + pytest.skip("parser output incorrect") + + document = self.treeAPIs.get("adapter", lambda x: x)(document) + + try: + output = treewalkers.pprint(Lint(self.treeAPIs["walker"](document))) + output = sortattrs(output) + expected = sortattrs(expected) + diff = "".join(unified_diff([line + "\n" for line in expected.splitlines()], + [line + "\n" for line in output.splitlines()], + "Expected", "Received")) + assert expected == output, "\n".join([ + "", "Input:", input, + "", "Expected:", expected, + "", "Received:", output, + "", "Diff:", diff, + ]) + except NotImplementedError: + pytest.skip("tree walker NotImplementedError") + + def repr_failure(self, excinfo): + traceback = excinfo.traceback + ntraceback = traceback.cut(path=__file__) + excinfo.traceback = ntraceback.filter() + + return excinfo.getrepr(funcargs=True, + showlocals=False, + style="short", tbfilter=False) From 8ddd3b983c270cee4f733f4662065495b5f963dc Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 3 May 2016 19:58:05 +0100 Subject: [PATCH 10/37] Generate tokenizer tests from testdata files --- .pytest.expect | 28 ++--- html5lib/tests/conftest.py | 5 + .../tests/{test_tokenizer.py => tokenizer.py} | 103 +++++++++++------- 3 files changed, 85 insertions(+), 51 deletions(-) rename html5lib/tests/{test_tokenizer.py => tokenizer.py} (69%) diff --git a/.pytest.expect b/.pytest.expect index 0cab7521..3133aebe 100644 --- a/.pytest.expect +++ b/.pytest.expect @@ -2,20 +2,20 @@ pytest-expect file v1 (2, 7, 11, 'final', 0) b'html5lib/tests/test_encoding.py::test_encoding::[110]': FAIL b'html5lib/tests/test_encoding.py::test_encoding::[111]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[4718]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[4990]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[4993]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[4994]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[4996]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[4997]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[4999]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[5002]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[5003]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[5005]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[5006]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[5008]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[5020]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[5418]': FAIL +u'html5lib/tests/testdata/tokenizer/test2.test::0::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::228::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::231::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::232::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::234::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::235::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::237::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::240::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::241::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::243::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::244::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::246::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::258::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::656::dataState': FAIL u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::ElementTree::parser::namespaced': FAIL diff --git a/html5lib/tests/conftest.py b/html5lib/tests/conftest.py index b6f0a1cd..811aebbf 100644 --- a/html5lib/tests/conftest.py +++ b/html5lib/tests/conftest.py @@ -1,10 +1,12 @@ import os.path from .tree_construction import TreeConstructionFile +from .tokenizer import TokenizerFile _dir = os.path.abspath(os.path.dirname(__file__)) _testdata = os.path.join(_dir, "testdata") _tree_construction = os.path.join(_testdata, "tree-construction") +_tokenizer = os.path.join(_testdata, "tokenizer") def pytest_collectstart(): @@ -19,3 +21,6 @@ def pytest_collect_file(path, parent): return if path.ext == ".dat": return TreeConstructionFile(path, parent) + elif dir == _tokenizer: + if path.ext == ".test": + return TokenizerFile(path, parent) diff --git a/html5lib/tests/test_tokenizer.py b/html5lib/tests/tokenizer.py similarity index 69% rename from html5lib/tests/test_tokenizer.py rename to html5lib/tests/tokenizer.py index 87e098f3..c6163a1f 100644 --- a/html5lib/tests/test_tokenizer.py +++ b/html5lib/tests/tokenizer.py @@ -1,13 +1,13 @@ from __future__ import absolute_import, division, unicode_literals +import codecs import json import warnings import re +import pytest from six import unichr -from .support import get_data_files - from html5lib.tokenizer import HTMLTokenizer from html5lib import constants, utils @@ -172,27 +172,6 @@ def repl(m): return test -def runTokenizerTest(test): - warnings.resetwarnings() - warnings.simplefilter("error") - - expected = test['output'] - if 'lastStartTag' not in test: - test['lastStartTag'] = None - parser = TokenizerTestParser(test['initialState'], - test['lastStartTag']) - tokens = parser.parse(test['input']) - received = normalizeTokens(tokens) - errorMsg = "\n".join(["\n\nInitial state:", - test['initialState'], - "\nInput:", test['input'], - "\nExpected:", repr(expected), - "\nreceived:", repr(tokens)]) - errorMsg = errorMsg - ignoreErrorOrder = test.get('ignoreErrorOrder', False) - assert tokensMatch(expected, received, ignoreErrorOrder, True), errorMsg - - def _doCapitalize(match): return match.group(1).upper() @@ -205,18 +184,68 @@ def capitalize(s): return s -def testTokenizer(): - for filename in get_data_files('tokenizer', '*.test'): - with open(filename) as fp: +class TokenizerFile(pytest.File): + def collect(self): + with codecs.open(str(self.fspath), "r", encoding="utf-8") as fp: tests = json.load(fp) - if 'tests' in tests: - for index, test in enumerate(tests['tests']): - if 'initialStates' not in test: - test["initialStates"] = ["Data state"] - if 'doubleEscaped' in test: - test = unescape(test) - if test["input"] is None: - continue # Not valid input for this platform - for initialState in test["initialStates"]: - test["initialState"] = capitalize(initialState) - yield runTokenizerTest, test + if 'tests' in tests: + for i, test in enumerate(tests['tests']): + yield TokenizerTestCollector(str(i), self, testdata=test) + + +class TokenizerTestCollector(pytest.Collector): + def __init__(self, name, parent=None, config=None, session=None, testdata=None): + super(TokenizerTestCollector, self).__init__(name, parent, config, session) + if 'initialStates' not in testdata: + testdata["initialStates"] = ["Data state"] + if 'doubleEscaped' in testdata: + testdata = unescape(testdata) + self.testdata = testdata + + def collect(self): + for initialState in self.testdata["initialStates"]: + initialState = capitalize(initialState) + item = TokenizerTest(initialState, + self, + self.testdata, + initialState) + if self.testdata["input"] is None: + item.add_marker(pytest.mark.skipif(True, reason="Relies on lone surrogates")) + yield item + + +class TokenizerTest(pytest.Item): + def __init__(self, name, parent, test, initialState): + super(TokenizerTest, self).__init__(name, parent) + self.obj = lambda: 1 # this is to hack around skipif needing a function! + self.test = test + self.initialState = initialState + + def runtest(self): + warnings.resetwarnings() + warnings.simplefilter("error") + + expected = self.test['output'] + if 'lastStartTag' not in self.test: + self.test['lastStartTag'] = None + parser = TokenizerTestParser(self.initialState, + self.test['lastStartTag']) + tokens = parser.parse(self.test['input']) + received = normalizeTokens(tokens) + errorMsg = "\n".join(["\n\nInitial state:", + self.initialState, + "\nInput:", self.test['input'], + "\nExpected:", repr(expected), + "\nreceived:", repr(tokens)]) + errorMsg = errorMsg + ignoreErrorOrder = self.test.get('ignoreErrorOrder', False) + assert tokensMatch(expected, received, ignoreErrorOrder, True), errorMsg + + def repr_failure(self, excinfo): + traceback = excinfo.traceback + ntraceback = traceback.cut(path=__file__) + excinfo.traceback = ntraceback.filter() + + return excinfo.getrepr(funcargs=True, + showlocals=False, + style="short", tbfilter=False) From a75b120409f1440b3603c3ed8643d1bdc1f9ed3c Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 3 May 2016 20:08:37 +0100 Subject: [PATCH 11/37] Fix new flake8 warning ("not x in" v. "x not in") --- html5lib/tests/test_treewalkers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html5lib/tests/test_treewalkers.py b/html5lib/tests/test_treewalkers.py index 73af7e49..4d216117 100644 --- a/html5lib/tests/test_treewalkers.py +++ b/html5lib/tests/test_treewalkers.py @@ -75,7 +75,7 @@ def runTreewalkerEditTest(intext, expected, attrs_to_add, tree): document = treeClass.get("adapter", lambda x: x)(document) output = treewalkers.pprint(treeClass["walker"](document)) output = attrlist.sub(sortattrs, output) - if not output in expected: + if output not in expected: raise AssertionError("TreewalkerEditTest: %s\nExpected:\n%s\nReceived:\n%s" % (treeName, expected, output)) From 68d6f3466092c608091c03b5cba7e8f7afd7c245 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 3 May 2016 20:19:12 +0100 Subject: [PATCH 12/37] Remove last remanent of unittest from test_treewalkers.py --- html5lib/tests/test_treewalkers.py | 54 +++++++++++++----------------- 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/html5lib/tests/test_treewalkers.py b/html5lib/tests/test_treewalkers.py index 4d216117..045d9d7b 100644 --- a/html5lib/tests/test_treewalkers.py +++ b/html5lib/tests/test_treewalkers.py @@ -1,12 +1,5 @@ from __future__ import absolute_import, division, unicode_literals -import unittest - -try: - unittest.TestCase.assertEqual -except AttributeError: - unittest.TestCase.assertEqual = unittest.TestCase.assertEquals - import pytest from .support import treeTypes @@ -24,30 +17,29 @@ def sortattrs(x): return "\n".join(lines) -class TokenTestCase(unittest.TestCase): - def test_all_tokens(self): - expected = [ - {'data': {}, 'type': 'StartTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'html'}, - {'data': {}, 'type': 'StartTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'head'}, - {'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'head'}, - {'data': {}, 'type': 'StartTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'body'}, - {'data': 'a', 'type': 'Characters'}, - {'data': {}, 'type': 'StartTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'div'}, - {'data': 'b', 'type': 'Characters'}, - {'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'div'}, - {'data': 'c', 'type': 'Characters'}, - {'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'body'}, - {'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'html'} - ] - for treeName, treeCls in sorted(treeTypes.items()): - if treeCls is None: - continue - p = html5parser.HTMLParser(tree=treeCls["builder"]) - document = p.parse("a
b
c") - document = treeCls.get("adapter", lambda x: x)(document) - output = Lint(treeCls["walker"](document)) - for expectedToken, outputToken in zip(expected, output): - self.assertEqual(expectedToken, outputToken) +def test_all_tokens(): + expected = [ + {'data': {}, 'type': 'StartTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'html'}, + {'data': {}, 'type': 'StartTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'head'}, + {'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'head'}, + {'data': {}, 'type': 'StartTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'body'}, + {'data': 'a', 'type': 'Characters'}, + {'data': {}, 'type': 'StartTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'div'}, + {'data': 'b', 'type': 'Characters'}, + {'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'div'}, + {'data': 'c', 'type': 'Characters'}, + {'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'body'}, + {'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'html'} + ] + for treeName, treeCls in sorted(treeTypes.items()): + if treeCls is None: + continue + p = html5parser.HTMLParser(tree=treeCls["builder"]) + document = p.parse("a
b
c") + document = treeCls.get("adapter", lambda x: x)(document) + output = Lint(treeCls["walker"](document)) + for expectedToken, outputToken in zip(expected, output): + assert expectedToken == outputToken def set_attribute_on_first_child(docfrag, name, value, treeName): From c5a800779b5af3d46aa4dbc69a171fdc47906005 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 4 May 2016 00:05:51 +0100 Subject: [PATCH 13/37] Add a better test for encoding prescan length --- html5lib/tests/test_encoding.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/html5lib/tests/test_encoding.py b/html5lib/tests/test_encoding.py index 837e989f..6c996b00 100644 --- a/html5lib/tests/test_encoding.py +++ b/html5lib/tests/test_encoding.py @@ -12,6 +12,15 @@ from html5lib import HTMLParser, inputstream +def test_basic_prescan_length(): + data = "Caf\u00E9".encode('utf-8') + pad = 1024 - len(data) + 1 + data = data.replace(b"-a-", b"-" + (b"a" * pad) + b"-") + assert len(data) == 1024 # Sanity + stream = inputstream.HTMLBinaryInputStream(data, chardet=False) + assert 'utf-8' == stream.charEncoding[0].name + + def runParserEncodingTest(data, encoding): p = HTMLParser() assert p.documentEncoding is None From 1d9f391f6f92677c29803272d9a3e27831a84814 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 4 May 2016 00:06:24 +0100 Subject: [PATCH 14/37] Fix changing encoding to actually change encoding; add test for it --- html5lib/inputstream.py | 2 +- html5lib/tests/test_encoding.py | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/html5lib/inputstream.py b/html5lib/inputstream.py index ad5ca7dc..15acba0d 100644 --- a/html5lib/inputstream.py +++ b/html5lib/inputstream.py @@ -509,8 +509,8 @@ def changeEncoding(self, newEncoding): self.charEncoding = (self.charEncoding[0], "certain") else: self.rawStream.seek(0) - self.reset() self.charEncoding = (newEncoding, "certain") + self.reset() raise ReparseException("Encoding changed from %s to %s" % (self.charEncoding[0], newEncoding)) def detectBOM(self): diff --git a/html5lib/tests/test_encoding.py b/html5lib/tests/test_encoding.py index 6c996b00..3837fe09 100644 --- a/html5lib/tests/test_encoding.py +++ b/html5lib/tests/test_encoding.py @@ -21,6 +21,19 @@ def test_basic_prescan_length(): assert 'utf-8' == stream.charEncoding[0].name +def test_parser_reparse(): + data = "Caf\u00E9".encode('utf-8') + pad = 10240 - len(data) + 1 + data = data.replace(b"-a-", b"-" + (b"a" * pad) + b"-") + assert len(data) == 10240 # Sanity + stream = inputstream.HTMLBinaryInputStream(data, chardet=False) + assert 'windows-1252' == stream.charEncoding[0].name + p = HTMLParser(namespaceHTMLElements=False) + doc = p.parse(data, useChardet=False) + assert 'utf-8' == p.documentEncoding + assert doc.find(".//title").text == "Caf\u00E9" + + def runParserEncodingTest(data, encoding): p = HTMLParser() assert p.documentEncoding is None From b0ae0c2aaa5c2d74602a9dc576f10753f1383882 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 4 May 2016 00:06:48 +0100 Subject: [PATCH 15/37] Ensure we only ever reparse *once* --- html5lib/html5parser.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/html5lib/html5parser.py b/html5lib/html5parser.py index a7cb98be..34f7ac5c 100644 --- a/html5lib/html5parser.py +++ b/html5lib/html5parser.py @@ -89,12 +89,11 @@ def _parse(self, stream, innerHTML=False, container="div", parser=self, **kwargs) self.reset() - while True: - try: - self.mainLoop() - break - except ReparseException: - self.reset() + try: + self.mainLoop() + except ReparseException: + self.reset() + self.mainLoop() def reset(self): self.tree.reset() From bf3e733bbafd5a9d5dfb12c86459a82e68be97fe Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Sun, 8 May 2016 17:57:41 +0100 Subject: [PATCH 16/37] Apply memoization to getPhases; this provides a decent perf gain --- html5lib/html5parser.py | 1 + html5lib/utils.py | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/html5lib/html5parser.py b/html5lib/html5parser.py index 34f7ac5c..b56f6238 100644 --- a/html5lib/html5parser.py +++ b/html5lib/html5parser.py @@ -418,6 +418,7 @@ def parseRCDataRawtext(self, token, contentType): self.phase = self.phases["text"] +@utils.memoize def getPhases(debug): def log(function): """Logger that records which phase processes each token""" diff --git a/html5lib/utils.py b/html5lib/utils.py index c196821f..c70de172 100644 --- a/html5lib/utils.py +++ b/html5lib/utils.py @@ -109,3 +109,15 @@ def moduleFactory(baseModule, *args, **kwargs): return mod return moduleFactory + + +def memoize(func): + cache = {} + + def wrapped(*args, **kwargs): + key = (tuple(args), tuple(kwargs.items())) + if key not in cache: + cache[key] = func(*args, **kwargs) + return cache[key] + + return wrapped From 645ce08f27069c5cad6e68e727f3effd96aaf1b7 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 10 May 2016 10:56:09 -0700 Subject: [PATCH 17/37] Avoid TestData throwing a warning in test_encoding.py --- html5lib/tests/test_encoding.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/html5lib/tests/test_encoding.py b/html5lib/tests/test_encoding.py index 3837fe09..41b888c4 100644 --- a/html5lib/tests/test_encoding.py +++ b/html5lib/tests/test_encoding.py @@ -8,7 +8,7 @@ except AttributeError: unittest.TestCase.assertEqual = unittest.TestCase.assertEquals -from .support import get_data_files, TestData, test_dir, errorMessage +from .support import get_data_files, test_dir, errorMessage, TestData as _TestData from html5lib import HTMLParser, inputstream @@ -56,7 +56,7 @@ def runPreScanEncodingTest(data, encoding): def test_encoding(): for filename in get_data_files("encoding"): - tests = TestData(filename, b"data", encoding=None) + tests = _TestData(filename, b"data", encoding=None) for idx, test in enumerate(tests): yield (runParserEncodingTest, test[b'data'], test[b'encoding']) yield (runPreScanEncodingTest, test[b'data'], test[b'encoding']) From 366ed48da6d6550661cb6d9dcd8d4d1a0b44c645 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 10 May 2016 10:58:37 -0700 Subject: [PATCH 18/37] Change py.test config. Make warnings errors, xpass fail, and document markers. --- pytest.ini | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pytest.ini b/pytest.ini index 6875cc7d..8824977a 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,2 +1,17 @@ [pytest] -addopts = -rXw -p no:doctest +# Output fails, errors, xpass, and warnings; ignore doctest; make warnings errors +addopts = -rfEXw -p no:doctest --strict + +# Make xpass results be considered fail +xfail_strict = true + +# Document our markers +markers = + DOM: mark a test as a DOM tree test + ElementTree: mark a test as a ElementTree tree test + cElementTree: mark a test as a cElementTree tree test + lxml: mark a test as a lxml tree test + genshi: mark a test as a genshi tree test + parser: mark a test as a parser test + namespaced: mark a test as a namespaced parser test + treewalker: mark a test as a treewalker test From 2f04a38038a23ef4f8123481fecae86d31ed6e3b Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 10 May 2016 09:49:51 -0700 Subject: [PATCH 19/37] Update tests --- .pytest.expect | 232 +++++++++++++++++++++++++++++++++++----- html5lib/tests/testdata | 2 +- 2 files changed, 209 insertions(+), 25 deletions(-) diff --git a/.pytest.expect b/.pytest.expect index 3133aebe..5ec37054 100644 --- a/.pytest.expect +++ b/.pytest.expect @@ -176,6 +176,38 @@ u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::cElementTr u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::0::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::0::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::0::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::0::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::0::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::0::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::0::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::0::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::1::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::1::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::1::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::1::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::1::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::1::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::1::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::1::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::2::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::2::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::2::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::2::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::2::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::2::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::2::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::2::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::3::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::3::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::3::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::3::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::3::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::3::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::3::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::3::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::DOM::treewalker': FAIL @@ -221,6 +253,38 @@ u'html5lib/tests/testdata/tree-construction/math.dat::4::cElementTree::parser::n u'html5lib/tests/testdata/tree-construction/math.dat::4::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::4::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::4::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::3::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::3::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::3::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::3::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::3::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::3::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::3::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::3::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::4::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::4::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::4::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::4::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::4::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::4::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::4::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::4::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::5::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::5::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::5::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::5::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::5::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::5::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::5::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::5::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::9::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::9::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::9::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::9::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::9::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::9::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::9::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::9::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::ElementTree::parser::namespaced': FAIL @@ -229,6 +293,126 @@ u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::cEleme u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/ruby.dat::0::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/ruby.dat::0::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/ruby.dat::0::ElementTree::parser::namespaced': FAIL @@ -373,22 +557,30 @@ u'html5lib/tests/testdata/tree-construction/tests16.dat::88::cElementTree::parse u'html5lib/tests/testdata/tree-construction/tests16.dat::88::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/tests16.dat::88::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/tests16.dat::88::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::14::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::14::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::14::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::14::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::14::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::14::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::14::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::14::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::17::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::17::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::17::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::17::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::17::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::17::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::17::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::17::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::7::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::7::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::7::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::7::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::7::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::7::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::7::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::7::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/tests2.dat::6::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/tests2.dat::6::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/tests2.dat::6::ElementTree::parser::namespaced': FAIL @@ -413,14 +605,6 @@ u'html5lib/tests/testdata/tree-construction/tests25.dat::7::cElementTree::parser u'html5lib/tests/testdata/tree-construction/tests25.dat::7::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/tests25.dat::7::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/tests25.dat::7::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/tests5.dat::16::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/tests5.dat::16::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/tests5.dat::16::ElementTree::parser::namespaced': FAIL diff --git a/html5lib/tests/testdata b/html5lib/tests/testdata index 6234baea..8db03d03 160000 --- a/html5lib/tests/testdata +++ b/html5lib/tests/testdata @@ -1 +1 @@ -Subproject commit 6234baeabc51f6d51d1cfc2c4e4656bd99531f2b +Subproject commit 8db03d031c90c8b68273a90aad5168f4161c3078 From 7f2fe0054a31d6097be71fa6ee667a6c8e8f10db Mon Sep 17 00:00:00 2001 From: neumond Date: Thu, 21 Apr 2016 14:41:59 +0300 Subject: [PATCH 20/37] Implement InHeadNoscript context --- .pytest.expect | 173 +++------------------------- html5lib/constants.py | 6 + html5lib/html5parser.py | 120 ++++++++++++++++--- html5lib/tests/tree_construction.py | 16 ++- 4 files changed, 132 insertions(+), 183 deletions(-) diff --git a/.pytest.expect b/.pytest.expect index 5ec37054..14863d43 100644 --- a/.pytest.expect +++ b/.pytest.expect @@ -293,14 +293,6 @@ u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::cEleme u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::ElementTree::parser::namespaced': FAIL @@ -309,46 +301,6 @@ u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::cElementTree::pa u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::ElementTree::parser::namespaced': FAIL @@ -357,54 +309,19 @@ u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::cElementTree::pa u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::DOM::treewalker': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::ElementTree::treewalker': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::cElementTree::treewalker': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::genshi::treewalker': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::lxml::treewalker': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::ElementTree::parser::namespaced': FAIL @@ -509,54 +426,6 @@ u'html5lib/tests/testdata/tree-construction/tests11.dat::2::cElementTree::parser u'html5lib/tests/testdata/tree-construction/tests11.dat::2::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/tests11.dat::2::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/tests11.dat::2::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/tests19.dat::14::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/tests19.dat::14::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/tests19.dat::14::ElementTree::parser::namespaced': FAIL @@ -605,14 +474,6 @@ u'html5lib/tests/testdata/tree-construction/tests25.dat::7::cElementTree::parser u'html5lib/tests/testdata/tree-construction/tests25.dat::7::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/tests25.dat::7::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/tests25.dat::7::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::ElementTree::parser::namespaced': FAIL @@ -637,11 +498,3 @@ u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::cElementTree::pars u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::lxml::parser::void-namespace': FAIL diff --git a/html5lib/constants.py b/html5lib/constants.py index f6e38cbf..2244933c 100644 --- a/html5lib/constants.py +++ b/html5lib/constants.py @@ -283,6 +283,12 @@ "Element %(name)s not allowed in a non-html context", "unexpected-end-tag-before-html": "Unexpected end tag (%(name)s) before html.", + "unexpected-inhead-noscript-tag": + "Element %(name)s not allowed in a inhead-noscript context", + "eof-in-head-noscript": + "Unexpected end of file. Expected inhead-noscript content", + "char-in-head-noscript": + "Unexpected non-space character. Expected inhead-noscript content", "XXX-undefined-error": "Undefined error (this sucks and should be fixed)", } diff --git a/html5lib/html5parser.py b/html5lib/html5parser.py index b56f6238..e6808425 100644 --- a/html5lib/html5parser.py +++ b/html5lib/html5parser.py @@ -22,18 +22,18 @@ def parse(doc, treebuilder="etree", encoding=None, - namespaceHTMLElements=True): + namespaceHTMLElements=True, scripting=False): """Parse a string or file-like object into a tree""" tb = treebuilders.getTreeBuilder(treebuilder) p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) - return p.parse(doc, encoding=encoding) + return p.parse(doc, encoding=encoding, scripting=scripting) def parseFragment(doc, container="div", treebuilder="etree", encoding=None, - namespaceHTMLElements=True): + namespaceHTMLElements=True, scripting=False): tb = treebuilders.getTreeBuilder(treebuilder) p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) - return p.parseFragment(doc, container=container, encoding=encoding) + return p.parseFragment(doc, container=container, encoding=encoding, scripting=scripting) def method_decorator_metaclass(function): @@ -78,11 +78,12 @@ def __init__(self, tree=None, tokenizer=tokenizer.HTMLTokenizer, self.phases = dict([(name, cls(self, self.tree)) for name, cls in getPhases(debug).items()]) - def _parse(self, stream, innerHTML=False, container="div", - encoding=None, parseMeta=True, useChardet=True, **kwargs): + def _parse(self, stream, innerHTML=False, container="div", encoding=None, + parseMeta=True, useChardet=True, scripting=False, **kwargs): self.innerHTMLMode = innerHTML self.container = container + self.scripting = scripting self.tokenizer = self.tokenizer_class(stream, encoding=encoding, parseMeta=parseMeta, useChardet=useChardet, @@ -221,7 +222,8 @@ def normalizedTokens(self): for token in self.tokenizer: yield self.normalizeToken(token) - def parse(self, stream, encoding=None, parseMeta=True, useChardet=True): + def parse(self, stream, encoding=None, parseMeta=True, + useChardet=True, scripting=False): """Parse a HTML document into a well-formed tree stream - a filelike object or string containing the HTML to be parsed @@ -230,13 +232,15 @@ def parse(self, stream, encoding=None, parseMeta=True, useChardet=True): the encoding. If specified, that encoding will be used, regardless of any BOM or later declaration (such as in a meta element) + + scripting - treat noscript elements as if javascript was turned on """ self._parse(stream, innerHTML=False, encoding=encoding, - parseMeta=parseMeta, useChardet=useChardet) + parseMeta=parseMeta, useChardet=useChardet, scripting=scripting) return self.tree.getDocument() def parseFragment(self, stream, container="div", encoding=None, - parseMeta=False, useChardet=True): + parseMeta=False, useChardet=True, scripting=False): """Parse a HTML fragment into a well-formed tree fragment container - name of the element we're setting the innerHTML property @@ -248,8 +252,11 @@ def parseFragment(self, stream, container="div", encoding=None, the encoding. If specified, that encoding will be used, regardless of any BOM or later declaration (such as in a meta element) + + scripting - treat noscript elements as if javascript was turned on """ - self._parse(stream, True, container=container, encoding=encoding) + self._parse(stream, True, container=container, + encoding=encoding, scripting=scripting) return self.tree.getFragment() def parseError(self, errorcode="XXX-undefined-error", datavars={}): @@ -708,7 +715,8 @@ def __init__(self, parser, tree): self.startTagHandler = utils.MethodDispatcher([ ("html", self.startTagHtml), ("title", self.startTagTitle), - (("noscript", "noframes", "style"), self.startTagNoScriptNoFramesStyle), + (("noframes", "style"), self.startTagNoFramesStyle), + ("noscript", self.startTagNoscript), ("script", self.startTagScript), (("base", "basefont", "bgsound", "command", "link"), self.startTagBaseLinkCommand), @@ -717,7 +725,7 @@ def __init__(self, parser, tree): ]) self.startTagHandler.default = self.startTagOther - self. endTagHandler = utils.MethodDispatcher([ + self.endTagHandler = utils.MethodDispatcher([ ("head", self.endTagHead), (("br", "html", "body"), self.endTagHtmlBodyBr) ]) @@ -767,10 +775,17 @@ def startTagMeta(self, token): def startTagTitle(self, token): self.parser.parseRCDataRawtext(token, "RCDATA") - def startTagNoScriptNoFramesStyle(self, token): + def startTagNoFramesStyle(self, token): # Need to decide whether to implement the scripting-disabled case self.parser.parseRCDataRawtext(token, "RAWTEXT") + def startTagNoscript(self, token): + if self.parser.scripting: + self.parser.parseRCDataRawtext(token, "RAWTEXT") + else: + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inHeadNoscript"] + def startTagScript(self, token): self.tree.insertElement(token) self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState @@ -796,10 +811,70 @@ def endTagOther(self, token): def anythingElse(self): self.endTagHead(impliedTagToken("head")) - # XXX If we implement a parser for which scripting is disabled we need to - # implement this phase. - # - # class InHeadNoScriptPhase(Phase): + class InHeadNoscriptPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("basefont", "bgsound", "link", "meta", "noframes", "style"), self.startTagBaseLinkCommand), + (("head", "noscript"), self.startTagHeadNoscript), + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + ("noscript", self.endTagNoscript), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.parser.parseError("eof-in-head-noscript") + self.anythingElse() + return True + + def processComment(self, token): + return self.parser.phases["inHead"].processComment(token) + + def processCharacters(self, token): + self.parser.parseError("char-in-head-noscript") + self.anythingElse() + return token + + def processSpaceCharacters(self, token): + return self.parser.phases["inHead"].processSpaceCharacters(token) + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBaseLinkCommand(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagHeadNoscript(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagNoscript(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "noscript", "Expected noscript got %s" % node.name + self.parser.phase = self.parser.phases["inHead"] + + def endTagBr(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + # Caller must raise parse error first! + self.endTagNoscript(impliedTagToken("noscript")) + class AfterHeadPhase(Phase): def __init__(self, parser, tree): Phase.__init__(self, parser, tree) @@ -910,7 +985,8 @@ def __init__(self, parser, tree): ("isindex", self.startTagIsIndex), ("textarea", self.startTagTextarea), ("iframe", self.startTagIFrame), - (("noembed", "noframes", "noscript"), self.startTagRawtext), + ("noscript", self.startTagNoscript), + (("noembed", "noframes"), self.startTagRawtext), ("select", self.startTagSelect), (("rp", "rt"), self.startTagRpRt), (("option", "optgroup"), self.startTagOpt), @@ -1231,6 +1307,12 @@ def startTagIFrame(self, token): self.parser.framesetOK = False self.startTagRawtext(token) + def startTagNoscript(self, token): + if self.parser.scripting: + self.startTagRawtext(token) + else: + self.startTagOther(token) + def startTagRawtext(self, token): """iframe, noembed noframes, noscript(if scripting enabled)""" self.parser.parseRCDataRawtext(token, "RAWTEXT") @@ -2687,7 +2769,7 @@ def processEndTag(self, token): "beforeHtml": BeforeHtmlPhase, "beforeHead": BeforeHeadPhase, "inHead": InHeadPhase, - # XXX "inHeadNoscript": InHeadNoScriptPhase, + "inHeadNoscript": InHeadNoscriptPhase, "afterHead": AfterHeadPhase, "inBody": InBodyPhase, "text": TextPhase, diff --git a/html5lib/tests/tree_construction.py b/html5lib/tests/tree_construction.py index fda850ed..c6e7ca09 100644 --- a/html5lib/tests/tree_construction.py +++ b/html5lib/tests/tree_construction.py @@ -97,13 +97,17 @@ def runtest(self): expected = convertExpected(self.test['document']) expectedErrors = self.test['errors'].split("\n") if self.test['errors'] else [] + scripting = False + if 'script-on' in self.test: + scripting = True + with warnings.catch_warnings(): warnings.simplefilter("error") try: if fragmentContainer: - document = p.parseFragment(input, fragmentContainer) + document = p.parseFragment(input, fragmentContainer, scripting=scripting) else: - document = p.parse(input) + document = p.parse(input, scripting=scripting) except constants.DataLossWarning: pytest.skip("data loss warning") @@ -153,13 +157,17 @@ def runtest(self): fragmentContainer = self.test['document-fragment'] expected = convertExpected(self.test['document']) + scripting = False + if 'script-on' in self.test: + scripting = True + with warnings.catch_warnings(): warnings.simplefilter("error") try: if fragmentContainer: - document = p.parseFragment(input, fragmentContainer) + document = p.parseFragment(input, fragmentContainer, scripting=scripting) else: - document = p.parse(input) + document = p.parse(input, scripting=scripting) except constants.DataLossWarning: pytest.skip("data loss warning") From 482370391e4786bb36ae413deaa0f55e77563bd8 Mon Sep 17 00:00:00 2001 From: Vitalik Verhovodov Date: Sun, 8 May 2016 02:53:52 +0400 Subject: [PATCH 21/37] Scripting parameter for parse.py (#1) --- .pytest.expect | 37 ------------------------------------- parse.py | 16 ++++++++++------ 2 files changed, 10 insertions(+), 43 deletions(-) diff --git a/.pytest.expect b/.pytest.expect index 14863d43..8bfcf4b7 100644 --- a/.pytest.expect +++ b/.pytest.expect @@ -293,43 +293,6 @@ u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::cEleme u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::DOM::treewalker': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::ElementTree::treewalker': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::cElementTree::treewalker': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::genshi::treewalker': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::lxml::treewalker': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/ruby.dat::0::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/ruby.dat::0::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/ruby.dat::0::ElementTree::parser::namespaced': FAIL diff --git a/parse.py b/parse.py index b9bea288..2245060a 100755 --- a/parse.py +++ b/parse.py @@ -65,11 +65,12 @@ def parse(): if opts.profile: import cProfile import pstats - cProfile.runctx("run(parseMethod, f, encoding)", None, + cProfile.runctx("run(parseMethod, f, encoding, scripting)", None, {"run": run, "parseMethod": parseMethod, "f": f, - "encoding": encoding}, + "encoding": encoding, + "scripting": opts.scripting}, "stats.prof") # XXX - We should use a temp file here stats = pstats.Stats('stats.prof') @@ -79,7 +80,7 @@ def parse(): elif opts.time: import time t0 = time.time() - document = run(parseMethod, f, encoding) + document = run(parseMethod, f, encoding, opts.scripting) t1 = time.time() if document: printOutput(p, document, opts) @@ -88,13 +89,13 @@ def parse(): else: sys.stderr.write("\n\nRun took: %fs"%(t1-t0)) else: - document = run(parseMethod, f, encoding) + document = run(parseMethod, f, encoding, opts.scripting) if document: printOutput(p, document, opts) -def run(parseMethod, f, encoding): +def run(parseMethod, f, encoding, scripting): try: - document = parseMethod(f, encoding=encoding) + document = parseMethod(f, encoding=encoding, scripting=scripting) except: document = None traceback.print_exc() @@ -168,6 +169,9 @@ def getOptParser(): parser.add_option("-f", "--fragment", action="store_true", default=False, dest="fragment", help="Parse as a fragment") + parser.add_option("-s", "--scripting", action="store_true", default=False, + dest="scripting", help="Handle noscript tags as if scripting was enabled") + parser.add_option("", "--tree", action="store_true", default=False, dest="tree", help="Output as debug tree") From 816eaf4eca9112e850a3be77ee0033e73bbb2099 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Sun, 8 May 2016 00:15:16 +0100 Subject: [PATCH 22/37] lxml should only ever return an ASCII string as a str See --- html5lib/treewalkers/lxmletree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html5lib/treewalkers/lxmletree.py b/html5lib/treewalkers/lxmletree.py index 173fa082..36850086 100644 --- a/html5lib/treewalkers/lxmletree.py +++ b/html5lib/treewalkers/lxmletree.py @@ -15,7 +15,7 @@ def ensure_str(s): elif isinstance(s, text_type): return s else: - return s.decode("utf-8", "strict") + return s.decode("ascii", "strict") class Root(object): From 06e1a37f75b3ee50fc01fbed4f58185197df4f38 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Mon, 9 May 2016 22:00:19 -0700 Subject: [PATCH 23/37] Emphasise major changes in changelog, add lxml fix and noscript. --- CHANGES.rst | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index c236de13..62a6a233 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -6,7 +6,7 @@ Change Log Released on XXX -* Added ordereddict as a mandatory dependency on Python 2.6. +* **Added ordereddict as a mandatory dependency on Python 2.6.** * Added ``lxml``, ``genshi``, ``datrie``, ``charade``, and ``all`` extras that will do the right thing based on the specific @@ -16,17 +16,22 @@ Released on XXX * Cease supporting DATrie under PyPy. -* Remove ``PullDOM`` support, as this hasn't ever been properly +* **Remove ``PullDOM`` support, as this hasn't ever been properly tested, doesn't entirely work, and as far as I can tell is - completely unused by anyone. + completely unused by anyone.** * Move testsuite to ``py.test``. -* Fix #124: move to webencodings for decoding the input byte stream; +* **Fix #124: move to webencodings for decoding the input byte stream; this makes html5lib compliant with the Encoding Standard, and - introduces a required dependency on webencodings. + introduces a required dependency on webencodings.** -* Cease supporting Python 3.2 (in both CPython and PyPy forms). +* **Cease supporting Python 3.2 (in both CPython and PyPy forms).** + +* **Fix comments containing double-dash with lxml 3.5 and above.** + +* **Use scripting disabled by default (as we don't implement + scripting).** 0.9999999/1.0b8 From c6bdc743a4305af0f9e88921a03e993b9cbaf45b Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Sun, 8 May 2016 18:02:40 +0100 Subject: [PATCH 24/37] Move the serializer testdata to html5lib-python as impl specific --- html5lib/tests/serializer-testdata/core.test | 125 +++ .../tests/serializer-testdata/injectmeta.test | 66 ++ .../serializer-testdata/optionaltags.test | 965 ++++++++++++++++++ .../tests/serializer-testdata/options.test | 60 ++ .../tests/serializer-testdata/whitespace.test | 51 + html5lib/tests/support.py | 4 +- html5lib/tests/test_serializer.py | 3 +- 7 files changed, 1271 insertions(+), 3 deletions(-) create mode 100644 html5lib/tests/serializer-testdata/core.test create mode 100644 html5lib/tests/serializer-testdata/injectmeta.test create mode 100644 html5lib/tests/serializer-testdata/optionaltags.test create mode 100644 html5lib/tests/serializer-testdata/options.test create mode 100644 html5lib/tests/serializer-testdata/whitespace.test diff --git a/html5lib/tests/serializer-testdata/core.test b/html5lib/tests/serializer-testdata/core.test new file mode 100644 index 00000000..c0b4222d --- /dev/null +++ b/html5lib/tests/serializer-testdata/core.test @@ -0,0 +1,125 @@ +{"tests": [ + +{"description": "proper attribute value escaping", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "test \"with\" ""}]]], + "expected": [""] +}, + +{"description": "proper attribute value non-quoting", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo"}]]], + "expected": [""], + "xhtml": [""] +}, + +{"description": "proper attribute value non-quoting (with <)", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo"], + "xhtml": [""] +}, + +{"description": "proper attribute value quoting (with =)", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo=bar"}]]], + "expected": [""] +}, + +{"description": "proper attribute value quoting (with >)", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo>bar"}]]], + "expected": ["bar\">"] +}, + +{"description": "proper attribute value quoting (with \")", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\"bar"}]]], + "expected": [""] +}, + +{"description": "proper attribute value quoting (with ')", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo'bar"}]]], + "expected": [""] +}, + +{"description": "proper attribute value quoting (with both \" and ')", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo'bar\"baz"}]]], + "expected": [""] +}, + +{"description": "proper attribute value quoting (with space)", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo bar"}]]], + "expected": [""] +}, + +{"description": "proper attribute value quoting (with tab)", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\tbar"}]]], + "expected": [""] +}, + +{"description": "proper attribute value quoting (with LF)", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\nbar"}]]], + "expected": [""] +}, + +{"description": "proper attribute value quoting (with CR)", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\rbar"}]]], + "expected": [""] +}, + +{"description": "proper attribute value non-quoting (with linetab)", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\u000Bbar"}]]], + "expected": [""], + "xhtml": [""] +}, + +{"description": "proper attribute value quoting (with form feed)", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\u000Cbar"}]]], + "expected": [""] +}, + +{"description": "void element (as EmptyTag token)", + "input": [["EmptyTag", "img", {}]], + "expected": [""], + "xhtml": [""] +}, + +{"description": "void element (as StartTag token)", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "img", {}]], + "expected": [""], + "xhtml": [""] +}, + +{"description": "doctype in error", + "input": [["Doctype", "foo"]], + "expected": [""] +}, + +{"description": "character data", + "options": {"encoding":"utf-8"}, + "input": [["Characters", "ac&d"]], + "expected": ["a<b>c&d"] +}, + +{"description": "rcdata", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "script", {}], ["Characters", "ac&d"]], + "expected": [""] +}, + +{"description": "text within "] +} + +]} \ No newline at end of file diff --git a/html5lib/tests/support.py b/html5lib/tests/support.py index 54a64a85..6e6a916b 100644 --- a/html5lib/tests/support.py +++ b/html5lib/tests/support.py @@ -69,8 +69,8 @@ } -def get_data_files(subdirectory, files='*.dat'): - return sorted(glob.glob(os.path.join(test_dir, subdirectory, files))) +def get_data_files(subdirectory, files='*.dat', search_dir=test_dir): + return sorted(glob.glob(os.path.join(search_dir, subdirectory, files))) class DefaultDict(dict): diff --git a/html5lib/tests/test_serializer.py b/html5lib/tests/test_serializer.py index af76075e..c7e9d7ed 100644 --- a/html5lib/tests/test_serializer.py +++ b/html5lib/tests/test_serializer.py @@ -1,5 +1,6 @@ from __future__ import absolute_import, division, unicode_literals +import os import json import unittest @@ -170,7 +171,7 @@ def testEntityNoResolve(self): def test_serializer(): - for filename in get_data_files('serializer', '*.test'): + for filename in get_data_files('serializer-testdata', '*.test', os.path.dirname(__file__)): with open(filename) as fp: tests = json.load(fp) for index, test in enumerate(tests['tests']): From b7a37d296562392170a406cf611adaf2821c9390 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Sun, 8 May 2016 18:12:26 +0100 Subject: [PATCH 25/37] Reindent serializer testdata --- html5lib/tests/serializer-testdata/core.test | 552 ++- .../tests/serializer-testdata/injectmeta.test | 444 +- .../serializer-testdata/optionaltags.test | 4219 +++++++++++++---- .../tests/serializer-testdata/options.test | 265 +- .../tests/serializer-testdata/whitespace.test | 249 +- 5 files changed, 4462 insertions(+), 1267 deletions(-) diff --git a/html5lib/tests/serializer-testdata/core.test b/html5lib/tests/serializer-testdata/core.test index c0b4222d..0f3092bb 100644 --- a/html5lib/tests/serializer-testdata/core.test +++ b/html5lib/tests/serializer-testdata/core.test @@ -1,125 +1,427 @@ -{"tests": [ - -{"description": "proper attribute value escaping", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "test \"with\" ""}]]], - "expected": [""] -}, - -{"description": "proper attribute value non-quoting", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo"}]]], - "expected": [""], - "xhtml": [""] -}, - -{"description": "proper attribute value non-quoting (with <)", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo"], - "xhtml": [""] -}, - -{"description": "proper attribute value quoting (with =)", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo=bar"}]]], - "expected": [""] -}, - -{"description": "proper attribute value quoting (with >)", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo>bar"}]]], - "expected": ["bar\">"] -}, - -{"description": "proper attribute value quoting (with \")", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\"bar"}]]], - "expected": [""] -}, - -{"description": "proper attribute value quoting (with ')", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo'bar"}]]], - "expected": [""] -}, - -{"description": "proper attribute value quoting (with both \" and ')", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo'bar\"baz"}]]], - "expected": [""] -}, - -{"description": "proper attribute value quoting (with space)", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo bar"}]]], - "expected": [""] -}, - -{"description": "proper attribute value quoting (with tab)", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\tbar"}]]], - "expected": [""] -}, - -{"description": "proper attribute value quoting (with LF)", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\nbar"}]]], - "expected": [""] -}, - -{"description": "proper attribute value quoting (with CR)", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\rbar"}]]], - "expected": [""] -}, - -{"description": "proper attribute value non-quoting (with linetab)", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\u000Bbar"}]]], - "expected": [""], - "xhtml": [""] -}, - -{"description": "proper attribute value quoting (with form feed)", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\u000Cbar"}]]], - "expected": [""] -}, - -{"description": "void element (as EmptyTag token)", - "input": [["EmptyTag", "img", {}]], - "expected": [""], - "xhtml": [""] -}, - -{"description": "void element (as StartTag token)", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "img", {}]], - "expected": [""], - "xhtml": [""] -}, - -{"description": "doctype in error", - "input": [["Doctype", "foo"]], - "expected": [""] -}, - -{"description": "character data", - "options": {"encoding":"utf-8"}, - "input": [["Characters", "ac&d"]], - "expected": ["a<b>c&d"] -}, - -{"description": "rcdata", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "script", {}], ["Characters", "ac&d"]], - "expected": [""] -}, - -{"description": "text within "] -} - -]} \ No newline at end of file +{ + "tests": [ + { + "expected": [ + " foo" + ], + "input": [ + [ + "Characters", + "\t\r\n\f foo" + ] + ], + "description": "bare text with leading spaces", + "options": { + "strip_whitespace": true + } + }, + { + "expected": [ + "foo " + ], + "input": [ + [ + "Characters", + "foo \t\r\n\f" + ] + ], + "description": "bare text with trailing spaces", + "options": { + "strip_whitespace": true + } + }, + { + "expected": [ + "foo bar" + ], + "input": [ + [ + "Characters", + "foo \t\r\n\f bar" + ] + ], + "description": "bare text with inner spaces", + "options": { + "strip_whitespace": true + } + }, + { + "expected": [ + "
\t\r\n\f foo \t\r\n\f bar \t\r\n\f
" + ], + "input": [ + [ + "StartTag", + "http://www.w3.org/1999/xhtml", + "pre", + {} + ], + [ + "Characters", + "\t\r\n\f foo \t\r\n\f bar \t\r\n\f" + ], + [ + "EndTag", + "http://www.w3.org/1999/xhtml", + "pre" + ] + ], + "description": "text within
",
+            "options": {
+                "strip_whitespace": true
+            }
+        },
+        {
+            "expected": [
+                "
\t\r\n\f foo \t\r\n\f bar \t\r\n\f
" + ], + "input": [ + [ + "StartTag", + "http://www.w3.org/1999/xhtml", + "pre", + {} + ], + [ + "Characters", + "\t\r\n\f fo" + ], + [ + "StartTag", + "http://www.w3.org/1999/xhtml", + "span", + {} + ], + [ + "Characters", + "o \t\r\n\f b" + ], + [ + "EndTag", + "http://www.w3.org/1999/xhtml", + "span" + ], + [ + "Characters", + "ar \t\r\n\f" + ], + [ + "EndTag", + "http://www.w3.org/1999/xhtml", + "pre" + ] + ], + "description": "text within
, with inner markup",
+            "options": {
+                "strip_whitespace": true
+            }
+        },
+        {
+            "expected": [
+                ""
+            ],
+            "input": [
+                [
+                    "StartTag",
+                    "http://www.w3.org/1999/xhtml",
+                    "textarea",
+                    {}
+                ],
+                [
+                    "Characters",
+                    "\t\r\n\f foo \t\r\n\f bar \t\r\n\f"
+                ],
+                [
+                    "EndTag",
+                    "http://www.w3.org/1999/xhtml",
+                    "textarea"
+                ]
+            ],
+            "description": "text within