From 668a58b65a36766c6e6c0fbfbdbb5d175ee77234 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Mon, 7 Mar 2011 02:04:23 +0900 Subject: [PATCH] update unit tests for sqlalchemy drop --- tests/support/anki12.anki | Bin 0 -> 192512 bytes tests/support/dingsbums.xml | 50 ++++ tests/support/fake.png | 1 + tests/support/supermemo1.xml | 89 +++++++ tests/support/syncing-media/1.anki | Bin 0 -> 180224 bytes .../834a227f8d0abc4e2193f08138e59885.png | Bin 0 -> 545 bytes .../c4ad64a7afe9b09602cdf91e18897959.png | Bin 0 -> 580 bytes tests/support/syncing-media/2.anki | Bin 0 -> 184320 bytes .../22161b29b0c18e068038021f54eee1ee.png | Bin 0 -> 644 bytes tests/support/test.mem | 219 ++++++++++++++++++ tests/support/text-2fields.txt | 11 + tests/support/text-tags.txt | 2 + tests/support/text-update.txt | 11 + tests/test_find.py | 40 ++++ tests/test_models.py | 97 ++++++++ 15 files changed, 520 insertions(+) create mode 100644 tests/support/anki12.anki create mode 100644 tests/support/dingsbums.xml create mode 100644 tests/support/fake.png create mode 100644 tests/support/supermemo1.xml create mode 100644 tests/support/syncing-media/1.anki create mode 100644 tests/support/syncing-media/1.media/834a227f8d0abc4e2193f08138e59885.png create mode 100644 tests/support/syncing-media/1.media/c4ad64a7afe9b09602cdf91e18897959.png create mode 100644 tests/support/syncing-media/2.anki create mode 100644 tests/support/syncing-media/2.media/22161b29b0c18e068038021f54eee1ee.png create mode 100644 tests/support/test.mem create mode 100644 tests/support/text-2fields.txt create mode 100644 tests/support/text-tags.txt create mode 100644 tests/support/text-update.txt create mode 100644 tests/test_find.py create mode 100644 tests/test_models.py diff --git a/tests/support/anki12.anki b/tests/support/anki12.anki new file mode 100644 index 0000000000000000000000000000000000000000..f39aeda6c292c4cb0545e3851da433e0ef2c254d GIT binary patch literal 192512 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 + +Deutsch - ItalienischRick Gruber-RiemerKlett Grund- und AufbauwortschatzDeutschItalienischAttributesLektionKategoriOthersErklärungUnregelmässigen_USen_USen_USen_USen_USen_USen_USen_USen_US1000222falsefalse + +RegelmässigUnregelmässig +avereessereavere oder essere +-are (regelmässig)-ere (regelmässig)-ire (regelmässig)Unregelmässig +illa +RegelmässigUnregelmässigNur EinzahlNur Mehrzahl + + + + + + + + + + + + +Rest +Harenberg Kalender Italienisch 2007 +50. Restaurant, Café, Hotel +Berlitz Kalender 2005 +A + + +Default + + +entfernen, beseitigenallontanare +dann; damals, also; früherallora +Schüler, Zöglingallievo +lustig, heiterallegro +sich in einer unbequemen Situation befindenessere un pesche four d' aqua +das ist mir egalme ne fregoGeste: unter dem Kinn mit der Hand vonhinten nach vorne reiben +Wirtinostessa + + +2361915312 +1961915312 +1251251100 +2021915312 +1881251100 +1241811000 +1761915312 +1241811000 + + diff --git a/tests/support/fake.png b/tests/support/fake.png new file mode 100644 index 000000000..8baef1b4a --- /dev/null +++ b/tests/support/fake.png @@ -0,0 +1 @@ +abc diff --git a/tests/support/supermemo1.xml b/tests/support/supermemo1.xml new file mode 100644 index 000000000..d65652107 --- /dev/null +++ b/tests/support/supermemo1.xml @@ -0,0 +1,89 @@ + + + 3572 + + + 1 + + Topic + + + + + + + + + 40326 + + aoeu + + Topic + + + 40327 + + 1-400 + + Topic + + + 40615 + + aoeu + + Topic + + + 10247 + + Item + + + aoeu + + aoeu + + + + 1844 + + 7 + + 0 + + 19.09.2002 + + 5,701 + + 2,452 + + + + + + Topic + + + aoeu + + + + + 0 + + 0 + + 0 + + 04.08.2000 + + 3,000 + + 0,000 + + + + + + diff --git a/tests/support/syncing-media/1.anki b/tests/support/syncing-media/1.anki new file mode 100644 index 0000000000000000000000000000000000000000..05940936a655605c8c0a0e43c84a30bd9b06fe5f GIT binary patch literal 180224 zcmeI5dvF`qeeba#2!N2lwH^$lNVHbVC?q0M!~!4*NU`EKBWAg-uUfiM zYmKZB)mp0)vo)qpF0ScyqDi;U&7CSu&iZu9Yc>7i8j%AdYilc{u9pMjWUBPOX`^OM zt1EhSUFPYsTsI=l>i1E-4j5m|luaukAb^bE~e8r-=QmsttcEKoSq(0)JAHb>+v?GW_ZQX8R)s#l4|RGnsg zJ1H{HkorlLW;0O8Bqpo-^JMjuzM@;5r5Mq+Vry1;u2M0HB{{>T+ppIQ7F4ZD8mXvj zRZF7XJ?kl^jJ292>9iRvk-8Kl#X9WmNHG?(#^vpbo;8fx*0ObSX=@=?SX*X;X>tp_ zV}7^Ok2m#4zW&!Yo0IU9C3ST-!0;r1P~h`B4hdJG9z7TZUB!v#&^<@sZBy66uH10v}R; zN#P}GTB>F8kFc*ic~FNT)mmRAft`V-u1hD`^xiw!u9Ho#-L&eo$!}wR=#iyem)WM(xo$9N_DbwQ=*-jn-cBp+>~f%=%z#)OWo-&U0Wx1(T|>J zl74oHzaA2w7oVbEI6wddKmY_l00ck)1V8`;KmY_l00iD70&>^BP|x9bz>&=;%19y-cPsk|~ZT6SA-`6mO%)m0|0Dq4$4==>IrC00ck)1V8`;KmY_l00ck)1VG@e zLg4E3Uw`%4FTeQAi?7WkLp`xrGWDU!WGoz?{7OE5?-x&ZJKu%dRZ}ldN{j4Es?diG zm)Vn4(q-LRmQ<-yr_UivYE7f(i)#78vBX_##AMG&o03{5l4@R{Po+_*6-U%ExSX`O z?mnD#ERi@0@eAdCjzp75zT;5RJ90oAzVF!%|(fmT9!Ltkx21CX3ZA zi9Qpus9O5Uafv@1F0n^>OsT40Ad*b3tkMUw+2dw1Gbd4|3Dq49^kH&lJdL2%%glIr zn4e$P>62rmX3_@{5;Q4GqE9W{;&1_=Je4&n;ko7Jo?()ZC{^z;e__n{kMI~w!f=8))T%be9zv! z;d`F`Y&aZd>;JI$KSJVP(+?aV00JNY0w4eaAOHd&00JNY0w4eaKXC%m5C81jpLp?^ zmmb;~4@K!+fq2MW=Cj8h)>9Wh&AzYv@j^)Ym(Tp(qc1-5osWGoNb>$)I{r;2dH?y} zRM`5TZu*A<1V8`;KmY_l00ck)1V8`;KmY_l;B8F6{`>#$hQ#N@-+dcr6IlZR5C8!X z009sH0T2KI5C8!X0D-qIfx*W<{_*ef%??DmRe#?=vZp7`tQFk9``=FA|6f?98y3{e z%cOp6@6boS{tfqncr?{|!8F@EU{azU-1v3}$M&-Ie?&~N{r^8I7U&5M5C8!X009sH z0T2KI5C8!X009uVaR{XT3AI9si<#nhCR^4jMTIDZLUE!vRy?-K zyw{H2dgmW}`umUar~6rw@r$p1zUQFvSafHr#zHQyX0sEOf|gMi%XyMjin&UrpyUc< ztXL?Fxf+d1uQ2(e!!q8!nx=NO7}`b+z~Ha zE87j_?c-YcqYrd(*UG=~LGD_adtK%q5ua;i#~X87PubVVE4D_=a$R3#8~3*Qkf%HB zvMqFjeKI$B2X}>duV${-%CmGkUYYCUL39IQ>nshHJ9@`nrdtfpP&e)MOKSDBPB-uE z#5?;}_uh=WQm0r4m@%pwc_6cvHStC_-J>z2aIm+fyO8cm6V3b@os#SH> zblhmq%r2DfD9!s6%gg%G@|n7B)OBm!ER z=H1?PT;IlzwIkB-oF15gimF$M##EhVd;?`1Mdle&KdI7e1`3(>_R-Yk_bGivr@KXW zl41_W+lsAO<+)15B$iZLTOoD5JfviXrEFTN87zqIIjxb3x>mI$8qD_Co}v!Bt&Wc0 zE7W!QcBB}KS>y6{Mb8>WZEIQTV|{BO#(2wYFimcucg%01$922yj*P5Nk*4S7OEY)O zN;GgtZt9PGuI*P0+GI?3NZl3T9q>Z}?|>OglYeykI$$2u!MDB4mCk6vHRBp}&z8Dm z2DBD78j^E0ORskB^jN3M2z#t#;I@Y8=B*t?j(=)y_Uyv^ByAXyyqQwvg6uDt%_!NY zj#YKHOg0MLvDA?x!qwbnnVck5ViAp(gL5ABm5}U>l37vl5Km_PeGIJwOd)Hm9kKb% zXNgdiKGU7LVb9PWh{jR_1Hy-=Y}0j8)lT#J#%e- zovR<)3%|AAbR6s}M78M7_W{+dPA;zLb=qy;J~wx&G&$?1x>nQa-@@gDK(Rbob=^)SZ*_LlbEpO*GvK)aXXE zX#DY8LL$x9|2slI2!(zS9`F8-9Us|wGTEJ+Pd=OckKQkdKhyPxuX}wQa6x3FknlDT z-gcZu;XP0K>zOyoZXhh=S~QT2!@FWvkH=!E{riOv&283vlUI5(?z6)V>(rMzjm#}< ze+}DgN9`={)KKV5axI`OY+dr58$Ry=eFKosOkZ~)Z$_E47(5_LxL;{=l#fnjksZH_+c!K+(hFD1eO@I>VkBL3@I{yAf12$O`HFx@& zEf4yUyS_%7Z`bp^q4Ug6-KtyX0~$Cl=+^L6XI<&G4__y*JB$8~Yj{>s-L-bd8JtFY z{7yFmn4*(x($YbQb^k`alLVjiPIIx2nrQc5H=X)V=z5_;qII%r2J$i2%4N19rM+$7 zLR6*qYSblXY2P6MnXb8Xa(T-+@aApVcDGC$cU{}vF>MIo#%_Hnk3Oa|zxVy<^$jleBG47I zXZY^O69gOq%bCu8U}u!A-|c(a=EbURk@KddT8j5v^cnAs8L}3u!@725 zm|c^uCu6Dpeqm#R!(ey9?^f%k`+bv7i|hv5xxYYy?ptoI0a`|XnO%`iq(^(Bsi}S; zq|+OeR~*ySHOt_?&%247SKPB*8}AomsRIXus~5PHCS8!S9@_re?X%Gd>@W)mUaz}@ z`}C=~$)@|IYy`7!rw2r`+wb(|rf#&kIn~@u6X}h0PiZWn7Z3)C+6d#}$vH@|M&gBieoxCu8b2};ywj%|Ux{_hWo$zGOu z93TJ!AOHd&00JNY0w4eaAOHe4B7qI^-(UGF`Ud%T{`AQq`c67?Ikz!+p1PcmQE&9r z@qF{qBgEbJ;75-i;qSq7KXbo4JLr6$elL9-s3w)^69DEda%Dxyjg4y+r956)R4Qt| zBH#M@Uz~sMDARdsljiY!t}rp-)vP*#VaJwd-WRb8)%^}{EPwi+KSJ~S@=K}B{F09O zb>FG?=68MH=l-3gvA*xggH2X-%I|hx>)&>M>FfR8EK_qn;bztS4zu+?{QupEjT?Ce z0T2KI5C8!X009sH0T2KI5V(;DVEun1l{WGU0w4eaAOHd&00JNY0w4eaAaJ7+VC(+_ z$(uvscf|iCen$Kq(G(X%MU40UWAFdz{Y>x2dP#4oSLuCM@4nuh$sZ(NPJT7{x#Yvi zi*%2`QF<8;5C8!X009sH0T2KI5C8!Xc$*Lq4@3@!M7H(XX}&3b_V7C+sfj(*k%+G9 zSI+bA^VHwS65HwijA|`sC8d9VBsJP3QlY*q*e-c2dS7J!$R2xBajL>TIdAVQnU}Hy zsmT6fYjk7F{TYo49ehV*|Irp9zE5CYQg-)621BB~!J)GYW9Fv4k%5rt*~vS*Yft0| z4WS#rx;rpt61yYR5j@)?&{Pt;*g22R?zkzk-&LsW7MXT?Bi1{0lkPIRp1HXEJ(_`yIU=G_ZOs_lQvS?6=9j>IdU_*vnz5S zBsx1XX5JHy^iS<^_jK&A?IR`k4k6Mvu!n7eNGY)|_Cdqh`oBB5E7Uuhyd#-Q%JdWm z2!H?xfB*=900@8p2!H?x+!zGJ?ymm6RqBm|dGg6qf9+zV>+r5BA?4+1>Yme7#&>sh zrA5ab=qVOXOl5=6wb+BVEt4x#Dh>E~c_cqRF`mig3raqhDN;A@nLE|nSbGnfVcZ_#j=KIjeCwQ1iksi-xRKkXZ`UY8jth}<=YBk$^aH&q6 zm1@Ta>>d3mJ0{v{MWAScw(4&2sgU@6@n!LE#HYl+yfKm&fdd3U00ck) z1V8`;KmY_l00ck)1VG?ABp`;nLs3CE_n3arcq08|I4lZ0VCIRLgT~`8rNYko|NSBH zkHq(1hZ%&)AOHd&00JNY0w4eaAOHd&00JQJCKI^pSDyWy$NufvmmmIOEOag$JCQ2n z@@h6aQ7LE{b+Mc$S*4h(WC}{IK*oxN!q~CZ+EV!NXS_MFD$HH zYE_+eRcG1r|A#^sLxLc@6n-RfF7j~XAG(X(pX&Z@^uI;F61y$-WPE4bi2q&BRL@@| zMiL)Mys+c$9gpw$ubsc1Jd*rE@B4edF0Rqb8^=cfu~=U^9p6~Lq?60kO~e%Q%rLLk zG-HMT+DK+%eFFpW4Z;M}@pPvAFHJ6#q`PNIKP7o2B-Koqq)N(`^d6~FH&!I> z93gRenbe8I98O5LP-hP`ElD@2Ck6UTNf>pF)TPCB$#tI}7>>kpuEH zJvU#Pxnq`@HPq0QmgY;-rTNnAROzf;n2yO0p4b~p4Gszqjd7EG?nZn+_W6zW#o1P~ zI?~Q)iy9kXt6Wu0Yldw^N`0yXWk#;i9ZNe25Y-GWbV^BGZO0vT6n? zwU+hT1--V^u2AH4VouS`L#^O6jka;VN+vsqhb6|7R=8qcGPkkq$SXrwB|bBIvUHEsEF#e+!NsH@)*;Y#uCAx&Q&j1G zVZ~MIbGl>yIMA%sC&RSb0n!k28Z)D%$-Y>sxL?@lZdU4X)ni|Bu$^j;q%Q$aczSMs zG<9^ppf{z$ef`+#``f7JB3`{bAbsJT)b1l5yLlh#bO+pj&Wz>_y17}sH`0-3sd$5> zA@++xsvn4@ZW$CdlCJqauSDnhuNlo3c&Ir&U#xoxOVJl04LQov7Y;UMkQJEgwt&{9BxjdMXZ4^;nZ6`f(=V$V`WjV z5seOK!;K*K(F6)9oOpDHulsB_hFaDui(OImhtT0Im?P0-8;u3A0>`21V(kb!39 zt#Z74n3pVR$UBy$tCC$fF<%mH?PGS(>cFmZg5DLFlwZD)mJ>{?0@FaNpLRHw%JnzZ z^##ZI(G;zsj1~KRq&XQk!gWyPB4fg|XHl1CG+H)xC4WG+v7K=9#KO(qqfV0NW@qj?SE5rYXEgJR zvSfJ(&6ndtE`8@vG&RsCP@i*jboF@ivMA2sHdpOZhzESqh z#pl?JnP~3B+xh7z_RYzisB1kh-{^ghy+l}IW>x5}`$U^!ZOU`%HOCXYEmJb>mI%H! z=jnMjb|1A3GQ5kLxvECzF5EDB>NUs{ye)&2b_Th%%UQGd+Wkgy*t3vwlcWnN&uNfR zRN@UWY9l^k+w(y$B-+AUd+2G9Jv8{5+M}(JEf=AUC25dB_G0y#+GG!G!xCMLGEb2k z@lg+|MnkJ^wmE-&@g^^5gM41TpM&gHivKjX`TmMJI&xXWT#J>^0L{D&l00@8p2!H?xfB*=9 z00@8p2!H?x{KN_D>54{Q{d~_sZ?f(QTs5C8!X009sH0T2KI5C8!X z009u#E&;KtFRB`3&0U`F>=L7@yMDi=>tgi1`pS}I*2}lZ<-Dqm=hX?dLW+x-;&>)o z)+$AXD1}0CqBvGOwpv?~rO{jOa#r>Js|&fjn$1pB3R*^8Eayp9DdsAff|4tcv0|Yx z=3ebx|6~8Z?G_{CKmY_l00ck)1V8`;KmY_l00cnb`Xs>q{*U$l^;veX8U#Q91V8`; zKmY_l00ck)1V8`;wo3r(|Lu~390-5_2!H?xfB*=900@8p2!H?xT)za^`adjwGbH{i z{lEbNAOHd&00JNY0w4eaAOHd&00JOz9TK=HD)hvKXgGZCF`aJrpMJ6tF!RLBLF4h4 zQug})Ya#KU#IIe48HC9o00JNY0w4eaAOHd&00JNY0w8e166lKvv1s^x5gUNJ^!JDQ z*Z*G#iGL@4;f4iLoI2 z5!1@D4gSMV7mw|F{NXPKizrOw(7tbQ5xoEZmMvfy1_B@e0w4eaAOHd&00JNY0w4ea z*NlMu{Qrv~@!!Q4ubEOP0s#;J0T2KI5C8!X009sH0T2KI5O}i*^hSiJ(AWVWoTNW{ z!v5#~vH#zjT_{Ko1V8`;KmY_l00ck)1V8`;KmY`;9Rar8pAc`_|Bnaw*ZVmJoNde zzIV`gV#g;N+X2}7|Ka`rYgzzM1_B@e0w4eaAOHd&00JNY0w4eaZz_T9zW@KJkobSa zPra$8Au$jD0T2KI5C8!X009sH0T2KI5CDM&fzhsW(Q;nZ#`EfgS|P>7OmRGuEo+sc zLX<+GI8huc9$T#~g`X}S+x7UvUu5!yTwcv)Cn^Okqb`>7B&!s2l}tg&706hzP#9zK zhxUDg%iDkd|5ix+7x7z-L~#NFAOHd&00JNY0w4eaAOHd&00JOzT@grj9TLv2nX9Cx Y5v^-i*Pt+6H)__1WsEGU{XE)7O>#2B#pWt`zIke?WN#*%H@?66gHf+|;}h2Ir#G#FEq$h4Rdj z426)4R0VfW-+=cis(C=eyF6VSLn>~)y>n5hNkOFL;f;@f<8Qv3y^-hZ25$T7z9-F3 z8w%w7-nT#F`78wnZk-JWn7DN~4lrex+&;5@{nl@PnWq|0cxHC@=St%VXE;{(ue{`4 z>~Z%KFQe(|1(PSMypCJB{I2V=JMD=wmp7!edhs4OHFedou4$`QN51qajR;?2_iuW? zt9X#!$ye{@J-_U;)Wb5wcH+tkohmM zVtq*O?lVi*s7*DtNzs))w`%{d3lX+6)+kSWp}S`G+ZP5gOx^1vrv{oH{S*@^y7APp zO|cuqH*y^-s^e2hn%b56uOjeB*4j>!h_a2J4t=`Mub4EoU3BBwHYR?th{NHLo?%kg zX1;p2p~8RDq74?ioi~Z?{XE)7O>#2B#pWu5#3bvTC4^Y>8_`iF1B#Zfaf$gL6@8Vo7R>LV0FM zhC)b2s)D~)y?c=J%$`P)|dZ&&*(Yy zJYd&`BZV@@k6D;AF>N@&#I3X8KobLy0I?JpxYxYeI6eQM#N#u!Mb_=^oz!c=xx{T+ zZ|O|WgWCMB?Sgkk&G7R5b*5@fW%blITW1@UzTRB4#HhYsA^2#-$)L>m<0Z!>Usv!S zEO@Kr5Fa0+U9)h)V)v>qEH?wVuf)$WpIQ?=ZQ;JA<2LF4sD&G(V{(xf6M9L zYc9C?yxII~ZP?cpkxF+pS@(%gJGW%H|0W@?6oJ)GCrvGW#+!7N@%5gNC};7MQ_`>X zSDvY4@?B{>EoY6#G~;PSYqo6o^8QEr%8-*sH#w{-Zq(nyARV`H)!q=aOgso`eysfb;oyCvfX$ep3=HpAmT}@KyH?1Ti*EPt51@A?;ynI z^GWPqAN%JVA7M8^pKpp(9k~Cs4$0T|R6u@(%l65y$*$ISqC~LG}*4=KJn8}XMX36aM{l~K;S?7}^J+Y{+k;$pq>;u^u zGBrI*rcNI}-b-T9vZ3iEwczQOEb=%ewWOzSNi9+`n?1wAstZq}X3o%;EWKP>>zSvj zwQNvxt&c&^E$ar=$oqoO?rBkmW$NTbDn-l7U&bl$|dWVTGR_G zNf9qkb}p9+K%iG=ifkBI`H z(cD>6oPw@Q7fvlQJ7=&AV34OypUBQkPV^}0UXn?nrmtu#(9s)jaMvZ!%hEu7FxuR~b9*jl)# zuRq{=*=vPMRdZ$C8oPwA5i+Z;>Pp&^z3@_+du2SmlDTrBpe~toR_8h6nW>BV!s1Co zFB`g5tzxbcl`K-Nm3N_hp@p}(Y%bA~#tP(`rY2dU7baNVPa7I#71dL>s>rD&HK&&r znh51py+Ab{)CtbFRY2xRY8+KrGChS%YVxu_Lzj;0McryG#fdf*Tefo3`MgOjQf=Ry zx>_o8r$T{fG_NifEW)aAj%hwoUM^WgXVqYV8pKN~ujZ`vNO2ZZI2abkMv)a=YStAwP= zGk-Se?o_LoU0GV~A6X|HOFfg4M3?#@MdYYysg@~Deph}9rxw|1tt?T`#z0e7$Wi`1 zR{wQm&?VDTI;paLQ(dSwvrUPyFBew+b$Y>Wj$6rTx@j4#%2Vz2$g-x(Y|?D8+L={N znr`i_wD!)l_8w^MJ=ny1g|!+Bt(2ajlfNfF&n`GX00ck)1V8`;KmY_l z00ck)1V8`;-Xa3Y!0oG62j z9~uAl;9%wIAGcMnqxY+(o*O6g{6g|mQAZ%)SqCp z(TKIEoAx};009sH0T2KI5C8!X009sH0TB3qBk&v2ejodx zLkjsK;jqLGzdsUD7Y^?1{^uY3 z(0L;oYG3=t{cOg->>``uP%aDV^^fB*=900@8p2!H?xfB*=9 zz%5AN;(vYP>tZcIaj!2L>h6wo>|?2nB&6NWKc47l+!<~2v2&kQ?h`Zc`2%6=0>s1q z9{!jz_xFeqdCD9&*fyCvyVBzDddQ38;+H@B>~D(!{$4h~@9vK7>u9Ng2%W1i&!Q6# zTm}A6i`h}dD^iy_wg!Cs9}K+T7kGc@&m&L8|2ObHo@N{%00M6X0qj*h87tPIe!1%?gDH|BSaGUmV>|@k6;`g*! z0pk~|hBRyzFn-ZseF)~K-sa|~`1n8Me~-`qo=|7#$C2|X2hCAFDH zq0WO_=sHKW1{ZaW3p1={&oY@Tjf=@6-bUMMVzwzYux~V@_tvprV;IlQKb|pbOxd}z zt%-p=rvQu>^aZvxN%fmUSa`Fi6M0(CTlHES>8f9oC~X0c2)X?@&*&VFwUIeKO`_sf z{+w-KJVS02SQ`VE7#DS;X#lI<4X>*OW-TpST(VYd5i(ycvwdGmYYl!Wy@Z=4s)||k zA~PG-XgaLBn`g_ltz-$CR;*!l*-{dYj(x()y`gZTyIZ<^STvrt-%(ni%>0n+A?j{I zU4Eh!tr4juV^IW`yPq415!3NozF9y6Yk$THqt1+#y&b8|0E>+b&URda= zj7GwV{rjcM1FLybEmI;Ns`r~+IV3&;%&M1NqPTEfVy{Pmss`z*5Y@6FRKI*ED$K<_ zJ#DMb4Yu00TFoskb;Z6;tQIx3&szJa@gBU@EWtKQU@QBs%wFcQhY8nfmxR{I7v;cZ z;B?g%ZDS>DFjFhwUGL99Pja=7w`SmOXk~4cD^3Tx*5IWodX2U2OI72Wo{bJS3CS&^ zUb9Vb43f5NJv3HeT3Mar_4+6`)!Radm!7iGN+QXFIVQwfhQvybVOBd+%0B#CMB3Ey zp1GXM@qN_TXR~KPx$cJfYCpa=v!quOXl4bjCeX|XTutEC{||uV3N?k%(AuY_yL~T} zTlucH&or1_T|Tm6{R%h!+M=8#byJjoFFV#vZACIGyTy6EL^biMS24W)ZE}4B=<3Ik zH6N4ppQ1(P!o=lnJ*5hBg)8#k{iy?4-Tutx#YdCf5?7MKM(WXhLGonM)GM_$ovO`s;s}N&ZTz* zZO+cskNN*ML&1X%AOHd&00JNY0w4eaAOHd&00JOzV+ru_|L*u+pZpW~uh<%ZkIAMy zD=TuO?Wb*DZu@lGvu(63+orVL*|t6Yi}*L=Uy6Ss{=WEc#wX)P;tG2W2MB-w2!H?x zfB*=900@8p2;3qBw(Sn?_sPQiXVva#I(A1e;gdC*J8LSjUHo2nE8A}mcKc+P)!TGO zBDkw>hiwQ{zc^>#%yIciEkiP0w*_~Nt@W-m{Fx!jp7!9b18anYeNW~q?+kYO9ovJ6{sxh}UZ5qlNSXK6ZNV;AMBXe!HXida&Mk1 z=oXz*m#wm1(&)uG$74=mS#X;aZ138^aP!pj3qLV;KK|bn-|B1Yj~|O?;+^ak2MB-w z2!H?xfB*=900@8p2)r!_$eRKk?MvzcJ*7WE2h(H2axl=jtw3pR@tCR?Ol5d`Adr&H zWpjy^wBy{Jno1?lhGJL77wN?bl{vgOIW&+NRmL(SqoafAp~1nC%*b%^5J?V><(1L- zy6NA&B-uAKFg!XmJUFOi(xW3I!=r=4qg-~)gl;A~Jfw^$86`b7HZnFklFp2z(_D1T zta2XgSUNMLC_}>|gF~a4!AxdsAj4%xGr9E8Sc3{I>XE^L;S7s>EIpVR8yy_rvNS(H zhX!i0TJp&&Q&O+pu*m2RdT6l`aSgqb9Kkt)&DZePcAU`kv?c1W7Bat8g0w4eaAOHd& z00JNY0w4eaAh00_YzcHo&d*evwg*y@`xmJ|TcA@~{naYS#hqWL{F?(EQRf#NtpDE- z*$pK@00ck)1V8`;KmY_l00ck)1VG?T5#Zzh?V&Bc(3a5Og?EO3EBwXCGts@#uf#sN z`Aqz__(SnOjsL1mZTpKd7xn$13togq`xvt;V@@#DQD7UheA$ZYlubE$L98C12X zMvfhy9(VgB*-n?%sg+VL>E&rMkCT)w&C!ycv7MZmJTX4=2zgib5z?b;saUGgzBQa^ zZ@Xm0eyIXo@NT|%3 zmerMXu7}&*O1u1Qt?hE-U6m}RtXCD}^>dQXv13aJ8xm6)-E6}gsFi863X{j=+_$;) zs`t9KT5gt8r%z;OCMSB7bT7%ITulsdQLU!5Db#mu3Grg^m{7dhNb+@vO8vd;QoP=$ z$C@wn>e|I#{!Yq>i>h525urKls&n1y3WcS|UVdjMoiz_0g<7oE6vdf0sjgC-u=kR5x@h zs}VN$Ht3S+6{xkSm(J>?g=SrEa)p``Z1%I|9cQ_zpSuyRb}zkz^JJ~@SbHdOqPy8Q zx2q?fQ(TX`PTdw_YvHAH;&Z)mH9YTL%sZ+b$mG<~>>1K1LfD6o5FRN2%RXl>>Hq-MXer&-W-lCB8q z+*8xLLWu*rB)uUP(Iwi!cQgs!?ltQa7Y?bjci3acn%?yvAYx~MNv+;#Z)5QFo>h6S zeZ4d3;ZKuV%Ge!F9O-5QRY!f-1`l)MX;O1J?rV(C5P&e z8l;pelpb6vE%=`v|MuYEz=36(c z`cNDMKmY_l00ck)1V8`;KmY_l00cl_9R&FJKOle0C%+>9h+S}i00@8p2!H?xfB*=9 z00@8p2!H?xYy<*wFxn|)(u&fT&h#ltp!%F1?MsjKDI@;2V5BpeNjuMc{O^}v;P(Gs z*a*pkjvxR6AOHd&00JNY0w4eaAOHd&00OH7b_7D9@N1{pF8`(6;g{m#TJQGa>Boc{ z#{a9#a0db)00JNY0w4eaAOHd&00JNY0vnA0AL~DQ?gAU*KVERg`rPdcm%_r$`Axtc z|9{RWe?|V>MoS~~1pyEM0T2KI5C8!X009sH0T2LzTbF0<@jv$eyLC$oQU(Gb00JNY0w4eaAOHd&00JNY0-ONG|0o9_ z00JNY0w4eaAOHd&00JNY0w8ef6TtZY*3V<45ClK~1V8`;KmY_l00ck)1V8`;`1oIv zf97Lt85>@O1C}!f5|7m zbZaCKsQ>{G009sH0T2KI5C8!X009sHfwwn-_Mj9F`QH(=DY(b~-}lMie|ytG>OlYm zKmY_l00ck)1V8`;KmY_lV8aqf1`db%7t2N3Z&0&bI8Xa6YFYyamr4sC>%Vkx+vl(9 zSpUCaa~Fz(00@8p2!H?xfB*=900@8p2!O!43E1=hf9{iizV25b2m&Ag0w4eaAOHd& z00JNY0w4eaAaK(YhzF%mv|;@}_W!%-vkeM@00@8p2!H?xfB*=900@8p2!O!)3Gn^@ zq{y26|6cUTFRnijNP++efB*=900@8p2!H?xfB*=900`Wa1a9Z!ezyIefBf5ngID&y zdda>2-!FagFKbc4QQ|ca z009sH0T2KI5C8!X009sH0T8&!2($-7QYie|={@D=N;$0mzsYh3>VN?1V8`;KmY_l00ck)1V8`;KmY_l;D!?D51bBV zGRm+rpBbA^=af;J9v)2(jHWY6erS+Vs!)1xskHF1{!0h9eg3M>?f?1ZANu5%*$D>- zfB*=900@8p2!H?xfB*=900@Ak93TJ! zAOHd&@YWNk#M9ySuC7Rhp4aIGHFs`8H8gX|bvrSW9iPpThbOb|CUp`-HDe|%(40l? zCV8V=BsuVO;_hw5n14AJ*irY!lkP*@U?P03gJq6>R(S4NH{UJU#f&%Q5>5`Kpb_L1n1zJ*zR6HH1MtOQ_@}bjNQfnF9qC8sR!qQcJJM~~sDACm}u{vot zIjl5_0?n_zO+s~KczFC?l;KomXDZx&;6S93b2aq5d!Vb0z5Q4X*wq0|+g|HxU|&Zk zRB5~0?td1zT6vWvT$|uEsP492ojT`rsgiEi*1PIlUCUe9e!y0!T;B_^?#}6G8al)} z=XEKx-p!lBqxUTxJhU)(S DNS`Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT2@we`F{vpBGXMYp9dt!lbVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;GP-C2jx!0qsddK~#9!?cCdP!ypVr(ZKNk zzwEwcJe?-v#^^{#*}SJV%RnV=<2a574 zQ#IYW85X6FiL1WR`M0@V(?u#Pd5*$*Uz08MY}K+}i8PQ38MA_VN`;8mBXlT|axR#> zvF-x}4F#)TJBkZ0R$T-HqD)OtArWz9e=N2#od zn(5f4vT`8TIruS#p3Hl}LhQ93=H=6B#exxA78n!yaC` z(7|zY!|(TTIZ*yF+{Oyp{5Sl#&KsMjQ|OT135M^z4*zO0TdHXsly*3~^XCVzaOma! zJBSVq^f*kQ+XtUAUFRB}6%k9XucG0{ct1#YG+@JL% ztG2}7bLXEy=ukFu+Vx`n4?1o9gran(NAlR`^u1s}2%n-6!^Pg|A-X=I#nmCw$-f{n zSryV|N{gQlsD*WtEN3CILL_;Sj0Fp)!c_%efdv*=U{SyV3oNj}0*e9`SYUw#7FZOp ezyb>_r}6`v(9i0j^)C(p0000 +p10 +sba(imnemosyne.core.mnemosyne_core +Category +p11 +(dp12 +S'active' +p13 +I01 +sS'name' +p14 +Vfoo +p15 +sba(imnemosyne.core.mnemosyne_core +Category +p16 +(dp17 +g13 +I01 +sg14 +Vbaz, quux +p18 +sbaa(lp19 +(imnemosyne.core.mnemosyne_core +Item +p20 +(dp21 +S'a' +Vbar +p22 +sS'last_rep' +p23 +L34L +sS'ret_reps' +p24 +I0 +sS'cat' +p25 +g16 +sS'q' +Vfoo +p26 +sS'grade' +p27 +I0 +sS'acq_reps' +p28 +I1 +sS'ret_reps_since_lapse' +p29 +I0 +sS'easiness' +p30 +F2.5 +sS'lapses' +p31 +I0 +sS'acq_reps_since_lapse' +p32 +I1 +sS'next_rep' +p33 +L34L +sS'id' +p34 +S'9f401476' +p35 +sba(imnemosyne.core.mnemosyne_core +Item +p36 +(dp37 +S'a' +Vfoo +p38 +sg23 +L34L +sg24 +I0 +sg25 +g6 +sS'q' +Vbar +p39 +sg27 +I0 +sg28 +I1 +sg29 +I0 +sg30 +F2.5 +sg31 +I0 +sg32 +I1 +sg33 +L34L +sg34 +S'a869958d' +p40 +sba(imnemosyne.core.mnemosyne_core +Item +p41 +(dp42 +S'a' +Vquux +p43 +sg23 +L34L +sg24 +I0 +sg25 +g11 +sS'q' +Vbaz +p44 +sg27 +I5 +sg28 +I2 +sg29 +I0 +sg30 +F2.5 +sg31 +I0 +sg32 +I2 +sg33 +L35L +sg34 +S'74651aa3' +p45 +sba(imnemosyne.core.mnemosyne_core +Item +p46 +(dp47 +S'a' +Vbaz +p48 +sg23 +L34L +sg24 +I0 +sg25 +g6 +sS'q' +Vquux +p49 +sg27 +I0 +sg28 +I1 +sg29 +I0 +sg30 +F2.5 +sg31 +I0 +sg32 +I1 +sg33 +L34L +sg34 +S'0bd8f10b' +p50 +sba(imnemosyne.core.mnemosyne_core +Item +p51 +(dp52 +S'a' +Vcard +p53 +sg23 +L34L +sg24 +I0 +sg25 +g11 +sS'q' +Vonesided +p54 +sg27 +I0 +sg28 +I1 +sg29 +I0 +sg30 +F2.5 +sg31 +I0 +sg32 +I1 +sg33 +L34L +sg34 +S'bb503cf1' +p55 +sbaa. \ No newline at end of file diff --git a/tests/support/text-2fields.txt b/tests/support/text-2fields.txt new file mode 100644 index 000000000..b72afcaba --- /dev/null +++ b/tests/support/text-2fields.txt @@ -0,0 +1,11 @@ +# this is a test file + +食べる to eat +飲む to drink +テスト test +to eat 食べる +飲む to drink +多すぎる too many fields +not, enough, fields +遊ぶ + to play diff --git a/tests/support/text-tags.txt b/tests/support/text-tags.txt new file mode 100644 index 000000000..c7f68a8ce --- /dev/null +++ b/tests/support/text-tags.txt @@ -0,0 +1,2 @@ +foo bar baz,qux +foo2 bar2 baz2 diff --git a/tests/support/text-update.txt b/tests/support/text-update.txt new file mode 100644 index 000000000..f87113172 --- /dev/null +++ b/tests/support/text-update.txt @@ -0,0 +1,11 @@ +# this is a test file + +食べる to ate +む to drink +テスト testing +to eat 食べる +飲む to drink +多すぎる too many fields +not, enough, fields +遊ぶ + to play diff --git a/tests/test_find.py b/tests/test_find.py new file mode 100644 index 000000000..92f55a89a --- /dev/null +++ b/tests/test_find.py @@ -0,0 +1,40 @@ +# coding: utf-8 + +from tests.shared import getEmptyDeck + +def test_findCards(): + deck = getEmptyDeck() + f = deck.newFact() + f['Front'] = u'dog' + f['Back'] = u'cat' + f.addTags(u"monkey") + deck.addFact(f) + f = deck.newFact() + f['Front'] = u'goats are fun' + f['Back'] = u'sheep' + f.addTags(u"sheep goat horse") + deck.addFact(f) + f = deck.newFact() + f['Front'] = u'cat' + f['Back'] = u'sheep' + deck.addFact(f) + assert not deck.findCards("tag:donkey") + assert len(deck.findCards("tag:sheep")) == 1 + assert len(deck.findCards("tag:sheep tag:goat")) == 1 + assert len(deck.findCards("tag:sheep tag:monkey")) == 0 + assert len(deck.findCards("tag:monkey")) == 1 + assert len(deck.findCards("tag:sheep -tag:monkey")) == 1 + assert len(deck.findCards("-tag:sheep")) == 2 + assert len(deck.findCards("cat")) == 2 + assert len(deck.findCards("cat -dog")) == 1 + assert len(deck.findCards("cat -dog")) == 1 + assert len(deck.findCards("are goats")) == 1 + assert len(deck.findCards('"are goats"')) == 0 + assert len(deck.findCards('"goats are"')) == 1 + deck.addTags(deck.db.list("select id from cards"), "foo bar") + assert (len(deck.findCards("tag:foo")) == + len(deck.findCards("tag:bar")) == + 3) + deck.deleteTags(deck.db.list("select id from cards"), "foo") + assert len(deck.findCards("tag:foo")) == 0 + assert len(deck.findCards("tag:bar")) == 3 diff --git a/tests/test_models.py b/tests/test_models.py new file mode 100644 index 000000000..eb6a12070 --- /dev/null +++ b/tests/test_models.py @@ -0,0 +1,97 @@ +# coding: utf-8 + +from tests.shared import getEmptyDeck +from anki.models import Model, Template, Field +from anki.utils import stripHTML + +def test_modelDelete(): + deck = getEmptyDeck() + f = deck.newFact() + f['Front'] = u'1' + f['Back'] = u'2' + deck.addFact(f) + assert deck.cardCount() == 1 + deck.deleteModel(deck.conf['currentModelId']) + assert deck.cardCount() == 0 + +def test_modelCopy(): + deck = getEmptyDeck() + m = deck.currentModel() + m2 = m.copy() + assert m2.name == "Basic copy" + assert m2.id != m.id + assert m2.fields[0].id != m.fields[0].id + assert m2.templates[0].id != m.templates[0].id + assert len(m2.fields) == 2 + assert len(m.fields) == 2 + assert len(m2.fields) == len(m.fields) + assert len(m.templates) == 2 + assert len(m2.templates) == 2 + +def test_modelChange(): + deck = getEmptyDeck() + m2 = deck.currentModel() + # taken from jp support plugin + m1 = Model(deck) + m1.name = "Japanese" + # field 1 + fm = Field(deck) + fm.name = "Expression" + fm.conf['required'] = True + fm.conf['unique'] = True + m1.addField(fm) + # field2 + fm = Field(deck) + fm.name = "Meaning" + m1.addField(fm) + # field3 + fm = Field(deck) + fm.name = "Reading" + m1.addField(fm) + # template1 + t = Template(deck) + t.name = "Recognition" + t.qfmt = "{{Expression}}" + t.afmt = "{{Reading}}
{{Meaning}}" + m1.addTemplate(t) + # template2 + t = Template(deck) + t.name = "Recall" + t.qfmt = "{{Meaning}}" + t.afmt = "{{Expression}}
{{Reading}}" + #t.active = False + m1.addTemplate(t) + deck.addModel(m1) + + # add some facts + f = deck.newFact() + f['Expression'] = u'e' + f['Meaning'] = u'm' + f['Reading'] = u'r' + deck.addFact(f) + f2 = deck.newFact() + f2['Expression'] = u'e2' + f2['Meaning'] = u'm2' + f2['Reading'] = u'r2' + deck.addFact(f2) + + # convert to basic + assert deck.modelUseCount(m1) == 2 + assert deck.modelUseCount(m2) == 0 + assert deck.cardCount() == 4 + assert deck.factCount() == 2 + fmap = {m1.fields[0]: m2.fields[0], + m1.fields[1]: None, + m1.fields[2]: m2.fields[1]} + cmap = {m1.templates[0]: m2.templates[0], + m1.templates[1]: None} + deck.changeModel([f.id], m2, fmap, cmap) + assert deck.modelUseCount(m1) == 1 + assert deck.modelUseCount(m2) == 1 + assert deck.cardCount() == 3 + assert deck.factCount() == 2 + (q, a) = deck.db.first(""" +select q, a from cards where fid = :id""", + id=f.id) + assert stripHTML(q) == u"e" + assert stripHTML(a) == u"r"