From 8e65f68994ce422535e6dd61c75a7b02074012a9 Mon Sep 17 00:00:00 2001 From: Taka Date: Thu, 27 Apr 2017 04:49:07 +0000 Subject: [PATCH] Added some tests using synthetic data files. --- asl_cards/parse.py | 4 +- asl_cards/tests/_test_case_base.py | 39 ++++++++++ asl_cards/tests/synthetic-data/1-card.doc | Bin 0 -> 26624 bytes asl_cards/tests/synthetic-data/1-card.pdf | Bin 0 -> 16133 bytes asl_cards/tests/synthetic-data/2-cards.doc | Bin 0 -> 26624 bytes asl_cards/tests/synthetic-data/2-cards.pdf | Bin 0 -> 16627 bytes asl_cards/tests/synthetic-data/3-cards.doc | Bin 0 -> 27136 bytes asl_cards/tests/synthetic-data/3-cards.pdf | Bin 0 -> 18060 bytes .../tests/synthetic-data/bad-spacing.doc | Bin 0 -> 26624 bytes .../tests/synthetic-data/bad-spacing.pdf | Bin 0 -> 17547 bytes asl_cards/tests/synthetic-data/empty.doc | Bin 0 -> 26112 bytes asl_cards/tests/synthetic-data/empty.pdf | Bin 0 -> 10258 bytes asl_cards/tests/synthetic-data/null.pdf | 0 asl_cards/tests/test_real_data.py | 29 ++------ asl_cards/tests/test_synthetic_data.py | 67 ++++++++++++++++++ 15 files changed, 113 insertions(+), 26 deletions(-) create mode 100755 asl_cards/tests/_test_case_base.py create mode 100755 asl_cards/tests/synthetic-data/1-card.doc create mode 100755 asl_cards/tests/synthetic-data/1-card.pdf create mode 100755 asl_cards/tests/synthetic-data/2-cards.doc create mode 100755 asl_cards/tests/synthetic-data/2-cards.pdf create mode 100755 asl_cards/tests/synthetic-data/3-cards.doc create mode 100755 asl_cards/tests/synthetic-data/3-cards.pdf create mode 100755 asl_cards/tests/synthetic-data/bad-spacing.doc create mode 100755 asl_cards/tests/synthetic-data/bad-spacing.pdf create mode 100755 asl_cards/tests/synthetic-data/empty.doc create mode 100755 asl_cards/tests/synthetic-data/empty.pdf create mode 100644 asl_cards/tests/synthetic-data/null.pdf create mode 100755 asl_cards/tests/test_synthetic_data.py diff --git a/asl_cards/parse.py b/asl_cards/parse.py index 43de795..566e264 100644 --- a/asl_cards/parse.py +++ b/asl_cards/parse.py @@ -116,8 +116,8 @@ class PdfParser: page_pos = 0 if items[0].y0 > lt_page.height/2 else 1 return AslCard( card_tag = _tidy( item_texts[0] ).replace( "# ", "#" ) , - nationality = _tidy( item_texts[1] ) , - name = _tidy( item_texts[2] ) , + nationality = _tidy(item_texts[1]) if len(item_texts) > 1 else "" , + name = _tidy(item_texts[2]) if len(item_texts) > 2 else "" , page_id = lt_page.pageid , page_pos = page_pos , ) diff --git a/asl_cards/tests/_test_case_base.py b/asl_cards/tests/_test_case_base.py new file mode 100755 index 0000000..74c10d7 --- /dev/null +++ b/asl_cards/tests/_test_case_base.py @@ -0,0 +1,39 @@ +import sys +import os +import unittest + +base_dir = os.path.split( __file__ )[ 0 ] + +sys.path.append( "../.." ) # fudge! need this to allow a script to run within a package :-/ +from asl_cards.parse import PdfParser + +# --------------------------------------------------------------------- + +class TestCaseBase( unittest.TestCase ) : + """Base for all test classes.""" + + def _test_pdf_parser( self , fname , expected_cards ) : + # parse the specified PDF + fname2 = os.path.join( base_dir , fname ) + if not os.path.isfile( fname2 ) : + raise RuntimeError( "Missing data file: {}".format( fname2 ) ) + pdf_parser = PdfParser( + #progress = lambda _,msg: print( msg , file=sys.stderr , flush=True ) + ) + cards = pdf_parser.parse( fname2 , images=False ) + if False : + for c in cards : + print(c) + # check the results + if len(cards) != len(expected_cards) : + raise RuntimeError( "{}: got {} cards, expected {}.".format( fname , len(cards) , len(expected_cards) ) ) + if len(cards) == 0 : + return + # get the attributes we're interested in + card = expected_cards[0] + attrs = [ a for a in dir(card) if not a.startswith("_") and not callable(getattr(card,a)) ] + attrs.remove( "card_image" ) # this is messing things up :-/ + # compare the extracted cards with the expected results + for i in range(0,len(cards)) : + if not all( getattr(cards[i],a) == getattr(expected_cards[i],a) for a in attrs ) : + raise RuntimeError( "{}: Card mismatch ({}): got {}, expected {}.".format( fname , i , cards[i] , expected_cards[i] ) ) diff --git a/asl_cards/tests/synthetic-data/1-card.doc b/asl_cards/tests/synthetic-data/1-card.doc new file mode 100755 index 0000000000000000000000000000000000000000..5b52de6e802f9231843372bfb5cc93a23176dcc8 GIT binary patch literal 26624 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 literal 0 HcmV?d00001 diff --git a/asl_cards/tests/synthetic-data/1-card.pdf b/asl_cards/tests/synthetic-data/1-card.pdf new file mode 100755 index 0000000000000000000000000000000000000000..02c8f3baeabd5c414da77b5a20bd8f92865f20c6 GIT binary patch literal 16133 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 literal 0 HcmV?d00001 diff --git a/asl_cards/tests/synthetic-data/2-cards.doc b/asl_cards/tests/synthetic-data/2-cards.doc new file mode 100755 index 0000000000000000000000000000000000000000..e40958b1702520ce486ebb446e49e494bef9d90c GIT binary patch literal 26624 zcmeHP2V7H0x1WTBULpb_phk*fp$P(_2q>(eB8Z3uTYvz;kRZ*9qJjn26&q_|6%o4# zyNV4PqF_aA6x~%stSfG8AZy7xC*f+0vX*b(@9oQUlAu@Nvhyjkv3R1@Mk5RY_=nQxWj# zp!aEW{FhL3NWZ~=kZcg_-M^aFG&Adv}BDon*oBL9X5rI%7g zwHM~o9hm-DNEu4yFVB~zYWXRjo(fa_k)kbYkj7B?e=Z%RU!GESmgmcdDg9LY%G1xq z%cuXl!c=?7m-lmFs=QxIThfbTvlNo}%jUgk&*VSK!nRq^0aHp?VFFSl^M>ra_4iqY8YVijAejL`vF8i9>}l zp)nzm#G|gnCma-+8jlV9VJ(pZEBbf!CfeAJcL6T|G)UYE&=oKQ;0N#r3L* z*dVQh^!a}h_(8S=-^&L6Hb2!DuC0G0g!M`GmB|KS4JHXr`aQMXkd9ODr(`gU(IMAf#g=p+(YqRxk-o zDbm6WLl!PU8UzQy|9CK?)Jg}Z|Fg^`qy4|61r^m$SU_O`g#{EAP*^}=0fhw=7Eo9~ zVF85&6c$ie;PV!UVz7uVoZ``-=@1n-^Mn6jpAxr)$tu9Q&%hD36F-MU*fIJXTGG)M zWLt{+-{5bB`ciuFYdz&}iSGY`H1e{Mu(#+9kmvt5hV!AjVZD0*48fMiAY2Zp0f+$5 z6$uN#2G|1J0sepqfEYkBARW+>9O|`%K2!zvz7JqS+HcYG-!A72wi^j}2~Y)l8Ulg< zGXZR9CclA7#2+veFy5QSi1t=v2mo<_cmO0J1EJZTi0MEzSs(>F&hQgiFFf zcLHdShm!h(KNb)ndB(u^9ya+7N+5t(bOD6t{!F|ZsAfB<7F%Ua5(p9@pn(giKP;~a zk$j(d_vz)`#~8^s7&_4aC6;6&`?U ztozw2YDtQN+Uc8NWtB>Jw{t~mCUscSf@{&wu-!bal`q)hO z`FHnPKK}m23Gd7&C(09=x@ver;@bXhXCrSVx*nZ1=X7e$77NwjDKYalPQP9-{*eF0jeXAB8E^95Yr9fc zXF;{!p@3ce!Y-a>T^i_h-66z$)|RD{##eS&wXSWAfe1Z#qji=#jS7poQfNo zWOg+@HMih5c11zAs~!L7{@b_%=25PT28_6Wxv@*F*YDjrsneZ5UHFWG+}aFy0r(rk zm#rs_6Ng;MoRMn_f9oyYSnU=j9IwSax#cxMhx2X}NvPb(?O#61VTLZAazf zQq6X{9lQ8l8}}yme1G#NQ{9*6*Zyl z4WlL7{L1~8KX;6+bydz=xNO?7h>$Fw))A>i$|?zq(}z`a>Fq))8j}5vEtyw$TRE(Q zaoo#-Yf+(b)kVhXC!Owz7MF$ZD|}d^b*gs6J<*$PxmV{ca>`n8v2KEPZo6xLL|oB0 zwQ6_$z?VkHDx=!Ym^UZVGJDW&!)KmWX$6KiZ)fWet+0_78QXXRORDBuKCYc&Zdsuz zaw*!>ws+mx10Bz6_>3R(Djd|U^V!pjZLUrkRU-bgxbxB1uc!88U5e;bw#a7v>xM_C7v=SR z^QLfszQ}j>0Pf5563^_lb*lBx4E5}TCRubgn{-6KSoQMLwDaaGoQu{BV!m0IX7c=e zm+;k-O?tVUD5z;iyR%V!N>c2FR#R9D7iQ~cPR_2PJ&rAN851~~GvHa*)l;2)jz`@M z2`H%#oiXxc;iA^1M-Tg`C)n!@8t_EmX=2xCI7Cm|r=Q-XxYx<)>h+HU9#$p%_~)EK zeS_{>d$k+f&9_I6S?4w3i}vy~XRZ!w!uud68D+i<|)WbaW0cQZ)RpdmMl{D1EH+mW-I ze_o`Q);{p!q1nA`%=W$Xa5_F|bZWbD^RA(8=_;&j!}>|XnK$nU=G~txQW|1#@Rhd3 z4~2et%KLct7dU9JT;5=nx6yw|wC0#Gz2?zh*8X0qzx2gkgIeFJ z<=cC3UU@c+P3b)-wi*VMTq z8nyOzakPp(l;6MouoC5{GpDq8Yr@oCd6v)jI9!&g?K3H4pxKmj4-d}OU^-4ruX$*; zJ=-H?SY-b1>pJP4`99uq=ot%>N9STJq8HEaG`2dFGpvIl-!*+?{nKOGdG~L<9^;>G zSLhq5y}s8*eczg$=Yn>Hd3w}Wa)K)R{j@sxw*}z?e=5%PZ#%;|&q&jtB1M_uah)DC zF7?@ga4nVA=e)D(1&ud;wJOnQ^T4$2t>m!2m!@5KwN;S0qBQM*T5{Dk(bB$kKZO+N z?#t-(O8M8a+MFJRCG^AtjWx__{vnAz)!IJ#_CYh@ zgDx~!4_d}e8SJ_8#L8{@(>=A-j2{~9-`<$0`(%Pp_?4(W9> z(56VhA*<0SJ;9M@RYq0U$Sv9UGkP&^G5+pDjCm za*;z~IH$BCk-uSE(eBQ}^yZZ`d6YPp%(&EbRzmH@={5JQ_TOA@YvF5K!wZvD zeUj_;nVi407%yRbJm1i|n7)25#2CX%y0hGyOgi_Fypm;J#?5mPU-jd*dMS-_CaVgC zmk+X*cKU5WdF~aZl)9c;j&9~dAJuE^>aJ=%pL1k2ukgp8PPY#2al!Y*hKJ!MD##j59EO_Y$EtL zp`oxQffUUiiUaXd&bu`B6vv)Q<3Mp7C{9m`)05&jQXEH9b|jxCmC342ZL|KHJ9(Vu~dI147 z?|@-<(*6l5m0n~LljP)N(un!!5V~j?M6ige2xO%~u*TLQN+Meb>kx*>Qo>ggNlFEN zSw|=85;+1gSV&CY52$W4p9Xxm`bCBj4N-gW9)*&z$XP5O5yMlJFqEJ^#7&7N$-9*Z z1tifx{Q)BZF9FD80yF?Y02Nq8NWqYp0ulh1^)8m;ZU)hOu7<7 z+?CXLOd-e6r066W0S$y@el%=4#1Y(f;6i?E*q9JXHcJE$-xKuE36n{q(^Qn{Ozc|d zsKTQ^86U&QRFDY)N!((wx0d9tq0FG8ljPq26S;dxwi%?`GEPz%9VQAWfefA867MAL zREgK4X~6Y|jS@bTIz%E1mztzCWiX+p%2K%+u{puMCULTISVG*`;6N>X;TeyIafvB3 zubt`wLn11t!|_~6KKj*x^VtAhfV9K(z?2Xt?T!qhln#l>hg{^KdqN|UA4PMKrA)>1 z3oVev%wp~#d&unBy0#yR;7=9tpE#f<5)w~L}DG9syX=U zU@U+OR14vY~TkfeNa zN&YFpw=gs*!yqE>(Bw6#>z_9HMY47*RVCdz@28-EVms`R z7{);islq8Nps;|#0tyQ#ETFJ}!U75lC@i3`fWiU_3n(n`cUs`D*8lXY=dWg38?%=G z2@EI|YDy1m6STPYsY209@Z^0&xAF1HkqB zP5>Uu*aN`z{viPBJ`MQPx*pfX$d_F=3JWMKps;|#0tyQ#ETFJ}!UF#u3*cIqT2tfqb6m&c zau~nc<9BfU+wS;{9@p=3+|dR`BJf4msi^tkTFZ{=+PMgX{h zA-O+-m#R>v15h@gBfu131~3O$05HBYP)k4;KvzIFKzD!@0OQ{PY@7WUMkw6ZTL6!f z3E_|mn|Mj?z{SE*v9ECkaJrAm758D3)vz~7&wc>;P7-K-_;0C`{AFxB>yX^c^OPL) z;xvc8o~RT0yZo^nU!p;BXbn3rI6Ik}byCjPJ+&c!8i?R;=1cR(y)o*qH;(}8$HHAc zPoSZ2OA(LzQFjr)q$Ea=KUy4rw_ln+>czj?kB$k412I>;e~E4H1G$Gw%7mPFIF5&R zBU^Ts-(Y{-a-$9@GC!*M*OkW^^2c!t>yEDFlD?1Wgx==*)8NP=9;l2VesKIS>V2Xw z^y$LrDa~2>{6ev>{FVK+)^Ew5(ujRmF?PyY@W0DXgVu-Z#gaZOKX&6g_>*Vd*u9*r v;N-qN+fx{t5DlmCCCB)Dhv7LmU`c*k=(ncgt)0p9UcXGDI-P?4V=VALY)5O> literal 0 HcmV?d00001 diff --git a/asl_cards/tests/synthetic-data/2-cards.pdf b/asl_cards/tests/synthetic-data/2-cards.pdf new file mode 100755 index 0000000000000000000000000000000000000000..25ebe1b990cae0860e3a95b87f346ff3a344a00f GIT binary patch literal 16627 zcmcJ12Rxixx3^KFljwrcBHD~mMv2}#(Q6O}qcfxTAc7Dj1kpJAU&M6!8}kK$uBH~+DHV_!VP(~C4_i9c&w~)8uHhhigz{V zFGtbwc7XxGG8RY+2WJ}~SkuA=h5(|L57ffDZm3##JG&!M+B?}ez^;0KBda-E!N9r* zn7XsmFA5NX2Ude2Ev!(YfGAs`1pMhr(0`rqS~7~;3T`3o>;*LDL3KkRyg)%=UQ;}j zS&$Y;7?20W*00is6ypX7Ia$ZOU?dzc^ zQP&HQcSa4r+PL480n4D;D2WK5;P0egu71`2J#t`9Hb`3_%0p4xA`f>!!rXvhc?Xn6 zvM@{3s;|xJ2D5O)^Ge&%Q*j>UA)(NG0JuN58{#~v2s!rp-oWH4WfIBcnw6$(j9Zl0 z@I5eM|BiLK!jz*Ys}5Xn*y*@x{o)Q^!pc2MWjk{Yy0evqyz{-Ws^$4H!`0^xp_o=# zDX)&E7%w{2IXhzD5XA)XgRF1g7ef6Vo-k`Z(fOE~tK3Z$f)~(OmV&dU`<&y=THexx z>_PGQsE#i(mPM(bmD@?@X1O}!H*ORZX?SR&tqd2`l{!C8CQUZ~|kNgsF)ySvEHe|~+!50k^Pv9HWHgCm z!{l!7rL?UaEPQaa!ldyXF9)B?@aOw{_C(6mss#Cor;*pV-4z=%W#P^raZ14`@ItCu zXjTxw%DbGF{WEs15zBVj#h78An|Jv3kh?9l7@%|$n?!mY8!vNcntf>q!?~&~IcK0P zG|?z(%nQuuK-fP%h$^&X4%X~wQ~7LGr6L^{vJ+)rv6o-}l8FjY?q z<74*JRPiMm8mZw{){?2u!g1@5F#%A zYb@j{s(%HQv;_io6^vkIEj1M_LrxhB2lzubIQWVt3qx4C!CjEfZa~Oyc~Qq%*9m?V zYrw0A2PzD&C%WRrLq((;0x4r_fno-$TKuZ=3W4?ER!CcfF_4!R3gqJv1oH6-00npj zP;Fr#pD+Yf7yP4rMZfx>k|dB{@TyM$$j2{?cQsA`DhNb9Bd_~VnHVS}fZ{_vBlrb{ zfdc&eKz<=qKZne(deY9t<5 z36hS`!*q)oooF=D<3$vLjyvjT)aB=ck}hDTO|=z zrN<=pPQD$SxJIez)%z)HhqV5vaP;w!S*)3K`cdn2`A5q)(qd8pG65l`(Z2KnGV zJ<86V@RChHK;5CRytp)lq^OKW!f89XC-Ph6@b~w#X?=&)qneTPj&GCIJK z+r)~5d19XS_T!F*qgPnEXG==#*g9hPdz%)Dk=z4qQYdi_=SPxqv;c3D7J7n9@!M_n zv&6^WSiqhA_355Y6ikdgwxis1Lnvmd6KfH3BvBiUDex5+vV``XL;TT)sHP@5+pEvN zhE>2z9gp1S%-@*WG1m+mKy)2dxueMqItNlrXf}F!IPxd1M~Ys+$xgkW6M{}kU=HN~0;%SVFQ*Z%xz}xZzd&vxcl`{ltE|T;50=qacSg~jKCy-2Hk-usoyq%D2_O4%HA@s zSV5d4$;_;4fKzjRMmL=8V<%osEge&bO!-M7=KG6CC0w}8Iw@kjH7{@Cq?X&{_JOB2 z<)c6lQMGqSh2p*Ba@``-LVg9&g6Kc96I4#F{RAvFEhM?MD2nk(WrPy?R={R>dlO9O@IYBlX>{i`{z_ zq4lbRpShD)rfpAn@x<>-k%hB|v|;eMoIA7n9%l&0>aFJr7i$M($=oa8$ISc=BD7~9 z2q6>YG$xh2-NUL4qV|u~lE$|83&k+S$x_BU%c7@@Qs>vGv)9IBpzvB4IOQyn=4*Mg z(Njzd!SWk53n7FS;7q+D@%yid^=UO`KDT?~_y}aLQGamQixmapN@BLi6%W5`0GGZ= zlC*_3Z&BE75MlKNKc4$~nZ1MWbHNlhr+Z|o()9)+t%mO_!#CaOosUSLtL=Z6;-8qv zKeCo0P%r%Ec=RxAqodTH)Mx)`Os!1p0yZdPih{CGb4GV$?gie(G!fQ~2*px#dsuYI zO>=VSFtX4#?{ZFtRJvBhms~4EXLqwe)^21Es_b))<-m6U1x%AoQp8P9;@s)}K&DF2 z>*#OJ_%fq(N5%Kuw4nm|J2sx;2?clYDU=fYUzb7-jZzY3$9{$+67VDY!v$r@cV{7Ol(+{V4N`CZID-Aj` z$x!lZJaydNv|g9Waojd=H`3O)SI5mj(!k$Q&GSf)9^k{T*u~=+8scN_WR9M{{8omw z_Ji0sy|vkNZHcLy4dN;PVgZvE13thjGm~vX>-y4b@Rp@Wt7WPoWO`(&UXL zbkTXx=9H6AbA1hcw31Sw7+>?4EBBap1&ov{BJxn~Ch~zdo5c&(SDVod$xveKP=;4W z-drq+@U3GHQSTy;xLH8s%ilOs`F>~yI35BOh~Uhq1s%hQ%qk0`i|)h0I|hc6 zN-E4n7M^{{n*6o72hsa4i6wpEPuu!vFpgX%f@1bmOPE4J>Bn}& zy_edZcEU?wD+=GA)Ff-!1|>5JYRiZwD~SgeX!j<{$nf0bFC)kJ(Ry}K<0OLHt`72W zaiyo6sTXTe@RnkPU(@IXljR|-lS zH&<-R-a3Pxj+-C~M8%V+Fq1=n;i{b?-*WX>tNseLy;nm+=V9JaV1-aFKTx9B#gHjrrSh>Zu z$ca$GP4e7Gmzct$fRq5xcazgP#Wkh~d@yB%iC3KqVsWXpJ1hkM9wii1Vq#FogRod) z3dU!q#0DLjY}5_9WiLwihehJEQsRMRL71Ssl(H1aCs9%$?7GwVs05R=g(U_Pzm|^q z`qQ+iPj#oyqncdz^+Do`OO~L^)(!=e+v`g*An}DIf6(0Wk|}6zamf)hx3r`Ny6o%7 ztn&(qnyB}Rj?%C93X6JC?-db6S%1n*8Mv^71Zdb+x@QF^+# z-lLRQTY`c-5U!k*Z(a78K~8H+cR&FjJ3t_(l_hLY+4_S;7Ma zGNk z!&3aLXsUP+x3=h-ZtyaSAEyYTh^~kb4jtyoyF09!N3A##XB78}QB5xO(dZ+7>LO~m z*6a-CXy_=_i8^}flTnfrD8^XVhlJp*Si3komw8N4&?BAbE?vfG1)6ZNE~e;~HqJPX z*q*qaSY_8YH}f9e&c9JaQiO)ntI*T7>=x%1+p0LFXsDQ?NG*gE(V~e-i6oO&ZpjW& z1c(kiTai(gSC;<9#M*hQ0L?pgcE7zy62!s=6^Y%Rw3Vr3GIYtL?hcK{Rg`DJ_&UP8 z8CzYa5t1jb)gd+#^xRd0GZtN`T^?Xh7NIB`9*dn1LZaE5F{R6j1YcYR*MMU$V-AIf zZCp=Ovow~!QcDK5O`FAuOPy1l{J^qjV5CzxCpqyCIuwUCh9824?Tx!mW<4o~(-l2|pJNU!^JZc_m_J8`e14Ss{l=#Ctmmy^;y4e+&rfh>gKECSmB}nnWYXzrMSL!G>t)0AHOHF|DgB+X!;aMIvnPzAUKHS+J&BV5a-cJ7ZvOQ zOsDje4X*8?dqXvXSdQV%Ld4cCE*kIGaVx%DjtP^rSzde@3uSVYG=a%&UikzTV}d8}U6QTuyxiue^a#KY)$PI;ibGsT0woO}Cy zYfSwuQD2+0XZE9}W387r2U@|AOLzI=tbu9@cF{A;k|RqV$AsF;9&2;jOULPw+^)W$ zL96ZIr~K?r;qQZ>7Nw+cCMdLhXB};n>7syt9LQN76E`vz@z7fFq7$DJep7)m4R7({Oeepc8qa92>cubUTY_+mPz*8+^_u z#s&^+%&Uuw^{0fwiWaxIXxZ^`dS!bgl@*kujFS_!;-rPF@nWdkThN6f8M?!}SeaQF zz2k1iiMk@#V(&R+;H*TxT*nZOyRGQKLK{y`{AK}Q?ZD5-3Z#xBnACnI<~~^{Hw-L_ z)0xzc5F?+w%Y>^)79sms75_Uy$SeAvLGbLKDuZkQHng8XwcxCs-Jnl^On`XUaTDMY z??OEIyep^)O&tAp_%Shnp}FxS`;vaawE14p+gnMe^U4NWfw%T-nlsUyC1<`gmjfPP zy+=QK5p0J3{>CZu0&yqb4=@$}k53p9Hln>hOCX~KAta_-)hot>TgmA zjQLp*l!^8gFiTj6?@}N>5s0(56U5L4c?;Mb&)jSxKjh8|#H^z}RO1;ZwkR>>8IKu0c2#80=+>6g7o&kHcg$oKUq^2_w<)+Xi# zF`v1NogqZ-OwRiD6vdcx?z!WfWB*L8!%Wpqz9VU|@>_uh;Re{JwT-Ev=pi*!UzNHye6hQR$w>*>@T z`-k>qmX`Jp%$Q>ZbS5N_R`WFFyjf|8bYVy*d zO<$v2ZO&J+1(LohatP$NjJ1ut$WGgljLwbr$j7!~CZbBbY*_KKeD{Lcm0a$$tJvec zC*A!r_v{1SQndFoFS%m&q0GBhDWcULufxj@)4tTVGN;aJ)Q3H}$63&_;?r}K`UMOM z<6i3Nu?MPG@hy<+UDi1xD2mg|Lh_mCbQZhCoBcSZhh#j}lWHcfD~H_nVgk#2y%_ zO%&o^yp|hw#kYPQ5&!VaY!19Ec=jf+kjFw%D3goK1Kk5{0K)+%4POZ74dEN|H&}0| zU7+T-%$dzG%*D*<%(=}4%*oAJ&9Tgd7r2^Jg80yS(Nq8`XilP2CW&v(n?=ooJBVqEsfx*uwgqqx zGLj@TM+c%8V(S1pF**UA=$&XB0P-L=N$M;zP4v6iWB@z>R*;`0J&-aM;|4}0z%WQv z5*tVti>-(iipCxU1fuO>_yt)>-fYHK#PmXQ3c_E&6hiX|A~eS`K(h|QjYZ=@CqNUE z#2G~AM-!05(nKe__1K&f9TN?Uq%u~TmJX8utr0T~GY#!K#vazfuPlZ2op4XTnJwrU zAQ0e(DMWNivIki3Z}tuH1ni>CVZX=n`jwr~9^kyk_9EZITYxpI1W^J4F~0-$&=pS)y=E6i!7vLEn0LzQag=|ly8H^@@a~mLv?nSl7 z*DMo+0|*C%qx}d93Bm}%LAwB4pt(vi0I};B-cY(QEIeqYZ`J@v0A?}jXk925)SKyo zW&je{v)Ge_b>uGi3kpFm0fK;l8X z>kYQ10mj|`5%TYPJj|5d)_&rTSE0dp%-${@Hd#P&L3Ty_`EFwI=bpwz(*@>bo5a_% zgD3H^Ej3GgJ(x^41&Ua>t?*I~NFa|??sZe0H)F&!h^UpFTe#>4V>T}egbq(XQDUSb zzH>(}oG9rvh>}}vZ?Cb*$X}Ribqu4NNHj%aZ_CvlcIle>vxm04(c*GNNd*?LPy4Cy zzJVmSR1~J~qb$7{-R$S0+5F5OO6uwgmG5#Z5$Chq&@xss^iDJ|S-B;9&$;NPL3-pT zzbQs_I!)a5(APHPocVu0Ciseji^ajDdE9q+c68=I^jD_V*ciO$k2I`?v>i18Fict_@}jEh+kEEa#uCrANF^!$;zf<&jot_t%FW*)@5YTNk5zN=N&4a3>CU zz&dR_1DP1DJfMHkh1D*Z!}k#rnW_@F=J|7SoR)7yP#f{Mq!rxk*f6!^o##55fgPh6 zV`?G3riO-~)W)yV8B8`_(jJ?$=Y1`~?U6A``?)nEy`tK~cQU5VS0XALYc`QPr>rBz zm2{T`9Wexf1AYD6-h6C&2JZPI`ZxFk-QdIKHn!WN!TO!m(FeqOEQuOy&!>zW^rn@V z;G(j(ZEuD<{CVSCoPcEQQ@?H$EQ%*up{E8uHM5~X@Vr+)u4mj`hh0Is7QyFpUrv1D1NeO;GO42Cw?N#*1FVFDgaUF6m9(3XeycNJ^z`FVWc5sI_h20XiG zuD$N{0vk{3vr)r+CGaTQ`G{Dr+Jl#jaWkqFD=Rg2=|(z*?i@FoP1|-nVFffd`97Ep zQ0#t#`5qb>S7LD4(}*xOq9v&@MiDhIn-jhbYnJ&Ipef60toPTuqt80n<&i%{Voj#? zR~07#9&I{s&e@^{ORp#mltFF+=Y(&YuXEyL$k+DU&{r@gI8EuhTm(0(AW z0F2D7Wr`Bi2_=?1VJWa%nB~=mGc6y=rs7su<_XiM zF2AA|I{I;kFP#fFBu?GqfZ`65-uQ~E@9ZZ0a?>f_y@CH=yvHsoQBQAeJvT66Kz({@ ziux--fzn9v$E?jw7>xN&&BslhqOg!iObz);zKvR{(IxYDkB#`W;~(jjJ}S#crW95b zoPRHpzrQ@fW-I$z)9#Q)Zgx{m^9fDv*A?bSyYVvBJrUeljx{1W%Hj?-MMy-f0gL(T z{fU){CqAXc?Pv(CR?&t~VMIiVDPf6P;4_xkrv$gMv0MEzo?49DFztG?$=6e&ki^CF z%4|?}n_?n2uib>{shF0u5-vA;_siJN8XrhUM%ejT<>I~v%;oKaX^qHO%pRPGJTsp3 zIC`&McTZ{2gwc{@gYKl!{JPu0$)V50 zWplglLrlD3oTP4^c&?MZqpop%cw^ON%K*Fb14)l{3m&c1WoRm>Q;Cer*6us@Oa++_Gg`#4dp6>rsNK!0r zLQz_AkmFc(Rtt5fOp3-T>Bl*K2Lx-(%<;#`_|Qz zjh5=->gBRqnjrf+5g~B{u8CEz+puf%E+>~NsKnsi;~$g!zkt204h#?vBk#4W)mop1 zq_l+i+Uz>u7d)1sG3JdL0ln$%?^$J`b8AvzzTB$N*)6piGVJ~;m}t#66U54qQl%q) zR1yB!O79PQ6#vbi9?#=2W{W!Uyy+-LQJ$^_jM({HTY- z0sD?=&CJ&8mXPM$JD6PxG`ym-!O+@1yQ!(S=AT2>HA>3K5AB$ZYooVD0uDNAJurYyr#IrYURvwuc@TL0hVHGIb?+&gzHdi9+R@_+-H z5PzPOqSZVP$Dlg#uGPBsNAWvjM>m(z3(Sx4u@Uq$Wp!GNx9<-Ykn3bC_5=$1$6x#? z3)RJyesuhUrMpFBwZ`#?rm>Lx!%cac1UC_ON!{#)8*knG#?CMmy%2Gltb@0Kd=cJgey1o&4FB{9!$H5shvVauA*=j^0w3~M=oJQ~)*cvw zhn0fc@+9>gcIEn}X~pJ?bnF(cpF10KxXmB8O;?UE`7H2j2OE_nALdwez9Ul54?CT! z>)e*?XW+cke`aa^I*mnNe0!vWO!@fo`_soDQpw+MKCXVji7330A zaz^$eMUMs(@gc|((omsp`A-r0FM13TJ1 zzVG!WLMw^w^wmCb3Llh>^?GuDgy7&~gq_L3FGu6+*VP76HwvtyU@k8AZCcv>CUS(s zqR+~x4~*yWt?FymooyfJtddWJeJ`pyC~!!POW3YnJCpW)q<$mDnZdY*!zh^o4#w5f zCG!q0=hN}EUZU&oT zev{-Y$;UykKlI21)P?W12<6A1t2jAq!U(GLz{VYy+Q$@veF+>`Br(3+dK(Va?SyOoOkhQ54n2nUOX z1ccnv>{DNuD}FV)N%q#xfjwd_b|#NT^d~ZEFomWVCj(3Swoxv8kH^$vl#Q2?WK5p> z$Cs@AFERV8e8`Z2LUIeh7|rZjOIrw>BHV$`2n&jc{n%nRp);ZULUE;+?c3_Dvv0VW zj;)tf*y;6B4G+Bonp__=iNDAw&zyGYYyDC3#Do@N*w1A&B~LW}EX8Kp>XRsWP1}90 za6uJLf1f0FbF!)$iV&kno5?^;A}fkcQq!+_4jOj1o>|rQ5GhpN?$P2(a5*)*Vbdjn zZ<8p{y{ZZ=W}6@UrqN2BF?YzLZS=v~63HQppp3Fk5^ThysEi|U(_kqQiLy3=CxwaS z=F{3XJbqOSuT`wV+)5Z>%yi(%+&&aPyZo9!xMum*-K;TYYn$t&mJcyyh;3n$QlCE6 z7ho`0!S+4m&Tu8(tM0bT^l-S=4L4O`Qk(ib2i^=FUX2$Lht>MlqDO1p@uyqKH7BKp z-s_Q-JvAp~SfKeYr6QJgBb5zVZ_l3=Mca&GZ5VSBnNFG@1}+7f6N27CcMLQQc>@)C z^XNV&vL1M3o!szL`Q#;bp`SR6OxUKmbEd2|>#A0{o19#3pw!-(Gl@>?F~xF!LSuw! zdM^)|z&yB;%q7;U{GjFA%3@8r8JW0@-)GW1Aw67Ae2!B2Wo31DFFfV0P<79cYFtZ> zgy@!0s}SkDCG>(%Ib(JL$M3sWF)GUMwGLD^5F`{1ZC2wxpa7T3bcL}kM!x)*Kq?b} za6cGbL%iH|)>DrKyF79T#;qh)H7BNl);lE`eoAh|s9)6*Fr5|F|fL+wPK>O0oW1F60}V4v_ePqE&tEUA35n&cLRm{qy;zNbWK zz;j5Y`DqvTwwz?aS)HL<%3hJa|DfO29FSJOMGSksbFD~SEH#Z++$&DmtI}&Oh8?Tw z3x1kNm~#1ec(IMH)daaWAJa%qY24G2P2*Pu(3ozwLOFvAB!{E2p>}`=OK%)?3Vk|h zcNXrEO^e?<(PNz^?xB)n?DylEhDJV0uOwJa1nf=Vp4u@jTRgO?>Qx<X?D4K^X+6@|y`E zK6Ceaa>@3GL1-gEQ`;Q6f!gkK4P^eEDFNkDEeM-%M_QI{zCd|86APx6V+6&~f!#*_ zAdRHKO~;~ODbsboQuSh0m#Qy~Nn#Zd#4V}*0;1)Kn*P`aSp;iR)Z27gkDp7zlJmQC z&!1sX!2_l^PF||FvV$q|?&ZPv28p3y@ zg5tI54MWQI8ir>@ICU?_#;w9Rr*iD-9~h;M9S6}$>n`^=a}`c&5feL+)a&i+MSg&Y zz-HrBC~mNeir|Q+i!?z?xj9PKxxdW_xZ+Q;g?~RI!6lT6ED~(ig-=5JHT>`Tjk22+ z$XH(#`RP6^?xUDwV8^*nRNNS5oeX~!|H?|b?UXDvRXRjf4+m}+i=8))rbakOaO*Qk zp47)6CZnia2vtxaVWp>skxK{ASIsQH+nwKT@-D%EKlO|_l2 z&8@iSe4e8H@aE9>`Qk)vL6YB#eqE=8z~IU-yc`}cRSVU=!!uqn+{hL-a^=?*XQthZ zFZCdWBpP^oXXqJL&qSl$k<4iUzAqK9m6gi1 z84s}9d$OSG#1as{7qsrGy<~|OA1L}$NE{a{Tns35`>xg#FEw15_J!)LBfWy)o8*0O z*cXpysEGrp4`25`c*o&zU^L26)q7J>1fmXet8o58B`Qt)ao##$*3w6nHSlHp*=Lua z3_M+ST9K@`4Foc{Z(_fUy`7H{wQ?~$V%vUT;PZ&$g;Ks~D%qR5zSxIej@yly93Nb3 z6Fi2MIGDRfUVWmOKQvM(dYvmPwk}{++c5!Pt?}@&8zt}H#~#;KajiJ>x*w-H_RV*N z#J6QjGVGSF6FyP#qIOMpkynMNBN5~-rvR-auC5Ss>HQCUi1hAP!&GCGR@#Zexb)zD zj#RPJfZ8m6*816!B-SGyTTq|Kj8#<%XduTf>eH$^FMDMXUx;0w_*+h4DJ8y%R0j8;b^Bm%0Pp`xVa^dB%c_j=E>q_EY z5K?u=PkiO_cKj5tU%}-~-WyL@&UI{@fSLJ{Ze_fxbgp$6oIuw2>1zmt``f)H(jA3K z5-l(L#V4OB>?#Z|;75&vhg=_Z#!g@6x$(1n3qjw=@(VY6RHVWAXx9pB|cE8BF8SC!RyV~@>hGL zXV~>M+76M^pK3c48Ca)Yz;kXw@pdZ9M^@+VUB1(9&gvvt>m32}otKGHT3Ge(A;nK0 z`}1?Ayt=RrO&ROxqsdlJauey_KEYPEzGKrA>zgG+h*$L7(bU^O=*7m6kk2u;+^28e zDsnKO=H^a;H%?^w>-W@aJprlR+@ap`jfXcnd221XsPc3kRK^{C2`{G#=Th=BWHhxJBOjM2!DuvvfXxP6Tzw}|oipyiD?aC2&uLC3kNLU=-o5AhB)s36 z*cJLPTB$tEO05z;W}P|m6;c0GNAP4z4Zn3U3Bt~v!cJ5C34km2h*@9-l>V;1(XN;L zq}=;~{ZZvl?@q^`C4*BxVXFh$a>pb z0j@0PWiw7{)rK`Z`mq?kD-4R0f72?AANs=;SAenRvkkZL8*A#XjEBlOEUAI}pKvqA zcP+o|59-sbH0fn43Spg(o`mFt%%XnCt2lU>?Xx(Kzwh|)yixNo{`vi@t^nt8;J^6NAv&n-2U~s`Cmt}|9R&6_e0ivygYw7Vr?3);uIoD@c1O{5v}<_ zvQqxXmsSaK#jkg;%=cuu(4WN0Ih#qOf*MXq877&7~Bmj1^0y?7jH9jkAW<{hf^Po|@o%1OiS-(MNTe3y0C&GwO0 z6SW+X+8ZdD6rp5Dp)W%a%SMw#1;=xs7Nt3cXzmz2oDNfYst^g$IWXc0ON*0 zV1nEz598tHfe7&k@bNsffLTI+pU&kkYW~Z7s1DSGe5eUUQB{%O<5V04aQx+bC|mG? zP&$c%|AhhXn*Voa75}aGk0zcd_)6WssQ=4yf1&(;EeN%(|K5NoU-)G~Q525|D#qc~ z-dABRew7BedHA_`1$B7%Mfi9{P`N-9{5K|)%b-SGFCF%ujQR`HUq(5*>7ab*-`ejF z$-j91*KK6sqNetLx00jdRRmn|iO4!zx;vr}TuQS475@VN5AUm$O@}UZSm_+m2yD-R&jt| zg`S9mg_DgKn-{kg%-X`;0m&xL%WY|aO1Hmlh65bs$yc6xJq-M(C{)ez>Z#)F_M0?q znCtIi#U0>|a3sv?ZxXIKt|a_14pq1M1v*5<^Z%oIf0O!$UjHKL-vrw=36-Z%`vd+X z3yS}D!1aH;F#NUhKPTwV)Q@_d6l3$eO6>o5vAo9j^PnJzR~hcN3kVeuK!Gi-f5H19 t{Ct9chx|kMh5iYjMR$u=9VyR${Z8}?zK#dshyKE^{~tbxj-~(r literal 0 HcmV?d00001 diff --git a/asl_cards/tests/synthetic-data/3-cards.doc b/asl_cards/tests/synthetic-data/3-cards.doc new file mode 100755 index 0000000000000000000000000000000000000000..28a2d6da28ae70b0252095a395a051df3ddc4c66 GIT binary patch literal 27136 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 literal 0 HcmV?d00001 diff --git a/asl_cards/tests/synthetic-data/bad-spacing.pdf b/asl_cards/tests/synthetic-data/bad-spacing.pdf new file mode 100755 index 0000000000000000000000000000000000000000..456aae92504bd1633cb44707b2711fc487106bb3 GIT binary patch literal 17547 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 T1u8B5^;!uagiql2_e%U90hk;B literal 0 HcmV?d00001 diff --git a/asl_cards/tests/synthetic-data/empty.doc b/asl_cards/tests/synthetic-data/empty.doc new file mode 100755 index 0000000000000000000000000000000000000000..a04423b729139cb892fd57cf0e1ca9ef8120bbb3 GIT binary patch literal 26112 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

pmYp_x|!F;=6nI*G$Il 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 Oy9)$YL4CX4_5T2t1BL+r literal 0 HcmV?d00001 diff --git a/asl_cards/tests/synthetic-data/null.pdf b/asl_cards/tests/synthetic-data/null.pdf new file mode 100644 index 0000000..e69de29 diff --git a/asl_cards/tests/test_real_data.py b/asl_cards/tests/test_real_data.py index b981670..6a558f0 100755 --- a/asl_cards/tests/test_real_data.py +++ b/asl_cards/tests/test_real_data.py @@ -4,36 +4,17 @@ import sys import os import unittest -base_dir = os.path.split( __file__ )[ 0 ] - -sys.path.append( ".." ) # fudge! need this to allow a script to run within a package :-/ -from asl_cards.parse import PdfParser , AslCard +from _test_case_base import TestCaseBase +from asl_cards.parse import AslCard # --------------------------------------------------------------------- -class TestRealData( unittest.TestCase ) : +class TestRealData( TestCaseBase ) : """Run tests using the real "ASL Cards" PDF files.""" def _test_pdf_parser( self , fname , expected_cards ) : - # parse the specified PDF - fname2 = os.path.join( base_dir , os.path.join("real-data",fname) ) - if not os.path.isfile( fname2 ) : - raise RuntimeError( "Missing data file: {}".format( fname2 ) ) - pdf_parser = PdfParser( - #progress = lambda _,msg: print( msg , file=sys.stderr , flush=True ) - ) - cards = pdf_parser.parse( fname2 , images=False ) - # check the results - if len(cards) != len(expected_cards) : - raise RuntimeError( "{}: got {} cards, expected {}.".format( fname , len(cards) , len(expected_cards) ) ) - # get the attributes we're interested in - card = expected_cards[0] - attrs = [ a for a in dir(card) if not a.startswith("_") and not callable(getattr(card,a)) ] - attrs.remove( "card_image" ) # this is messing things up :-/ - # compare the extracted cards with the expected results - for i in range(0,len(cards)) : - if not all( getattr(cards[i],a) == getattr(expected_cards[i],a) for a in attrs ) : - raise RuntimeError( "{}: Card mismatch ({}): got {}, expected {}.".format( fname , i , cards[i] , expected_cards[i] ) ) + """Test the PDF parser.""" + super()._test_pdf_parser( os.path.join("real-data",fname) , expected_cards ) def test_italian_ordnance( self ) : self._test_pdf_parser( "ItalianOrdnance.pdf" , [ diff --git a/asl_cards/tests/test_synthetic_data.py b/asl_cards/tests/test_synthetic_data.py new file mode 100755 index 0000000..c40a5a1 --- /dev/null +++ b/asl_cards/tests/test_synthetic_data.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 + +import sys +import os +import unittest + +from pdfminer.pdfparser import PDFSyntaxError + +from _test_case_base import TestCaseBase +from asl_cards.parse import AslCard + +# --------------------------------------------------------------------- + +class TestSyntheticData( TestCaseBase ) : + """Run tests using the synthetic PDF files. + + We test with some generated test files, since the real "ASL Cards" files need to purchased, + so we can't keep them in source control. + """ + + def _test_pdf_parser( self , fname , expected_cards ) : + """Test the PDF parser.""" + super()._test_pdf_parser( os.path.join("synthetic-data",fname) , expected_cards ) + + def test_null_file( self ) : + # try parsing a zero-byte file + self.assertRaises( + PDFSyntaxError , + self._test_pdf_parser , "null.pdf" , None + ) + + def test_empty_file( self ) : + # try parsing an empty file + self._test_pdf_parser( "empty.pdf" , [] ) + + def test_1card_file( self ) : + # try parsing a file with 1 card + self._test_pdf_parser( "1-card.pdf" , [ + AslCard( page_id=1 , page_pos=0 , card_tag="Vehicle #1" , nationality="Moldovia" , name="Big Tank" ) , + ] ) + + def test_2card_file( self ) : + # try parsing a file with 2 cards + self._test_pdf_parser( "2-cards.pdf" , [ + AslCard( page_id=1 , page_pos=0 , card_tag="Vehicle #1" , nationality="Moldovia" , name="Big Tank" ) , + AslCard( page_id=1 , page_pos=1 , card_tag="Vehicle #2" , nationality="Moldovia" , name="Little Tank" ) , + ] ) + + def test_3card_file( self ) : + # try parsing a file with 3 cards + self._test_pdf_parser( "3-cards.pdf" , [ + AslCard( page_id=1 , page_pos=0 , card_tag="Vehicle #1" , nationality="Moldovia" , name="Big Tank" ) , + AslCard( page_id=1 , page_pos=1 , card_tag="Vehicle #2" , nationality="Moldovia" , name="Little Tank" ) , + AslCard( page_id=2 , page_pos=0 , card_tag="Ordnance #1" , nationality="Moldovia" , name="Big Gun" ) , + ] ) + + def test_bad_spacing( self ) : + # try parsing cards with bad spacing + self._test_pdf_parser( "bad-spacing.pdf" , [ + AslCard( page_id=1 , page_pos=0 , card_tag="Vehicle #1" , nationality="" , name="" ) , + AslCard( page_id=1 , page_pos=1 , card_tag="Vehicle #2" , nationality="Moldovia" , name="" ) , + ] ) + +# --------------------------------------------------------------------- + +if __name__ == "__main__" : + unittest.main()