k(b~SSKrSSKrSSKrSSKJr SSKJr SSKJ r SSKJ r J r J r \ R"S5rSSKrSSKJr "SS \R$5r"S S \R$5r"S S \5r"SS\5r"SS\5r"SS\5r"SS\5r\S:Xa\R6"5 gg)N)closing)partial)Path) cpython_only import_helper os_helperz dbm.sqlite3)_normalize_uric \rSrSrSrSrSrg)_SQLiteDbmTestsc[RUl[R URS5nUR 5 g)Nc)rTESTFNfilename dbm_sqlite3opencloseselfdbs c>[TU]5 [RURS5nSUS'SUS'SSS5 [RURS5Ulg!,(df  N4=f)Nwvalue1key1value2key2rsuperrrrrr)rr __class__s rrReadOnly.setUp@s\     dmmS 1R"BwK"BwK2""4==#62 1s A)) A7cV>URR5 [TU] 5 gNrrrJrrrKs rrReadOnly.tearDownG   rcURURSS5 URURSS5 g)NrEsvalue1rGsvalue2 assertEqualrrs rtest_readonly_readReadOnly.test_readonly_readKs4 )95 )95rcUR[R5 SURS'SSS5 g!,(df  g=f)Nvaluenew assertRaisesrerrorrrVs rtest_readonly_writeReadOnly.test_readonly_writeOs/   {00 1%DGGFO2 1 1 9 AcUR[R5 URS SSS5 g!,(df  g=f)NrEr\rVs rtest_readonly_deleteReadOnly.test_readonly_deleteSs.   {00 1 2 1 1s 7 Ac\URURR5SS/5 gNrErG)rUrkeysrVs rtest_readonly_keysReadOnly.test_readonly_keysWs! '7);s-76&!=CCrr@cR^\rSrSrU4SjrU4SjrSrSrSrSr Sr S r U=r $) ReadWrite^cl>[TU]5 [RURS5UlgNrCrIrPs rrReadWrite.setUp`$  ""4==#6rcV>URR5 [TU] 5 grNrOrPs rrReadWrite.tearDowndrRrc4[[R"UR55nUR S5Vs/sHo"SPM nnUR S5Vs/sHo"SPM nnSSS5 X44$s snfs snf!,(df  WW4$=f)NzSELECT key FROM DictrzSELECT value FROM Dict)rsqlite3connectrexecute)rcxrHrgvalss r db_contentReadWrite.db_contenths W__T]]3 4"$**-C"DE"DQaD"DDE"$**-E"FG"FQaD"FDG5zFG5 4Tzs(BA< B!B/B< B BcSURS'SURS'UR5upURUS/5 URUS/5 g)NrZkeyotherkeysotherrrrUrrgrs rtest_readwrite_unique_key#ReadWrite.test_readwrite_unique_keynsN  __&  x( z*rcPSURS'SURS'URS UR5upURUS/5 URUS/5 URS UR5upURU/5 URU/5 g)NrZrrnewr[rvaluerrs rtest_readwrite_deleteReadWrite.test_readwrite_deleteus   GGFO__&  x( z* GGFO__&  r" r"rcUR[R5 SURS'SSS5 g!,(df  g=f)NrZr\rVs rtest_readwrite_null_key!ReadWrite.test_readwrite_null_keys/   {00 1#DGGDM2 1 1racUR[R5 SURS'SSS5 g!,(df  g=fNrr\rVs rtest_readwrite_null_value#ReadWrite.test_readwrite_null_values/   {00 1"DGGFO2 1 1rarn) r!r"r#r$rrrrrrrr%rorps@rrrrr^s+7 + #$##rrrcp^\rSrSrU4SjrU4SjrSrSrSrSr Sr S r S r S r S rS rSrU=r$)Misusecl>[TU]5 [RURS5UlgrurIrPs rr Misuse.setUprwrcV>URR5 [TU] 5 grNrOrPs rrMisuse.tearDownrRrcSURS'[RURS5nUR USS5 SSS5 g!,(df  g=f)NrZrrrr)rrrrrUrs rtest_misuse_double_create Misuse.test_misuse_double_createsE    dmmS 1R   RZ 22 1 1s A Ac8URR5 grN)rrrVs rtest_misuse_double_closeMisuse.test_misuse_double_closes  rcSnUR[U5 [RURSS9 SSS5 g!,(df  g=f)Nz*must be.*'r'.*'w'.*'c'.*'n', not 'invalid'invalidflag)assertRaisesRegex ValueErrorrrr)rregexs rtest_misuse_invalid_flagMisuse.test_misuse_invalid_flags:<  # #J 6   T]]  ;7 6 6s A AcSURS'URS UR[5 URS SSS5 g!,(df  g=f)NrZrr)rr]KeyErrorrVs rtest_misuse_double_delete Misuse.test_misuse_double_deletes?  GGFO   x () ( (s A  AcUR[5 URS SSS5 g!,(df  g=fr)r]rrrVs rtest_misuse_invalid_keyMisuse.test_misuse_invalid_keys'   x ( GGFO) ( (s/ =cSURS'[UR5nURR5 UR[R 5 [ U5 SSS5 g!,(df  g=f)N1)riterrr]rr^nextrits rtest_misuse_iter_close1Misuse.test_misuse_iter_close1sP $'']     {00 1 H2 1 1s  A33 Bc<SURS'SURS'[UR5n[U5 URR5 UR [ R 5 [U5 SSS5 g!,(df  g=f)Nrr2)rrrrr]rr^rs rtest_misuse_iter_close2Misuse.test_misuse_iter_close2sd  $''] R     {00 1 H2 1 1s 8 B  Bc&URR5 UR[R5 URS SSS5 UR[R5 SURS'SSS5 UR[R5 URS SSS5 UR[R5 [ UR5 SSS5 UR[R5 URR 5 SSS5 g!,(df  N=f!,(df  N=f!,(df  N=f!,(df  N=f!,(df  g=f)NsreadrZswritesdel)rrr]rr^lenrgrVs rtest_misuse_use_after_close"Misuse.test_misuse_use_after_closes     {00 1 GGG 2   {00 1 'DGGH 2   {00 12   {00 1 L2   {00 1 GGLLN2 12 1 1 1 1 1 1 1 1 1s;D>1E(E E1F> E  E E.1 E? FcUR[R5 URR SSSS9 SSS5 g!,(df  g=f)Nznew.dbni)rmode)r]rr^r__init__rVs rtest_misuse_reinitMisuse.test_misuse_reinits;   {00 1 GG  XCe  <2 1 1s A AcSH?nUR[R5 [RSSS9nSSS5 MA g!,(df  MS=f)N)rHrCrrrrr)r]rr^r)rrrs rtest_misuse_empty_filename!Misuse.test_misuse_empty_filenamesD&D"";#4#45 %%bs%365'55s A A rn)r!r"r#r$rrrrrrrrrrrrr%rorps@rrrsD73 <   =44rrcJ^\rSrSrSrU4SjrU4SjrSrSrSr Sr U=r $) DataTypes))*s42)gQ @s3.14)stringsstring)bytesrcl>[TU]5 [RURS5UlgrurIrPs rrDataTypes.setUprwrcV>URR5 [TU] 5 grNrOrPs rrDataTypes.tearDownrRrcURHJupURXS9 XRS'URURSU5 SSS5 ML g!,(df  M^=f)Nrawcoercedrrr2r.rrUrrrs rtest_datatypes_valuesDataTypes.test_datatypes_valuessR LLLC#7!$  ':87)77s .A A+ c6URHwupURXS9 SURU'URURUS5 URURUS5 URU SSS5 My g!,(df  M=f)NrrZrrrs rtest_datatypes_keysDataTypes.test_datatypes_keyssx LLLC#7&   !18<  x8GGCL 87)77s AB  B cSURS'SURS'SURS'URURR5S/5 g)NrZ10s10 )rrUrgrVs rtest_datatypes_replace_coerced(DataTypes.test_datatypes_replace_coercedsE    %1rrn) r!r"r#r$r2rrrrrr%rorps@rrrs(G7; !22rrc^\rSrSrSrU4SjrSSjr\S5r\S5r \S5r \S5r \S 5r \S 5r S rS rS rU=r$)CorruptDatabasez@Verify that database exceptions are raised as dbm.sqlite3.error.c$>[TU]5 [[R"UR 55nU UR S5 UR S5 SSS5 SSS5 g!,(df  N=f!,(df  g=f)NzDROP TABLE IF EXISTS Dictz"CREATE TABLE Dict (invalid_schema))rJrrr{r|rr})rr~rKs rrCorruptDatabase.setUps\   W__T]]3 4 67 ?@5 45 4s"B#A0B0 A> :B Bc [[RURU55nUR [R 5 U"U5 SSS5 SSS5 g!,(df  N=f!,(df  g=frN)rrrrr]r^)rrfnshould_succeedrs rcheckCorruptDatabase.checksU [%%dmmT: ;r"";#4#4526< ;55< ;s# A5 A$A5$ A2 .A55 Bc US$Nrr&rns rreadCorruptDatabase.read s %yrcSUS'g)NrZrr&rns rwriteCorruptDatabase.writes 5 rc,[[U55 grN)rrrns rrCorruptDatabase.iters  T"Xrc$UR5 grN)rgrns rrgCorruptDatabase.keyss   rc US grr&rns rdel_CorruptDatabase.del_s uIrc[U5 grN)rrns rlen_CorruptDatabase.len_s  BrcRSHnURUS9 [URUS9nU"URS9 U"URS9 U"UR S9 U"UR S9 U"URS9 U"URS9 SSS5 M g!,(df  M=f)N)rHrCrr)r) r.rrrrrrgrr)rrrs rtest_corrupt_readwrite&CorruptDatabase.test_corrupt_readwrite#s!D4( 6#$####)("((s A5B B& c[[RURS55nSUS'USn[ [ U55 US SSS5 g!,(df  g=f)Nrrfoosfoo)rrrrrr)rr_s rtest_corrupt_force_new&CorruptDatabase.test_corrupt_force_new.sM [%%dmmS9 :bBuI6 A bN6 ; : :s "A A#r&)F)r!r"r#r$__doc__rr staticmethodrrrrgrrrr r%rorps@rrrsJA  $rr__main__)r= test.supporttestr; contextlibr functoolsrpathlibrrrr import_modulerr{ dbm.sqlite3r TestCaser r(r@rrrrrr!mainr&rrrs ??))-8 & 5h'' 5K(  K@CC@+#+#\E4_E4P%2%2P7o7t z MMOr