test_patma.py 85 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210
  1. import array
  2. import collections
  3. import dataclasses
  4. import enum
  5. import inspect
  6. import sys
  7. import unittest
  8. @dataclasses.dataclass
  9. class Point:
  10. x: int
  11. y: int
  12. class TestCompiler(unittest.TestCase):
  13. def test_refleaks(self):
  14. # Hunting for leaks using -R doesn't catch leaks in the compiler itself,
  15. # just the code under test. This test ensures that if there are leaks in
  16. # the pattern compiler, those runs will fail:
  17. with open(__file__) as file:
  18. compile(file.read(), __file__, "exec")
  19. class TestInheritance(unittest.TestCase):
  20. @staticmethod
  21. def check_sequence_then_mapping(x):
  22. match x:
  23. case [*_]:
  24. return "seq"
  25. case {}:
  26. return "map"
  27. @staticmethod
  28. def check_mapping_then_sequence(x):
  29. match x:
  30. case {}:
  31. return "map"
  32. case [*_]:
  33. return "seq"
  34. def test_multiple_inheritance_mapping(self):
  35. class C:
  36. pass
  37. class M1(collections.UserDict, collections.abc.Sequence):
  38. pass
  39. class M2(C, collections.UserDict, collections.abc.Sequence):
  40. pass
  41. class M3(collections.UserDict, C, list):
  42. pass
  43. class M4(dict, collections.abc.Sequence, C):
  44. pass
  45. self.assertEqual(self.check_sequence_then_mapping(M1()), "map")
  46. self.assertEqual(self.check_sequence_then_mapping(M2()), "map")
  47. self.assertEqual(self.check_sequence_then_mapping(M3()), "map")
  48. self.assertEqual(self.check_sequence_then_mapping(M4()), "map")
  49. self.assertEqual(self.check_mapping_then_sequence(M1()), "map")
  50. self.assertEqual(self.check_mapping_then_sequence(M2()), "map")
  51. self.assertEqual(self.check_mapping_then_sequence(M3()), "map")
  52. self.assertEqual(self.check_mapping_then_sequence(M4()), "map")
  53. def test_multiple_inheritance_sequence(self):
  54. class C:
  55. pass
  56. class S1(collections.UserList, collections.abc.Mapping):
  57. pass
  58. class S2(C, collections.UserList, collections.abc.Mapping):
  59. pass
  60. class S3(list, C, collections.abc.Mapping):
  61. pass
  62. class S4(collections.UserList, dict, C):
  63. pass
  64. self.assertEqual(self.check_sequence_then_mapping(S1()), "seq")
  65. self.assertEqual(self.check_sequence_then_mapping(S2()), "seq")
  66. self.assertEqual(self.check_sequence_then_mapping(S3()), "seq")
  67. self.assertEqual(self.check_sequence_then_mapping(S4()), "seq")
  68. self.assertEqual(self.check_mapping_then_sequence(S1()), "seq")
  69. self.assertEqual(self.check_mapping_then_sequence(S2()), "seq")
  70. self.assertEqual(self.check_mapping_then_sequence(S3()), "seq")
  71. self.assertEqual(self.check_mapping_then_sequence(S4()), "seq")
  72. def test_late_registration_mapping(self):
  73. class Parent:
  74. pass
  75. class ChildPre(Parent):
  76. pass
  77. class GrandchildPre(ChildPre):
  78. pass
  79. collections.abc.Mapping.register(Parent)
  80. class ChildPost(Parent):
  81. pass
  82. class GrandchildPost(ChildPost):
  83. pass
  84. self.assertEqual(self.check_sequence_then_mapping(Parent()), "map")
  85. self.assertEqual(self.check_sequence_then_mapping(ChildPre()), "map")
  86. self.assertEqual(self.check_sequence_then_mapping(GrandchildPre()), "map")
  87. self.assertEqual(self.check_sequence_then_mapping(ChildPost()), "map")
  88. self.assertEqual(self.check_sequence_then_mapping(GrandchildPost()), "map")
  89. self.assertEqual(self.check_mapping_then_sequence(Parent()), "map")
  90. self.assertEqual(self.check_mapping_then_sequence(ChildPre()), "map")
  91. self.assertEqual(self.check_mapping_then_sequence(GrandchildPre()), "map")
  92. self.assertEqual(self.check_mapping_then_sequence(ChildPost()), "map")
  93. self.assertEqual(self.check_mapping_then_sequence(GrandchildPost()), "map")
  94. def test_late_registration_sequence(self):
  95. class Parent:
  96. pass
  97. class ChildPre(Parent):
  98. pass
  99. class GrandchildPre(ChildPre):
  100. pass
  101. collections.abc.Sequence.register(Parent)
  102. class ChildPost(Parent):
  103. pass
  104. class GrandchildPost(ChildPost):
  105. pass
  106. self.assertEqual(self.check_sequence_then_mapping(Parent()), "seq")
  107. self.assertEqual(self.check_sequence_then_mapping(ChildPre()), "seq")
  108. self.assertEqual(self.check_sequence_then_mapping(GrandchildPre()), "seq")
  109. self.assertEqual(self.check_sequence_then_mapping(ChildPost()), "seq")
  110. self.assertEqual(self.check_sequence_then_mapping(GrandchildPost()), "seq")
  111. self.assertEqual(self.check_mapping_then_sequence(Parent()), "seq")
  112. self.assertEqual(self.check_mapping_then_sequence(ChildPre()), "seq")
  113. self.assertEqual(self.check_mapping_then_sequence(GrandchildPre()), "seq")
  114. self.assertEqual(self.check_mapping_then_sequence(ChildPost()), "seq")
  115. self.assertEqual(self.check_mapping_then_sequence(GrandchildPost()), "seq")
  116. class TestPatma(unittest.TestCase):
  117. def test_patma_000(self):
  118. match 0:
  119. case 0:
  120. x = True
  121. self.assertIs(x, True)
  122. def test_patma_001(self):
  123. match 0:
  124. case 0 if False:
  125. x = False
  126. case 0 if True:
  127. x = True
  128. self.assertIs(x, True)
  129. def test_patma_002(self):
  130. match 0:
  131. case 0:
  132. x = True
  133. case 0:
  134. x = False
  135. self.assertIs(x, True)
  136. def test_patma_003(self):
  137. x = False
  138. match 0:
  139. case 0 | 1 | 2 | 3:
  140. x = True
  141. self.assertIs(x, True)
  142. def test_patma_004(self):
  143. x = False
  144. match 1:
  145. case 0 | 1 | 2 | 3:
  146. x = True
  147. self.assertIs(x, True)
  148. def test_patma_005(self):
  149. x = False
  150. match 2:
  151. case 0 | 1 | 2 | 3:
  152. x = True
  153. self.assertIs(x, True)
  154. def test_patma_006(self):
  155. x = False
  156. match 3:
  157. case 0 | 1 | 2 | 3:
  158. x = True
  159. self.assertIs(x, True)
  160. def test_patma_007(self):
  161. x = False
  162. match 4:
  163. case 0 | 1 | 2 | 3:
  164. x = True
  165. self.assertIs(x, False)
  166. def test_patma_008(self):
  167. x = 0
  168. class A:
  169. y = 1
  170. match x:
  171. case A.y as z:
  172. pass
  173. self.assertEqual(x, 0)
  174. self.assertEqual(A.y, 1)
  175. def test_patma_009(self):
  176. class A:
  177. B = 0
  178. match 0:
  179. case x if x:
  180. z = 0
  181. case _ as y if y == x and y:
  182. z = 1
  183. case A.B:
  184. z = 2
  185. self.assertEqual(A.B, 0)
  186. self.assertEqual(x, 0)
  187. self.assertEqual(y, 0)
  188. self.assertEqual(z, 2)
  189. def test_patma_010(self):
  190. match ():
  191. case []:
  192. x = 0
  193. self.assertEqual(x, 0)
  194. def test_patma_011(self):
  195. match (0, 1, 2):
  196. case [*x]:
  197. y = 0
  198. self.assertEqual(x, [0, 1, 2])
  199. self.assertEqual(y, 0)
  200. def test_patma_012(self):
  201. match (0, 1, 2):
  202. case [0, *x]:
  203. y = 0
  204. self.assertEqual(x, [1, 2])
  205. self.assertEqual(y, 0)
  206. def test_patma_013(self):
  207. match (0, 1, 2):
  208. case [0, 1, *x,]:
  209. y = 0
  210. self.assertEqual(x, [2])
  211. self.assertEqual(y, 0)
  212. def test_patma_014(self):
  213. match (0, 1, 2):
  214. case [0, 1, 2, *x]:
  215. y = 0
  216. self.assertEqual(x, [])
  217. self.assertEqual(y, 0)
  218. def test_patma_015(self):
  219. match (0, 1, 2):
  220. case [*x, 2,]:
  221. y = 0
  222. self.assertEqual(x, [0, 1])
  223. self.assertEqual(y, 0)
  224. def test_patma_016(self):
  225. match (0, 1, 2):
  226. case [*x, 1, 2]:
  227. y = 0
  228. self.assertEqual(x, [0])
  229. self.assertEqual(y, 0)
  230. def test_patma_017(self):
  231. match (0, 1, 2):
  232. case [*x, 0, 1, 2,]:
  233. y = 0
  234. self.assertEqual(x, [])
  235. self.assertEqual(y, 0)
  236. def test_patma_018(self):
  237. match (0, 1, 2):
  238. case [0, *x, 2]:
  239. y = 0
  240. self.assertEqual(x, [1])
  241. self.assertEqual(y, 0)
  242. def test_patma_019(self):
  243. match (0, 1, 2):
  244. case [0, 1, *x, 2,]:
  245. y = 0
  246. self.assertEqual(x, [])
  247. self.assertEqual(y, 0)
  248. def test_patma_020(self):
  249. match (0, 1, 2):
  250. case [0, *x, 1, 2]:
  251. y = 0
  252. self.assertEqual(x, [])
  253. self.assertEqual(y, 0)
  254. def test_patma_021(self):
  255. match (0, 1, 2):
  256. case [*x,]:
  257. y = 0
  258. self.assertEqual(x, [0, 1, 2])
  259. self.assertEqual(y, 0)
  260. def test_patma_022(self):
  261. x = {}
  262. match x:
  263. case {}:
  264. y = 0
  265. self.assertEqual(x, {})
  266. self.assertEqual(y, 0)
  267. def test_patma_023(self):
  268. x = {0: 0}
  269. match x:
  270. case {}:
  271. y = 0
  272. self.assertEqual(x, {0: 0})
  273. self.assertEqual(y, 0)
  274. def test_patma_024(self):
  275. x = {}
  276. y = None
  277. match x:
  278. case {0: 0}:
  279. y = 0
  280. self.assertEqual(x, {})
  281. self.assertIs(y, None)
  282. def test_patma_025(self):
  283. x = {0: 0}
  284. match x:
  285. case {0: (0 | 1 | 2 as z)}:
  286. y = 0
  287. self.assertEqual(x, {0: 0})
  288. self.assertEqual(y, 0)
  289. self.assertEqual(z, 0)
  290. def test_patma_026(self):
  291. x = {0: 1}
  292. match x:
  293. case {0: (0 | 1 | 2 as z)}:
  294. y = 0
  295. self.assertEqual(x, {0: 1})
  296. self.assertEqual(y, 0)
  297. self.assertEqual(z, 1)
  298. def test_patma_027(self):
  299. x = {0: 2}
  300. match x:
  301. case {0: (0 | 1 | 2 as z)}:
  302. y = 0
  303. self.assertEqual(x, {0: 2})
  304. self.assertEqual(y, 0)
  305. self.assertEqual(z, 2)
  306. def test_patma_028(self):
  307. x = {0: 3}
  308. y = None
  309. match x:
  310. case {0: (0 | 1 | 2 as z)}:
  311. y = 0
  312. self.assertEqual(x, {0: 3})
  313. self.assertIs(y, None)
  314. def test_patma_029(self):
  315. x = {}
  316. y = None
  317. match x:
  318. case {0: [1, 2, {}]}:
  319. y = 0
  320. case {0: [1, 2, {}], 1: [[]]}:
  321. y = 1
  322. case []:
  323. y = 2
  324. self.assertEqual(x, {})
  325. self.assertIs(y, None)
  326. def test_patma_030(self):
  327. x = {False: (True, 2.0, {})}
  328. match x:
  329. case {0: [1, 2, {}]}:
  330. y = 0
  331. case {0: [1, 2, {}], 1: [[]]}:
  332. y = 1
  333. case []:
  334. y = 2
  335. self.assertEqual(x, {False: (True, 2.0, {})})
  336. self.assertEqual(y, 0)
  337. def test_patma_031(self):
  338. x = {False: (True, 2.0, {}), 1: [[]], 2: 0}
  339. match x:
  340. case {0: [1, 2, {}]}:
  341. y = 0
  342. case {0: [1, 2, {}], 1: [[]]}:
  343. y = 1
  344. case []:
  345. y = 2
  346. self.assertEqual(x, {False: (True, 2.0, {}), 1: [[]], 2: 0})
  347. self.assertEqual(y, 0)
  348. def test_patma_032(self):
  349. x = {False: (True, 2.0, {}), 1: [[]], 2: 0}
  350. match x:
  351. case {0: [1, 2]}:
  352. y = 0
  353. case {0: [1, 2, {}], 1: [[]]}:
  354. y = 1
  355. case []:
  356. y = 2
  357. self.assertEqual(x, {False: (True, 2.0, {}), 1: [[]], 2: 0})
  358. self.assertEqual(y, 1)
  359. def test_patma_033(self):
  360. x = []
  361. match x:
  362. case {0: [1, 2, {}]}:
  363. y = 0
  364. case {0: [1, 2, {}], 1: [[]]}:
  365. y = 1
  366. case []:
  367. y = 2
  368. self.assertEqual(x, [])
  369. self.assertEqual(y, 2)
  370. def test_patma_034(self):
  371. x = {0: 0}
  372. match x:
  373. case {0: [1, 2, {}]}:
  374. y = 0
  375. case {0: ([1, 2, {}] | False)} | {1: [[]]} | {0: [1, 2, {}]} | [] | "X" | {}:
  376. y = 1
  377. case []:
  378. y = 2
  379. self.assertEqual(x, {0: 0})
  380. self.assertEqual(y, 1)
  381. def test_patma_035(self):
  382. x = {0: 0}
  383. match x:
  384. case {0: [1, 2, {}]}:
  385. y = 0
  386. case {0: [1, 2, {}] | True} | {1: [[]]} | {0: [1, 2, {}]} | [] | "X" | {}:
  387. y = 1
  388. case []:
  389. y = 2
  390. self.assertEqual(x, {0: 0})
  391. self.assertEqual(y, 1)
  392. def test_patma_036(self):
  393. x = 0
  394. match x:
  395. case 0 | 1 | 2:
  396. y = 0
  397. self.assertEqual(x, 0)
  398. self.assertEqual(y, 0)
  399. def test_patma_037(self):
  400. x = 1
  401. match x:
  402. case 0 | 1 | 2:
  403. y = 0
  404. self.assertEqual(x, 1)
  405. self.assertEqual(y, 0)
  406. def test_patma_038(self):
  407. x = 2
  408. match x:
  409. case 0 | 1 | 2:
  410. y = 0
  411. self.assertEqual(x, 2)
  412. self.assertEqual(y, 0)
  413. def test_patma_039(self):
  414. x = 3
  415. y = None
  416. match x:
  417. case 0 | 1 | 2:
  418. y = 0
  419. self.assertEqual(x, 3)
  420. self.assertIs(y, None)
  421. def test_patma_040(self):
  422. x = 0
  423. match x:
  424. case (0 as z) | (1 as z) | (2 as z) if z == x % 2:
  425. y = 0
  426. self.assertEqual(x, 0)
  427. self.assertEqual(y, 0)
  428. self.assertEqual(z, 0)
  429. def test_patma_041(self):
  430. x = 1
  431. match x:
  432. case (0 as z) | (1 as z) | (2 as z) if z == x % 2:
  433. y = 0
  434. self.assertEqual(x, 1)
  435. self.assertEqual(y, 0)
  436. self.assertEqual(z, 1)
  437. def test_patma_042(self):
  438. x = 2
  439. y = None
  440. match x:
  441. case (0 as z) | (1 as z) | (2 as z) if z == x % 2:
  442. y = 0
  443. self.assertEqual(x, 2)
  444. self.assertIs(y, None)
  445. self.assertEqual(z, 2)
  446. def test_patma_043(self):
  447. x = 3
  448. y = None
  449. match x:
  450. case (0 as z) | (1 as z) | (2 as z) if z == x % 2:
  451. y = 0
  452. self.assertEqual(x, 3)
  453. self.assertIs(y, None)
  454. def test_patma_044(self):
  455. x = ()
  456. match x:
  457. case []:
  458. y = 0
  459. self.assertEqual(x, ())
  460. self.assertEqual(y, 0)
  461. def test_patma_045(self):
  462. x = ()
  463. match x:
  464. case ():
  465. y = 0
  466. self.assertEqual(x, ())
  467. self.assertEqual(y, 0)
  468. def test_patma_046(self):
  469. x = (0,)
  470. match x:
  471. case [0]:
  472. y = 0
  473. self.assertEqual(x, (0,))
  474. self.assertEqual(y, 0)
  475. def test_patma_047(self):
  476. x = ((),)
  477. match x:
  478. case [[]]:
  479. y = 0
  480. self.assertEqual(x, ((),))
  481. self.assertEqual(y, 0)
  482. def test_patma_048(self):
  483. x = [0, 1]
  484. match x:
  485. case [0, 1] | [1, 0]:
  486. y = 0
  487. self.assertEqual(x, [0, 1])
  488. self.assertEqual(y, 0)
  489. def test_patma_049(self):
  490. x = [1, 0]
  491. match x:
  492. case [0, 1] | [1, 0]:
  493. y = 0
  494. self.assertEqual(x, [1, 0])
  495. self.assertEqual(y, 0)
  496. def test_patma_050(self):
  497. x = [0, 0]
  498. y = None
  499. match x:
  500. case [0, 1] | [1, 0]:
  501. y = 0
  502. self.assertEqual(x, [0, 0])
  503. self.assertIs(y, None)
  504. def test_patma_051(self):
  505. w = None
  506. x = [1, 0]
  507. match x:
  508. case [(0 as w)]:
  509. y = 0
  510. case [z] | [1, (0 | 1 as z)] | [z]:
  511. y = 1
  512. self.assertIs(w, None)
  513. self.assertEqual(x, [1, 0])
  514. self.assertEqual(y, 1)
  515. self.assertEqual(z, 0)
  516. def test_patma_052(self):
  517. x = [1, 0]
  518. match x:
  519. case [0]:
  520. y = 0
  521. case [1, 0] if (x := x[:0]):
  522. y = 1
  523. case [1, 0]:
  524. y = 2
  525. self.assertEqual(x, [])
  526. self.assertEqual(y, 2)
  527. def test_patma_053(self):
  528. x = {0}
  529. y = None
  530. match x:
  531. case [0]:
  532. y = 0
  533. self.assertEqual(x, {0})
  534. self.assertIs(y, None)
  535. def test_patma_054(self):
  536. x = set()
  537. y = None
  538. match x:
  539. case []:
  540. y = 0
  541. self.assertEqual(x, set())
  542. self.assertIs(y, None)
  543. def test_patma_055(self):
  544. x = iter([1, 2, 3])
  545. y = None
  546. match x:
  547. case []:
  548. y = 0
  549. self.assertEqual([*x], [1, 2, 3])
  550. self.assertIs(y, None)
  551. def test_patma_056(self):
  552. x = {}
  553. y = None
  554. match x:
  555. case []:
  556. y = 0
  557. self.assertEqual(x, {})
  558. self.assertIs(y, None)
  559. def test_patma_057(self):
  560. x = {0: False, 1: True}
  561. y = None
  562. match x:
  563. case [0, 1]:
  564. y = 0
  565. self.assertEqual(x, {0: False, 1: True})
  566. self.assertIs(y, None)
  567. def test_patma_058(self):
  568. x = 0
  569. match x:
  570. case 0:
  571. y = 0
  572. self.assertEqual(x, 0)
  573. self.assertEqual(y, 0)
  574. def test_patma_059(self):
  575. x = 0
  576. y = None
  577. match x:
  578. case False:
  579. y = 0
  580. self.assertEqual(x, 0)
  581. self.assertEqual(y, None)
  582. def test_patma_060(self):
  583. x = 0
  584. y = None
  585. match x:
  586. case 1:
  587. y = 0
  588. self.assertEqual(x, 0)
  589. self.assertIs(y, None)
  590. def test_patma_061(self):
  591. x = 0
  592. y = None
  593. match x:
  594. case None:
  595. y = 0
  596. self.assertEqual(x, 0)
  597. self.assertIs(y, None)
  598. def test_patma_062(self):
  599. x = 0
  600. match x:
  601. case 0:
  602. y = 0
  603. case 0:
  604. y = 1
  605. self.assertEqual(x, 0)
  606. self.assertEqual(y, 0)
  607. def test_patma_063(self):
  608. x = 0
  609. y = None
  610. match x:
  611. case 1:
  612. y = 0
  613. case 1:
  614. y = 1
  615. self.assertEqual(x, 0)
  616. self.assertIs(y, None)
  617. def test_patma_064(self):
  618. x = "x"
  619. match x:
  620. case "x":
  621. y = 0
  622. case "y":
  623. y = 1
  624. self.assertEqual(x, "x")
  625. self.assertEqual(y, 0)
  626. def test_patma_065(self):
  627. x = "x"
  628. match x:
  629. case "y":
  630. y = 0
  631. case "x":
  632. y = 1
  633. self.assertEqual(x, "x")
  634. self.assertEqual(y, 1)
  635. def test_patma_066(self):
  636. x = "x"
  637. match x:
  638. case "":
  639. y = 0
  640. case "x":
  641. y = 1
  642. self.assertEqual(x, "x")
  643. self.assertEqual(y, 1)
  644. def test_patma_067(self):
  645. x = b"x"
  646. match x:
  647. case b"y":
  648. y = 0
  649. case b"x":
  650. y = 1
  651. self.assertEqual(x, b"x")
  652. self.assertEqual(y, 1)
  653. def test_patma_068(self):
  654. x = 0
  655. match x:
  656. case 0 if False:
  657. y = 0
  658. case 0:
  659. y = 1
  660. self.assertEqual(x, 0)
  661. self.assertEqual(y, 1)
  662. def test_patma_069(self):
  663. x = 0
  664. y = None
  665. match x:
  666. case 0 if 0:
  667. y = 0
  668. case 0 if 0:
  669. y = 1
  670. self.assertEqual(x, 0)
  671. self.assertIs(y, None)
  672. def test_patma_070(self):
  673. x = 0
  674. match x:
  675. case 0 if True:
  676. y = 0
  677. case 0 if True:
  678. y = 1
  679. self.assertEqual(x, 0)
  680. self.assertEqual(y, 0)
  681. def test_patma_071(self):
  682. x = 0
  683. match x:
  684. case 0 if 1:
  685. y = 0
  686. case 0 if 1:
  687. y = 1
  688. self.assertEqual(x, 0)
  689. self.assertEqual(y, 0)
  690. def test_patma_072(self):
  691. x = 0
  692. match x:
  693. case 0 if True:
  694. y = 0
  695. case 0 if True:
  696. y = 1
  697. y = 2
  698. self.assertEqual(x, 0)
  699. self.assertEqual(y, 2)
  700. def test_patma_073(self):
  701. x = 0
  702. match x:
  703. case 0 if 0:
  704. y = 0
  705. case 0 if 1:
  706. y = 1
  707. y = 2
  708. self.assertEqual(x, 0)
  709. self.assertEqual(y, 2)
  710. def test_patma_074(self):
  711. x = 0
  712. y = None
  713. match x:
  714. case 0 if not (x := 1):
  715. y = 0
  716. case 1:
  717. y = 1
  718. self.assertEqual(x, 1)
  719. self.assertIs(y, None)
  720. def test_patma_075(self):
  721. x = "x"
  722. match x:
  723. case ["x"]:
  724. y = 0
  725. case "x":
  726. y = 1
  727. self.assertEqual(x, "x")
  728. self.assertEqual(y, 1)
  729. def test_patma_076(self):
  730. x = b"x"
  731. match x:
  732. case [b"x"]:
  733. y = 0
  734. case ["x"]:
  735. y = 1
  736. case [120]:
  737. y = 2
  738. case b"x":
  739. y = 4
  740. self.assertEqual(x, b"x")
  741. self.assertEqual(y, 4)
  742. def test_patma_077(self):
  743. x = bytearray(b"x")
  744. y = None
  745. match x:
  746. case [120]:
  747. y = 0
  748. case 120:
  749. y = 1
  750. self.assertEqual(x, b"x")
  751. self.assertIs(y, None)
  752. def test_patma_078(self):
  753. x = ""
  754. match x:
  755. case []:
  756. y = 0
  757. case [""]:
  758. y = 1
  759. case "":
  760. y = 2
  761. self.assertEqual(x, "")
  762. self.assertEqual(y, 2)
  763. def test_patma_079(self):
  764. x = "xxx"
  765. match x:
  766. case ["x", "x", "x"]:
  767. y = 0
  768. case ["xxx"]:
  769. y = 1
  770. case "xxx":
  771. y = 2
  772. self.assertEqual(x, "xxx")
  773. self.assertEqual(y, 2)
  774. def test_patma_080(self):
  775. x = b"xxx"
  776. match x:
  777. case [120, 120, 120]:
  778. y = 0
  779. case [b"xxx"]:
  780. y = 1
  781. case b"xxx":
  782. y = 2
  783. self.assertEqual(x, b"xxx")
  784. self.assertEqual(y, 2)
  785. def test_patma_081(self):
  786. x = 0
  787. match x:
  788. case 0 if not (x := 1):
  789. y = 0
  790. case (0 as z):
  791. y = 1
  792. self.assertEqual(x, 1)
  793. self.assertEqual(y, 1)
  794. self.assertEqual(z, 0)
  795. def test_patma_082(self):
  796. x = 0
  797. match x:
  798. case (1 as z) if not (x := 1):
  799. y = 0
  800. case 0:
  801. y = 1
  802. self.assertEqual(x, 0)
  803. self.assertEqual(y, 1)
  804. def test_patma_083(self):
  805. x = 0
  806. match x:
  807. case (0 as z):
  808. y = 0
  809. self.assertEqual(x, 0)
  810. self.assertEqual(y, 0)
  811. self.assertEqual(z, 0)
  812. def test_patma_084(self):
  813. x = 0
  814. y = None
  815. match x:
  816. case (1 as z):
  817. y = 0
  818. self.assertEqual(x, 0)
  819. self.assertIs(y, None)
  820. def test_patma_085(self):
  821. x = 0
  822. y = None
  823. match x:
  824. case (0 as z) if (w := 0):
  825. y = 0
  826. self.assertEqual(w, 0)
  827. self.assertEqual(x, 0)
  828. self.assertIs(y, None)
  829. self.assertEqual(z, 0)
  830. def test_patma_086(self):
  831. x = 0
  832. match x:
  833. case ((0 as w) as z):
  834. y = 0
  835. self.assertEqual(w, 0)
  836. self.assertEqual(x, 0)
  837. self.assertEqual(y, 0)
  838. self.assertEqual(z, 0)
  839. def test_patma_087(self):
  840. x = 0
  841. match x:
  842. case (0 | 1) | 2:
  843. y = 0
  844. self.assertEqual(x, 0)
  845. self.assertEqual(y, 0)
  846. def test_patma_088(self):
  847. x = 1
  848. match x:
  849. case (0 | 1) | 2:
  850. y = 0
  851. self.assertEqual(x, 1)
  852. self.assertEqual(y, 0)
  853. def test_patma_089(self):
  854. x = 2
  855. match x:
  856. case (0 | 1) | 2:
  857. y = 0
  858. self.assertEqual(x, 2)
  859. self.assertEqual(y, 0)
  860. def test_patma_090(self):
  861. x = 3
  862. y = None
  863. match x:
  864. case (0 | 1) | 2:
  865. y = 0
  866. self.assertEqual(x, 3)
  867. self.assertIs(y, None)
  868. def test_patma_091(self):
  869. x = 0
  870. match x:
  871. case 0 | (1 | 2):
  872. y = 0
  873. self.assertEqual(x, 0)
  874. self.assertEqual(y, 0)
  875. def test_patma_092(self):
  876. x = 1
  877. match x:
  878. case 0 | (1 | 2):
  879. y = 0
  880. self.assertEqual(x, 1)
  881. self.assertEqual(y, 0)
  882. def test_patma_093(self):
  883. x = 2
  884. match x:
  885. case 0 | (1 | 2):
  886. y = 0
  887. self.assertEqual(x, 2)
  888. self.assertEqual(y, 0)
  889. def test_patma_094(self):
  890. x = 3
  891. y = None
  892. match x:
  893. case 0 | (1 | 2):
  894. y = 0
  895. self.assertEqual(x, 3)
  896. self.assertIs(y, None)
  897. def test_patma_095(self):
  898. x = 0
  899. match x:
  900. case -0:
  901. y = 0
  902. self.assertEqual(x, 0)
  903. self.assertEqual(y, 0)
  904. def test_patma_096(self):
  905. x = 0
  906. match x:
  907. case -0.0:
  908. y = 0
  909. self.assertEqual(x, 0)
  910. self.assertEqual(y, 0)
  911. def test_patma_097(self):
  912. x = 0
  913. match x:
  914. case -0j:
  915. y = 0
  916. self.assertEqual(x, 0)
  917. self.assertEqual(y, 0)
  918. def test_patma_098(self):
  919. x = 0
  920. match x:
  921. case -0.0j:
  922. y = 0
  923. self.assertEqual(x, 0)
  924. self.assertEqual(y, 0)
  925. def test_patma_099(self):
  926. x = -1
  927. match x:
  928. case -1:
  929. y = 0
  930. self.assertEqual(x, -1)
  931. self.assertEqual(y, 0)
  932. def test_patma_100(self):
  933. x = -1.5
  934. match x:
  935. case -1.5:
  936. y = 0
  937. self.assertEqual(x, -1.5)
  938. self.assertEqual(y, 0)
  939. def test_patma_101(self):
  940. x = -1j
  941. match x:
  942. case -1j:
  943. y = 0
  944. self.assertEqual(x, -1j)
  945. self.assertEqual(y, 0)
  946. def test_patma_102(self):
  947. x = -1.5j
  948. match x:
  949. case -1.5j:
  950. y = 0
  951. self.assertEqual(x, -1.5j)
  952. self.assertEqual(y, 0)
  953. def test_patma_103(self):
  954. x = 0
  955. match x:
  956. case 0 + 0j:
  957. y = 0
  958. self.assertEqual(x, 0)
  959. self.assertEqual(y, 0)
  960. def test_patma_104(self):
  961. x = 0
  962. match x:
  963. case 0 - 0j:
  964. y = 0
  965. self.assertEqual(x, 0)
  966. self.assertEqual(y, 0)
  967. def test_patma_105(self):
  968. x = 0
  969. match x:
  970. case -0 + 0j:
  971. y = 0
  972. self.assertEqual(x, 0)
  973. self.assertEqual(y, 0)
  974. def test_patma_106(self):
  975. x = 0
  976. match x:
  977. case -0 - 0j:
  978. y = 0
  979. self.assertEqual(x, 0)
  980. self.assertEqual(y, 0)
  981. def test_patma_107(self):
  982. x = 0.25 + 1.75j
  983. match x:
  984. case 0.25 + 1.75j:
  985. y = 0
  986. self.assertEqual(x, 0.25 + 1.75j)
  987. self.assertEqual(y, 0)
  988. def test_patma_108(self):
  989. x = 0.25 - 1.75j
  990. match x:
  991. case 0.25 - 1.75j:
  992. y = 0
  993. self.assertEqual(x, 0.25 - 1.75j)
  994. self.assertEqual(y, 0)
  995. def test_patma_109(self):
  996. x = -0.25 + 1.75j
  997. match x:
  998. case -0.25 + 1.75j:
  999. y = 0
  1000. self.assertEqual(x, -0.25 + 1.75j)
  1001. self.assertEqual(y, 0)
  1002. def test_patma_110(self):
  1003. x = -0.25 - 1.75j
  1004. match x:
  1005. case -0.25 - 1.75j:
  1006. y = 0
  1007. self.assertEqual(x, -0.25 - 1.75j)
  1008. self.assertEqual(y, 0)
  1009. def test_patma_111(self):
  1010. class A:
  1011. B = 0
  1012. x = 0
  1013. match x:
  1014. case A.B:
  1015. y = 0
  1016. self.assertEqual(A.B, 0)
  1017. self.assertEqual(x, 0)
  1018. self.assertEqual(y, 0)
  1019. def test_patma_112(self):
  1020. class A:
  1021. class B:
  1022. C = 0
  1023. x = 0
  1024. match x:
  1025. case A.B.C:
  1026. y = 0
  1027. self.assertEqual(A.B.C, 0)
  1028. self.assertEqual(x, 0)
  1029. self.assertEqual(y, 0)
  1030. def test_patma_113(self):
  1031. class A:
  1032. class B:
  1033. C = 0
  1034. D = 1
  1035. x = 1
  1036. match x:
  1037. case A.B.C:
  1038. y = 0
  1039. case A.B.D:
  1040. y = 1
  1041. self.assertEqual(A.B.C, 0)
  1042. self.assertEqual(A.B.D, 1)
  1043. self.assertEqual(x, 1)
  1044. self.assertEqual(y, 1)
  1045. def test_patma_114(self):
  1046. class A:
  1047. class B:
  1048. class C:
  1049. D = 0
  1050. x = 0
  1051. match x:
  1052. case A.B.C.D:
  1053. y = 0
  1054. self.assertEqual(A.B.C.D, 0)
  1055. self.assertEqual(x, 0)
  1056. self.assertEqual(y, 0)
  1057. def test_patma_115(self):
  1058. class A:
  1059. class B:
  1060. class C:
  1061. D = 0
  1062. E = 1
  1063. x = 1
  1064. match x:
  1065. case A.B.C.D:
  1066. y = 0
  1067. case A.B.C.E:
  1068. y = 1
  1069. self.assertEqual(A.B.C.D, 0)
  1070. self.assertEqual(A.B.C.E, 1)
  1071. self.assertEqual(x, 1)
  1072. self.assertEqual(y, 1)
  1073. def test_patma_116(self):
  1074. match = case = 0
  1075. match match:
  1076. case case:
  1077. x = 0
  1078. self.assertEqual(match, 0)
  1079. self.assertEqual(case, 0)
  1080. self.assertEqual(x, 0)
  1081. def test_patma_117(self):
  1082. match = case = 0
  1083. match case:
  1084. case match:
  1085. x = 0
  1086. self.assertEqual(match, 0)
  1087. self.assertEqual(case, 0)
  1088. self.assertEqual(x, 0)
  1089. def test_patma_118(self):
  1090. x = []
  1091. match x:
  1092. case [*_, _]:
  1093. y = 0
  1094. case []:
  1095. y = 1
  1096. self.assertEqual(x, [])
  1097. self.assertEqual(y, 1)
  1098. def test_patma_119(self):
  1099. x = collections.defaultdict(int)
  1100. match x:
  1101. case {0: 0}:
  1102. y = 0
  1103. case {}:
  1104. y = 1
  1105. self.assertEqual(x, {})
  1106. self.assertEqual(y, 1)
  1107. def test_patma_120(self):
  1108. x = collections.defaultdict(int)
  1109. match x:
  1110. case {0: 0}:
  1111. y = 0
  1112. case {**z}:
  1113. y = 1
  1114. self.assertEqual(x, {})
  1115. self.assertEqual(y, 1)
  1116. self.assertEqual(z, {})
  1117. def test_patma_121(self):
  1118. match ():
  1119. case ():
  1120. x = 0
  1121. self.assertEqual(x, 0)
  1122. def test_patma_122(self):
  1123. match (0, 1, 2):
  1124. case (*x,):
  1125. y = 0
  1126. self.assertEqual(x, [0, 1, 2])
  1127. self.assertEqual(y, 0)
  1128. def test_patma_123(self):
  1129. match (0, 1, 2):
  1130. case 0, *x:
  1131. y = 0
  1132. self.assertEqual(x, [1, 2])
  1133. self.assertEqual(y, 0)
  1134. def test_patma_124(self):
  1135. match (0, 1, 2):
  1136. case (0, 1, *x,):
  1137. y = 0
  1138. self.assertEqual(x, [2])
  1139. self.assertEqual(y, 0)
  1140. def test_patma_125(self):
  1141. match (0, 1, 2):
  1142. case 0, 1, 2, *x:
  1143. y = 0
  1144. self.assertEqual(x, [])
  1145. self.assertEqual(y, 0)
  1146. def test_patma_126(self):
  1147. match (0, 1, 2):
  1148. case *x, 2,:
  1149. y = 0
  1150. self.assertEqual(x, [0, 1])
  1151. self.assertEqual(y, 0)
  1152. def test_patma_127(self):
  1153. match (0, 1, 2):
  1154. case (*x, 1, 2):
  1155. y = 0
  1156. self.assertEqual(x, [0])
  1157. self.assertEqual(y, 0)
  1158. def test_patma_128(self):
  1159. match (0, 1, 2):
  1160. case *x, 0, 1, 2,:
  1161. y = 0
  1162. self.assertEqual(x, [])
  1163. self.assertEqual(y, 0)
  1164. def test_patma_129(self):
  1165. match (0, 1, 2):
  1166. case (0, *x, 2):
  1167. y = 0
  1168. self.assertEqual(x, [1])
  1169. self.assertEqual(y, 0)
  1170. def test_patma_130(self):
  1171. match (0, 1, 2):
  1172. case 0, 1, *x, 2,:
  1173. y = 0
  1174. self.assertEqual(x, [])
  1175. self.assertEqual(y, 0)
  1176. def test_patma_131(self):
  1177. match (0, 1, 2):
  1178. case (0, *x, 1, 2):
  1179. y = 0
  1180. self.assertEqual(x, [])
  1181. self.assertEqual(y, 0)
  1182. def test_patma_132(self):
  1183. match (0, 1, 2):
  1184. case *x,:
  1185. y = 0
  1186. self.assertEqual(x, [0, 1, 2])
  1187. self.assertEqual(y, 0)
  1188. def test_patma_133(self):
  1189. x = collections.defaultdict(int, {0: 1})
  1190. match x:
  1191. case {1: 0}:
  1192. y = 0
  1193. case {0: 0}:
  1194. y = 1
  1195. case {}:
  1196. y = 2
  1197. self.assertEqual(x, {0: 1})
  1198. self.assertEqual(y, 2)
  1199. def test_patma_134(self):
  1200. x = collections.defaultdict(int, {0: 1})
  1201. match x:
  1202. case {1: 0}:
  1203. y = 0
  1204. case {0: 0}:
  1205. y = 1
  1206. case {**z}:
  1207. y = 2
  1208. self.assertEqual(x, {0: 1})
  1209. self.assertEqual(y, 2)
  1210. self.assertEqual(z, {0: 1})
  1211. def test_patma_135(self):
  1212. x = collections.defaultdict(int, {0: 1})
  1213. match x:
  1214. case {1: 0}:
  1215. y = 0
  1216. case {0: 0}:
  1217. y = 1
  1218. case {0: _, **z}:
  1219. y = 2
  1220. self.assertEqual(x, {0: 1})
  1221. self.assertEqual(y, 2)
  1222. self.assertEqual(z, {})
  1223. def test_patma_136(self):
  1224. x = {0: 1}
  1225. match x:
  1226. case {1: 0}:
  1227. y = 0
  1228. case {0: 0}:
  1229. y = 0
  1230. case {}:
  1231. y = 1
  1232. self.assertEqual(x, {0: 1})
  1233. self.assertEqual(y, 1)
  1234. def test_patma_137(self):
  1235. x = {0: 1}
  1236. match x:
  1237. case {1: 0}:
  1238. y = 0
  1239. case {0: 0}:
  1240. y = 0
  1241. case {**z}:
  1242. y = 1
  1243. self.assertEqual(x, {0: 1})
  1244. self.assertEqual(y, 1)
  1245. self.assertEqual(z, {0: 1})
  1246. def test_patma_138(self):
  1247. x = {0: 1}
  1248. match x:
  1249. case {1: 0}:
  1250. y = 0
  1251. case {0: 0}:
  1252. y = 0
  1253. case {0: _, **z}:
  1254. y = 1
  1255. self.assertEqual(x, {0: 1})
  1256. self.assertEqual(y, 1)
  1257. self.assertEqual(z, {})
  1258. def test_patma_139(self):
  1259. x = False
  1260. match x:
  1261. case bool(z):
  1262. y = 0
  1263. self.assertIs(x, False)
  1264. self.assertEqual(y, 0)
  1265. self.assertIs(z, x)
  1266. def test_patma_140(self):
  1267. x = True
  1268. match x:
  1269. case bool(z):
  1270. y = 0
  1271. self.assertIs(x, True)
  1272. self.assertEqual(y, 0)
  1273. self.assertIs(z, x)
  1274. def test_patma_141(self):
  1275. x = bytearray()
  1276. match x:
  1277. case bytearray(z):
  1278. y = 0
  1279. self.assertEqual(x, bytearray())
  1280. self.assertEqual(y, 0)
  1281. self.assertIs(z, x)
  1282. def test_patma_142(self):
  1283. x = b""
  1284. match x:
  1285. case bytes(z):
  1286. y = 0
  1287. self.assertEqual(x, b"")
  1288. self.assertEqual(y, 0)
  1289. self.assertIs(z, x)
  1290. def test_patma_143(self):
  1291. x = {}
  1292. match x:
  1293. case dict(z):
  1294. y = 0
  1295. self.assertEqual(x, {})
  1296. self.assertEqual(y, 0)
  1297. self.assertIs(z, x)
  1298. def test_patma_144(self):
  1299. x = 0.0
  1300. match x:
  1301. case float(z):
  1302. y = 0
  1303. self.assertEqual(x, 0.0)
  1304. self.assertEqual(y, 0)
  1305. self.assertIs(z, x)
  1306. def test_patma_145(self):
  1307. x = frozenset()
  1308. match x:
  1309. case frozenset(z):
  1310. y = 0
  1311. self.assertEqual(x, frozenset())
  1312. self.assertEqual(y, 0)
  1313. self.assertIs(z, x)
  1314. def test_patma_146(self):
  1315. x = 0
  1316. match x:
  1317. case int(z):
  1318. y = 0
  1319. self.assertEqual(x, 0)
  1320. self.assertEqual(y, 0)
  1321. self.assertIs(z, x)
  1322. def test_patma_147(self):
  1323. x = []
  1324. match x:
  1325. case list(z):
  1326. y = 0
  1327. self.assertEqual(x, [])
  1328. self.assertEqual(y, 0)
  1329. self.assertIs(z, x)
  1330. def test_patma_148(self):
  1331. x = set()
  1332. match x:
  1333. case set(z):
  1334. y = 0
  1335. self.assertEqual(x, set())
  1336. self.assertEqual(y, 0)
  1337. self.assertIs(z, x)
  1338. def test_patma_149(self):
  1339. x = ""
  1340. match x:
  1341. case str(z):
  1342. y = 0
  1343. self.assertEqual(x, "")
  1344. self.assertEqual(y, 0)
  1345. self.assertIs(z, x)
  1346. def test_patma_150(self):
  1347. x = ()
  1348. match x:
  1349. case tuple(z):
  1350. y = 0
  1351. self.assertEqual(x, ())
  1352. self.assertEqual(y, 0)
  1353. self.assertIs(z, x)
  1354. def test_patma_151(self):
  1355. x = 0
  1356. match x,:
  1357. case y,:
  1358. z = 0
  1359. self.assertEqual(x, 0)
  1360. self.assertIs(y, x)
  1361. self.assertIs(z, 0)
  1362. def test_patma_152(self):
  1363. w = 0
  1364. x = 0
  1365. match w, x:
  1366. case y, z:
  1367. v = 0
  1368. self.assertEqual(w, 0)
  1369. self.assertEqual(x, 0)
  1370. self.assertIs(y, w)
  1371. self.assertIs(z, x)
  1372. self.assertEqual(v, 0)
  1373. def test_patma_153(self):
  1374. x = 0
  1375. match w := x,:
  1376. case y as v,:
  1377. z = 0
  1378. self.assertEqual(x, 0)
  1379. self.assertIs(y, x)
  1380. self.assertEqual(z, 0)
  1381. self.assertIs(w, x)
  1382. self.assertIs(v, y)
  1383. def test_patma_154(self):
  1384. x = 0
  1385. y = None
  1386. match x:
  1387. case 0 if x:
  1388. y = 0
  1389. self.assertEqual(x, 0)
  1390. self.assertIs(y, None)
  1391. def test_patma_155(self):
  1392. x = 0
  1393. y = None
  1394. match x:
  1395. case 1e1000:
  1396. y = 0
  1397. self.assertEqual(x, 0)
  1398. self.assertIs(y, None)
  1399. def test_patma_156(self):
  1400. x = 0
  1401. match x:
  1402. case z:
  1403. y = 0
  1404. self.assertEqual(x, 0)
  1405. self.assertEqual(y, 0)
  1406. self.assertIs(z, x)
  1407. def test_patma_157(self):
  1408. x = 0
  1409. y = None
  1410. match x:
  1411. case _ if x:
  1412. y = 0
  1413. self.assertEqual(x, 0)
  1414. self.assertIs(y, None)
  1415. def test_patma_158(self):
  1416. x = 0
  1417. match x:
  1418. case -1e1000:
  1419. y = 0
  1420. case 0:
  1421. y = 1
  1422. self.assertEqual(x, 0)
  1423. self.assertEqual(y, 1)
  1424. def test_patma_159(self):
  1425. x = 0
  1426. match x:
  1427. case 0 if not x:
  1428. y = 0
  1429. case 1:
  1430. y = 1
  1431. self.assertEqual(x, 0)
  1432. self.assertEqual(y, 0)
  1433. def test_patma_160(self):
  1434. x = 0
  1435. z = None
  1436. match x:
  1437. case 0:
  1438. y = 0
  1439. case z if x:
  1440. y = 1
  1441. self.assertEqual(x, 0)
  1442. self.assertEqual(y, 0)
  1443. self.assertIs(z, None)
  1444. def test_patma_161(self):
  1445. x = 0
  1446. match x:
  1447. case 0:
  1448. y = 0
  1449. case _:
  1450. y = 1
  1451. self.assertEqual(x, 0)
  1452. self.assertEqual(y, 0)
  1453. def test_patma_162(self):
  1454. x = 0
  1455. match x:
  1456. case 1 if x:
  1457. y = 0
  1458. case 0:
  1459. y = 1
  1460. self.assertEqual(x, 0)
  1461. self.assertEqual(y, 1)
  1462. def test_patma_163(self):
  1463. x = 0
  1464. y = None
  1465. match x:
  1466. case 1:
  1467. y = 0
  1468. case 1 if not x:
  1469. y = 1
  1470. self.assertEqual(x, 0)
  1471. self.assertIs(y, None)
  1472. def test_patma_164(self):
  1473. x = 0
  1474. match x:
  1475. case 1:
  1476. y = 0
  1477. case z:
  1478. y = 1
  1479. self.assertEqual(x, 0)
  1480. self.assertEqual(y, 1)
  1481. self.assertIs(z, x)
  1482. def test_patma_165(self):
  1483. x = 0
  1484. match x:
  1485. case 1 if x:
  1486. y = 0
  1487. case _:
  1488. y = 1
  1489. self.assertEqual(x, 0)
  1490. self.assertEqual(y, 1)
  1491. def test_patma_166(self):
  1492. x = 0
  1493. match x:
  1494. case z if not z:
  1495. y = 0
  1496. case 0 if x:
  1497. y = 1
  1498. self.assertEqual(x, 0)
  1499. self.assertEqual(y, 0)
  1500. self.assertIs(z, x)
  1501. def test_patma_167(self):
  1502. x = 0
  1503. match x:
  1504. case z if not z:
  1505. y = 0
  1506. case 1:
  1507. y = 1
  1508. self.assertEqual(x, 0)
  1509. self.assertEqual(y, 0)
  1510. self.assertIs(z, x)
  1511. def test_patma_168(self):
  1512. x = 0
  1513. match x:
  1514. case z if not x:
  1515. y = 0
  1516. case z:
  1517. y = 1
  1518. self.assertEqual(x, 0)
  1519. self.assertEqual(y, 0)
  1520. self.assertIs(z, x)
  1521. def test_patma_169(self):
  1522. x = 0
  1523. match x:
  1524. case z if not z:
  1525. y = 0
  1526. case _ if x:
  1527. y = 1
  1528. self.assertEqual(x, 0)
  1529. self.assertEqual(y, 0)
  1530. self.assertIs(z, x)
  1531. def test_patma_170(self):
  1532. x = 0
  1533. match x:
  1534. case _ if not x:
  1535. y = 0
  1536. case 0:
  1537. y = 1
  1538. self.assertEqual(x, 0)
  1539. self.assertEqual(y, 0)
  1540. def test_patma_171(self):
  1541. x = 0
  1542. y = None
  1543. match x:
  1544. case _ if x:
  1545. y = 0
  1546. case 1:
  1547. y = 1
  1548. self.assertEqual(x, 0)
  1549. self.assertIs(y, None)
  1550. def test_patma_172(self):
  1551. x = 0
  1552. z = None
  1553. match x:
  1554. case _ if not x:
  1555. y = 0
  1556. case z if not x:
  1557. y = 1
  1558. self.assertEqual(x, 0)
  1559. self.assertEqual(y, 0)
  1560. self.assertIs(z, None)
  1561. def test_patma_173(self):
  1562. x = 0
  1563. match x:
  1564. case _ if not x:
  1565. y = 0
  1566. case _:
  1567. y = 1
  1568. self.assertEqual(x, 0)
  1569. self.assertEqual(y, 0)
  1570. def test_patma_174(self):
  1571. def http_error(status):
  1572. match status:
  1573. case 400:
  1574. return "Bad request"
  1575. case 401:
  1576. return "Unauthorized"
  1577. case 403:
  1578. return "Forbidden"
  1579. case 404:
  1580. return "Not found"
  1581. case 418:
  1582. return "I'm a teapot"
  1583. case _:
  1584. return "Something else"
  1585. self.assertEqual(http_error(400), "Bad request")
  1586. self.assertEqual(http_error(401), "Unauthorized")
  1587. self.assertEqual(http_error(403), "Forbidden")
  1588. self.assertEqual(http_error(404), "Not found")
  1589. self.assertEqual(http_error(418), "I'm a teapot")
  1590. self.assertEqual(http_error(123), "Something else")
  1591. self.assertEqual(http_error("400"), "Something else")
  1592. self.assertEqual(http_error(401 | 403 | 404), "Something else") # 407
  1593. def test_patma_175(self):
  1594. def http_error(status):
  1595. match status:
  1596. case 400:
  1597. return "Bad request"
  1598. case 401 | 403 | 404:
  1599. return "Not allowed"
  1600. case 418:
  1601. return "I'm a teapot"
  1602. self.assertEqual(http_error(400), "Bad request")
  1603. self.assertEqual(http_error(401), "Not allowed")
  1604. self.assertEqual(http_error(403), "Not allowed")
  1605. self.assertEqual(http_error(404), "Not allowed")
  1606. self.assertEqual(http_error(418), "I'm a teapot")
  1607. self.assertIs(http_error(123), None)
  1608. self.assertIs(http_error("400"), None)
  1609. self.assertIs(http_error(401 | 403 | 404), None) # 407
  1610. def test_patma_176(self):
  1611. def whereis(point):
  1612. match point:
  1613. case (0, 0):
  1614. return "Origin"
  1615. case (0, y):
  1616. return f"Y={y}"
  1617. case (x, 0):
  1618. return f"X={x}"
  1619. case (x, y):
  1620. return f"X={x}, Y={y}"
  1621. case _:
  1622. return "Not a point"
  1623. self.assertEqual(whereis((0, 0)), "Origin")
  1624. self.assertEqual(whereis((0, -1.0)), "Y=-1.0")
  1625. self.assertEqual(whereis(("X", 0)), "X=X")
  1626. self.assertEqual(whereis((None, 1j)), "X=None, Y=1j")
  1627. self.assertEqual(whereis(42), "Not a point")
  1628. def test_patma_177(self):
  1629. def whereis(point):
  1630. match point:
  1631. case Point(0, 0):
  1632. return "Origin"
  1633. case Point(0, y):
  1634. return f"Y={y}"
  1635. case Point(x, 0):
  1636. return f"X={x}"
  1637. case Point():
  1638. return "Somewhere else"
  1639. case _:
  1640. return "Not a point"
  1641. self.assertEqual(whereis(Point(1, 0)), "X=1")
  1642. self.assertEqual(whereis(Point(0, 0)), "Origin")
  1643. self.assertEqual(whereis(10), "Not a point")
  1644. self.assertEqual(whereis(Point(False, False)), "Origin")
  1645. self.assertEqual(whereis(Point(0, -1.0)), "Y=-1.0")
  1646. self.assertEqual(whereis(Point("X", 0)), "X=X")
  1647. self.assertEqual(whereis(Point(None, 1j)), "Somewhere else")
  1648. self.assertEqual(whereis(Point), "Not a point")
  1649. self.assertEqual(whereis(42), "Not a point")
  1650. def test_patma_178(self):
  1651. def whereis(point):
  1652. match point:
  1653. case Point(1, var):
  1654. return var
  1655. self.assertEqual(whereis(Point(1, 0)), 0)
  1656. self.assertIs(whereis(Point(0, 0)), None)
  1657. def test_patma_179(self):
  1658. def whereis(point):
  1659. match point:
  1660. case Point(1, y=var):
  1661. return var
  1662. self.assertEqual(whereis(Point(1, 0)), 0)
  1663. self.assertIs(whereis(Point(0, 0)), None)
  1664. def test_patma_180(self):
  1665. def whereis(point):
  1666. match point:
  1667. case Point(x=1, y=var):
  1668. return var
  1669. self.assertEqual(whereis(Point(1, 0)), 0)
  1670. self.assertIs(whereis(Point(0, 0)), None)
  1671. def test_patma_181(self):
  1672. def whereis(point):
  1673. match point:
  1674. case Point(y=var, x=1):
  1675. return var
  1676. self.assertEqual(whereis(Point(1, 0)), 0)
  1677. self.assertIs(whereis(Point(0, 0)), None)
  1678. def test_patma_182(self):
  1679. def whereis(points):
  1680. match points:
  1681. case []:
  1682. return "No points"
  1683. case [Point(0, 0)]:
  1684. return "The origin"
  1685. case [Point(x, y)]:
  1686. return f"Single point {x}, {y}"
  1687. case [Point(0, y1), Point(0, y2)]:
  1688. return f"Two on the Y axis at {y1}, {y2}"
  1689. case _:
  1690. return "Something else"
  1691. self.assertEqual(whereis([]), "No points")
  1692. self.assertEqual(whereis([Point(0, 0)]), "The origin")
  1693. self.assertEqual(whereis([Point(0, 1)]), "Single point 0, 1")
  1694. self.assertEqual(whereis([Point(0, 0), Point(0, 0)]), "Two on the Y axis at 0, 0")
  1695. self.assertEqual(whereis([Point(0, 1), Point(0, 1)]), "Two on the Y axis at 1, 1")
  1696. self.assertEqual(whereis([Point(0, 0), Point(1, 0)]), "Something else")
  1697. self.assertEqual(whereis([Point(0, 0), Point(0, 0), Point(0, 0)]), "Something else")
  1698. self.assertEqual(whereis([Point(0, 1), Point(0, 1), Point(0, 1)]), "Something else")
  1699. def test_patma_183(self):
  1700. def whereis(point):
  1701. match point:
  1702. case Point(x, y) if x == y:
  1703. return f"Y=X at {x}"
  1704. case Point(x, y):
  1705. return "Not on the diagonal"
  1706. self.assertEqual(whereis(Point(0, 0)), "Y=X at 0")
  1707. self.assertEqual(whereis(Point(0, False)), "Y=X at 0")
  1708. self.assertEqual(whereis(Point(False, 0)), "Y=X at False")
  1709. self.assertEqual(whereis(Point(-1 - 1j, -1 - 1j)), "Y=X at (-1-1j)")
  1710. self.assertEqual(whereis(Point("X", "X")), "Y=X at X")
  1711. self.assertEqual(whereis(Point("X", "x")), "Not on the diagonal")
  1712. def test_patma_184(self):
  1713. class Seq(collections.abc.Sequence):
  1714. __getitem__ = None
  1715. def __len__(self):
  1716. return 0
  1717. match Seq():
  1718. case []:
  1719. y = 0
  1720. self.assertEqual(y, 0)
  1721. def test_patma_185(self):
  1722. class Seq(collections.abc.Sequence):
  1723. __getitem__ = None
  1724. def __len__(self):
  1725. return 42
  1726. match Seq():
  1727. case [*_]:
  1728. y = 0
  1729. self.assertEqual(y, 0)
  1730. def test_patma_186(self):
  1731. class Seq(collections.abc.Sequence):
  1732. def __getitem__(self, i):
  1733. return i
  1734. def __len__(self):
  1735. return 42
  1736. match Seq():
  1737. case [x, *_, y]:
  1738. z = 0
  1739. self.assertEqual(x, 0)
  1740. self.assertEqual(y, 41)
  1741. self.assertEqual(z, 0)
  1742. def test_patma_187(self):
  1743. w = range(10)
  1744. match w:
  1745. case [x, y, *rest]:
  1746. z = 0
  1747. self.assertEqual(w, range(10))
  1748. self.assertEqual(x, 0)
  1749. self.assertEqual(y, 1)
  1750. self.assertEqual(z, 0)
  1751. self.assertEqual(rest, list(range(2, 10)))
  1752. def test_patma_188(self):
  1753. w = range(100)
  1754. match w:
  1755. case (x, y, *rest):
  1756. z = 0
  1757. self.assertEqual(w, range(100))
  1758. self.assertEqual(x, 0)
  1759. self.assertEqual(y, 1)
  1760. self.assertEqual(z, 0)
  1761. self.assertEqual(rest, list(range(2, 100)))
  1762. def test_patma_189(self):
  1763. w = range(1000)
  1764. match w:
  1765. case x, y, *rest:
  1766. z = 0
  1767. self.assertEqual(w, range(1000))
  1768. self.assertEqual(x, 0)
  1769. self.assertEqual(y, 1)
  1770. self.assertEqual(z, 0)
  1771. self.assertEqual(rest, list(range(2, 1000)))
  1772. def test_patma_190(self):
  1773. w = range(1 << 10)
  1774. match w:
  1775. case [x, y, *_]:
  1776. z = 0
  1777. self.assertEqual(w, range(1 << 10))
  1778. self.assertEqual(x, 0)
  1779. self.assertEqual(y, 1)
  1780. self.assertEqual(z, 0)
  1781. def test_patma_191(self):
  1782. w = range(1 << 20)
  1783. match w:
  1784. case (x, y, *_):
  1785. z = 0
  1786. self.assertEqual(w, range(1 << 20))
  1787. self.assertEqual(x, 0)
  1788. self.assertEqual(y, 1)
  1789. self.assertEqual(z, 0)
  1790. def test_patma_192(self):
  1791. w = range(1 << 30)
  1792. match w:
  1793. case x, y, *_:
  1794. z = 0
  1795. self.assertEqual(w, range(1 << 30))
  1796. self.assertEqual(x, 0)
  1797. self.assertEqual(y, 1)
  1798. self.assertEqual(z, 0)
  1799. def test_patma_193(self):
  1800. x = {"bandwidth": 0, "latency": 1}
  1801. match x:
  1802. case {"bandwidth": b, "latency": l}:
  1803. y = 0
  1804. self.assertEqual(x, {"bandwidth": 0, "latency": 1})
  1805. self.assertIs(b, x["bandwidth"])
  1806. self.assertIs(l, x["latency"])
  1807. self.assertEqual(y, 0)
  1808. def test_patma_194(self):
  1809. x = {"bandwidth": 0, "latency": 1, "key": "value"}
  1810. match x:
  1811. case {"latency": l, "bandwidth": b}:
  1812. y = 0
  1813. self.assertEqual(x, {"bandwidth": 0, "latency": 1, "key": "value"})
  1814. self.assertIs(l, x["latency"])
  1815. self.assertIs(b, x["bandwidth"])
  1816. self.assertEqual(y, 0)
  1817. def test_patma_195(self):
  1818. x = {"bandwidth": 0, "latency": 1, "key": "value"}
  1819. match x:
  1820. case {"bandwidth": b, "latency": l, **rest}:
  1821. y = 0
  1822. self.assertEqual(x, {"bandwidth": 0, "latency": 1, "key": "value"})
  1823. self.assertIs(b, x["bandwidth"])
  1824. self.assertIs(l, x["latency"])
  1825. self.assertEqual(rest, {"key": "value"})
  1826. self.assertEqual(y, 0)
  1827. def test_patma_196(self):
  1828. x = {"bandwidth": 0, "latency": 1}
  1829. match x:
  1830. case {"latency": l, "bandwidth": b, **rest}:
  1831. y = 0
  1832. self.assertEqual(x, {"bandwidth": 0, "latency": 1})
  1833. self.assertIs(l, x["latency"])
  1834. self.assertIs(b, x["bandwidth"])
  1835. self.assertEqual(rest, {})
  1836. self.assertEqual(y, 0)
  1837. def test_patma_197(self):
  1838. w = [Point(-1, 0), Point(1, 2)]
  1839. match w:
  1840. case (Point(x1, y1), Point(x2, y2) as p2):
  1841. z = 0
  1842. self.assertEqual(w, [Point(-1, 0), Point(1, 2)])
  1843. self.assertIs(x1, w[0].x)
  1844. self.assertIs(y1, w[0].y)
  1845. self.assertIs(p2, w[1])
  1846. self.assertIs(x2, w[1].x)
  1847. self.assertIs(y2, w[1].y)
  1848. self.assertIs(z, 0)
  1849. def test_patma_198(self):
  1850. class Color(enum.Enum):
  1851. RED = 0
  1852. GREEN = 1
  1853. BLUE = 2
  1854. def f(color):
  1855. match color:
  1856. case Color.RED:
  1857. return "I see red!"
  1858. case Color.GREEN:
  1859. return "Grass is green"
  1860. case Color.BLUE:
  1861. return "I'm feeling the blues :("
  1862. self.assertEqual(f(Color.RED), "I see red!")
  1863. self.assertEqual(f(Color.GREEN), "Grass is green")
  1864. self.assertEqual(f(Color.BLUE), "I'm feeling the blues :(")
  1865. self.assertIs(f(Color), None)
  1866. self.assertIs(f(0), None)
  1867. self.assertIs(f(1), None)
  1868. self.assertIs(f(2), None)
  1869. self.assertIs(f(3), None)
  1870. self.assertIs(f(False), None)
  1871. self.assertIs(f(True), None)
  1872. self.assertIs(f(2+0j), None)
  1873. self.assertIs(f(3.0), None)
  1874. def test_patma_199(self):
  1875. class Color(int, enum.Enum):
  1876. RED = 0
  1877. GREEN = 1
  1878. BLUE = 2
  1879. def f(color):
  1880. match color:
  1881. case Color.RED:
  1882. return "I see red!"
  1883. case Color.GREEN:
  1884. return "Grass is green"
  1885. case Color.BLUE:
  1886. return "I'm feeling the blues :("
  1887. self.assertEqual(f(Color.RED), "I see red!")
  1888. self.assertEqual(f(Color.GREEN), "Grass is green")
  1889. self.assertEqual(f(Color.BLUE), "I'm feeling the blues :(")
  1890. self.assertIs(f(Color), None)
  1891. self.assertEqual(f(0), "I see red!")
  1892. self.assertEqual(f(1), "Grass is green")
  1893. self.assertEqual(f(2), "I'm feeling the blues :(")
  1894. self.assertIs(f(3), None)
  1895. self.assertEqual(f(False), "I see red!")
  1896. self.assertEqual(f(True), "Grass is green")
  1897. self.assertEqual(f(2+0j), "I'm feeling the blues :(")
  1898. self.assertIs(f(3.0), None)
  1899. def test_patma_200(self):
  1900. class Class:
  1901. __match_args__ = ("a", "b")
  1902. c = Class()
  1903. c.a = 0
  1904. c.b = 1
  1905. match c:
  1906. case Class(x, y):
  1907. z = 0
  1908. self.assertIs(x, c.a)
  1909. self.assertIs(y, c.b)
  1910. self.assertEqual(z, 0)
  1911. def test_patma_201(self):
  1912. class Class:
  1913. __match_args__ = ("a", "b")
  1914. c = Class()
  1915. c.a = 0
  1916. c.b = 1
  1917. match c:
  1918. case Class(x, b=y):
  1919. z = 0
  1920. self.assertIs(x, c.a)
  1921. self.assertIs(y, c.b)
  1922. self.assertEqual(z, 0)
  1923. def test_patma_202(self):
  1924. class Parent:
  1925. __match_args__ = "a", "b"
  1926. class Child(Parent):
  1927. __match_args__ = ("c", "d")
  1928. c = Child()
  1929. c.a = 0
  1930. c.b = 1
  1931. match c:
  1932. case Parent(x, y):
  1933. z = 0
  1934. self.assertIs(x, c.a)
  1935. self.assertIs(y, c.b)
  1936. self.assertEqual(z, 0)
  1937. def test_patma_203(self):
  1938. class Parent:
  1939. __match_args__ = ("a", "b")
  1940. class Child(Parent):
  1941. __match_args__ = "c", "d"
  1942. c = Child()
  1943. c.a = 0
  1944. c.b = 1
  1945. match c:
  1946. case Parent(x, b=y):
  1947. z = 0
  1948. self.assertIs(x, c.a)
  1949. self.assertIs(y, c.b)
  1950. self.assertEqual(z, 0)
  1951. def test_patma_204(self):
  1952. def f(w):
  1953. match w:
  1954. case 42:
  1955. out = locals()
  1956. del out["w"]
  1957. return out
  1958. self.assertEqual(f(42), {})
  1959. self.assertIs(f(0), None)
  1960. self.assertEqual(f(42.0), {})
  1961. self.assertIs(f("42"), None)
  1962. def test_patma_205(self):
  1963. def f(w):
  1964. match w:
  1965. case 42.0:
  1966. out = locals()
  1967. del out["w"]
  1968. return out
  1969. self.assertEqual(f(42.0), {})
  1970. self.assertEqual(f(42), {})
  1971. self.assertIs(f(0.0), None)
  1972. self.assertIs(f(0), None)
  1973. def test_patma_206(self):
  1974. def f(w):
  1975. match w:
  1976. case 1 | 2 | 3:
  1977. out = locals()
  1978. del out["w"]
  1979. return out
  1980. self.assertEqual(f(1), {})
  1981. self.assertEqual(f(2), {})
  1982. self.assertEqual(f(3), {})
  1983. self.assertEqual(f(3.0), {})
  1984. self.assertIs(f(0), None)
  1985. self.assertIs(f(4), None)
  1986. self.assertIs(f("1"), None)
  1987. def test_patma_207(self):
  1988. def f(w):
  1989. match w:
  1990. case [1, 2] | [3, 4]:
  1991. out = locals()
  1992. del out["w"]
  1993. return out
  1994. self.assertEqual(f([1, 2]), {})
  1995. self.assertEqual(f([3, 4]), {})
  1996. self.assertIs(f(42), None)
  1997. self.assertIs(f([2, 3]), None)
  1998. self.assertIs(f([1, 2, 3]), None)
  1999. self.assertEqual(f([1, 2.0]), {})
  2000. def test_patma_208(self):
  2001. def f(w):
  2002. match w:
  2003. case x:
  2004. out = locals()
  2005. del out["w"]
  2006. return out
  2007. self.assertEqual(f(42), {"x": 42})
  2008. self.assertEqual(f((1, 2)), {"x": (1, 2)})
  2009. self.assertEqual(f(None), {"x": None})
  2010. def test_patma_209(self):
  2011. def f(w):
  2012. match w:
  2013. case _:
  2014. out = locals()
  2015. del out["w"]
  2016. return out
  2017. self.assertEqual(f(42), {})
  2018. self.assertEqual(f(None), {})
  2019. self.assertEqual(f((1, 2)), {})
  2020. def test_patma_210(self):
  2021. def f(w):
  2022. match w:
  2023. case (x, y, z):
  2024. out = locals()
  2025. del out["w"]
  2026. return out
  2027. self.assertEqual(f((1, 2, 3)), {"x": 1, "y": 2, "z": 3})
  2028. self.assertIs(f((1, 2)), None)
  2029. self.assertIs(f((1, 2, 3, 4)), None)
  2030. self.assertIs(f(123), None)
  2031. self.assertIs(f("abc"), None)
  2032. self.assertIs(f(b"abc"), None)
  2033. self.assertEqual(f(array.array("b", b"abc")), {'x': 97, 'y': 98, 'z': 99})
  2034. self.assertEqual(f(memoryview(b"abc")), {"x": 97, "y": 98, "z": 99})
  2035. self.assertIs(f(bytearray(b"abc")), None)
  2036. def test_patma_211(self):
  2037. def f(w):
  2038. match w:
  2039. case {"x": x, "y": "y", "z": z}:
  2040. out = locals()
  2041. del out["w"]
  2042. return out
  2043. self.assertEqual(f({"x": "x", "y": "y", "z": "z"}), {"x": "x", "z": "z"})
  2044. self.assertEqual(f({"x": "x", "y": "y", "z": "z", "a": "a"}), {"x": "x", "z": "z"})
  2045. self.assertIs(f(({"x": "x", "y": "yy", "z": "z", "a": "a"})), None)
  2046. self.assertIs(f(({"x": "x", "y": "y"})), None)
  2047. def test_patma_212(self):
  2048. def f(w):
  2049. match w:
  2050. case Point(int(xx), y="hello"):
  2051. out = locals()
  2052. del out["w"]
  2053. return out
  2054. self.assertEqual(f(Point(42, "hello")), {"xx": 42})
  2055. def test_patma_213(self):
  2056. def f(w):
  2057. match w:
  2058. case (p, q) as x:
  2059. out = locals()
  2060. del out["w"]
  2061. return out
  2062. self.assertEqual(f((1, 2)), {"p": 1, "q": 2, "x": (1, 2)})
  2063. self.assertEqual(f([1, 2]), {"p": 1, "q": 2, "x": [1, 2]})
  2064. self.assertIs(f(12), None)
  2065. self.assertIs(f((1, 2, 3)), None)
  2066. def test_patma_214(self):
  2067. def f():
  2068. match 42:
  2069. case 42:
  2070. return locals()
  2071. self.assertEqual(set(f()), set())
  2072. def test_patma_215(self):
  2073. def f():
  2074. match 1:
  2075. case 1 | 2 | 3:
  2076. return locals()
  2077. self.assertEqual(set(f()), set())
  2078. def test_patma_216(self):
  2079. def f():
  2080. match ...:
  2081. case _:
  2082. return locals()
  2083. self.assertEqual(set(f()), set())
  2084. def test_patma_217(self):
  2085. def f():
  2086. match ...:
  2087. case abc:
  2088. return locals()
  2089. self.assertEqual(set(f()), {"abc"})
  2090. def test_patma_218(self):
  2091. def f():
  2092. match ..., ...:
  2093. case a, b:
  2094. return locals()
  2095. self.assertEqual(set(f()), {"a", "b"})
  2096. def test_patma_219(self):
  2097. def f():
  2098. match {"k": ..., "l": ...}:
  2099. case {"k": a, "l": b}:
  2100. return locals()
  2101. self.assertEqual(set(f()), {"a", "b"})
  2102. def test_patma_220(self):
  2103. def f():
  2104. match Point(..., ...):
  2105. case Point(x, y=y):
  2106. return locals()
  2107. self.assertEqual(set(f()), {"x", "y"})
  2108. def test_patma_221(self):
  2109. def f():
  2110. match ...:
  2111. case b as a:
  2112. return locals()
  2113. self.assertEqual(set(f()), {"a", "b"})
  2114. def test_patma_222(self):
  2115. def f(x):
  2116. match x:
  2117. case _:
  2118. return 0
  2119. self.assertEqual(f(0), 0)
  2120. self.assertEqual(f(1), 0)
  2121. self.assertEqual(f(2), 0)
  2122. self.assertEqual(f(3), 0)
  2123. def test_patma_223(self):
  2124. def f(x):
  2125. match x:
  2126. case 0:
  2127. return 0
  2128. self.assertEqual(f(0), 0)
  2129. self.assertIs(f(1), None)
  2130. self.assertIs(f(2), None)
  2131. self.assertIs(f(3), None)
  2132. def test_patma_224(self):
  2133. def f(x):
  2134. match x:
  2135. case 0:
  2136. return 0
  2137. case _:
  2138. return 1
  2139. self.assertEqual(f(0), 0)
  2140. self.assertEqual(f(1), 1)
  2141. self.assertEqual(f(2), 1)
  2142. self.assertEqual(f(3), 1)
  2143. def test_patma_225(self):
  2144. def f(x):
  2145. match x:
  2146. case 0:
  2147. return 0
  2148. case 1:
  2149. return 1
  2150. self.assertEqual(f(0), 0)
  2151. self.assertEqual(f(1), 1)
  2152. self.assertIs(f(2), None)
  2153. self.assertIs(f(3), None)
  2154. def test_patma_226(self):
  2155. def f(x):
  2156. match x:
  2157. case 0:
  2158. return 0
  2159. case 1:
  2160. return 1
  2161. case _:
  2162. return 2
  2163. self.assertEqual(f(0), 0)
  2164. self.assertEqual(f(1), 1)
  2165. self.assertEqual(f(2), 2)
  2166. self.assertEqual(f(3), 2)
  2167. def test_patma_227(self):
  2168. def f(x):
  2169. match x:
  2170. case 0:
  2171. return 0
  2172. case 1:
  2173. return 1
  2174. case 2:
  2175. return 2
  2176. self.assertEqual(f(0), 0)
  2177. self.assertEqual(f(1), 1)
  2178. self.assertEqual(f(2), 2)
  2179. self.assertIs(f(3), None)
  2180. def test_patma_228(self):
  2181. match():
  2182. case():
  2183. x = 0
  2184. self.assertEqual(x, 0)
  2185. def test_patma_229(self):
  2186. x = 0
  2187. match(x):
  2188. case(x):
  2189. y = 0
  2190. self.assertEqual(x, 0)
  2191. self.assertEqual(y, 0)
  2192. def test_patma_230(self):
  2193. x = 0
  2194. match x:
  2195. case False:
  2196. y = 0
  2197. case 0:
  2198. y = 1
  2199. self.assertEqual(x, 0)
  2200. self.assertEqual(y, 1)
  2201. def test_patma_231(self):
  2202. x = 1
  2203. match x:
  2204. case True:
  2205. y = 0
  2206. case 1:
  2207. y = 1
  2208. self.assertEqual(x, 1)
  2209. self.assertEqual(y, 1)
  2210. def test_patma_232(self):
  2211. class Eq:
  2212. def __eq__(self, other):
  2213. return True
  2214. x = eq = Eq()
  2215. y = None
  2216. match x:
  2217. case None:
  2218. y = 0
  2219. self.assertIs(x, eq)
  2220. self.assertEqual(y, None)
  2221. def test_patma_233(self):
  2222. x = False
  2223. match x:
  2224. case False:
  2225. y = 0
  2226. self.assertIs(x, False)
  2227. self.assertEqual(y, 0)
  2228. def test_patma_234(self):
  2229. x = True
  2230. match x:
  2231. case True:
  2232. y = 0
  2233. self.assertIs(x, True)
  2234. self.assertEqual(y, 0)
  2235. def test_patma_235(self):
  2236. x = None
  2237. match x:
  2238. case None:
  2239. y = 0
  2240. self.assertIs(x, None)
  2241. self.assertEqual(y, 0)
  2242. def test_patma_236(self):
  2243. x = 0
  2244. match x:
  2245. case (0 as w) as z:
  2246. y = 0
  2247. self.assertEqual(w, 0)
  2248. self.assertEqual(x, 0)
  2249. self.assertEqual(y, 0)
  2250. self.assertEqual(z, 0)
  2251. def test_patma_237(self):
  2252. x = 0
  2253. match x:
  2254. case (0 as w) as z:
  2255. y = 0
  2256. self.assertEqual(w, 0)
  2257. self.assertEqual(x, 0)
  2258. self.assertEqual(y, 0)
  2259. self.assertEqual(z, 0)
  2260. def test_patma_238(self):
  2261. x = ((0, 1), (2, 3))
  2262. match x:
  2263. case ((a as b, c as d) as e) as w, ((f as g, h) as i) as z:
  2264. y = 0
  2265. self.assertEqual(a, 0)
  2266. self.assertEqual(b, 0)
  2267. self.assertEqual(c, 1)
  2268. self.assertEqual(d, 1)
  2269. self.assertEqual(e, (0, 1))
  2270. self.assertEqual(f, 2)
  2271. self.assertEqual(g, 2)
  2272. self.assertEqual(h, 3)
  2273. self.assertEqual(i, (2, 3))
  2274. self.assertEqual(w, (0, 1))
  2275. self.assertEqual(x, ((0, 1), (2, 3)))
  2276. self.assertEqual(y, 0)
  2277. self.assertEqual(z, (2, 3))
  2278. def test_patma_239(self):
  2279. x = collections.UserDict({0: 1, 2: 3})
  2280. match x:
  2281. case {2: 3}:
  2282. y = 0
  2283. self.assertEqual(x, {0: 1, 2: 3})
  2284. self.assertEqual(y, 0)
  2285. def test_patma_240(self):
  2286. x = collections.UserDict({0: 1, 2: 3})
  2287. match x:
  2288. case {2: 3, **z}:
  2289. y = 0
  2290. self.assertEqual(x, {0: 1, 2: 3})
  2291. self.assertEqual(y, 0)
  2292. self.assertEqual(z, {0: 1})
  2293. def test_patma_241(self):
  2294. x = [[{0: 0}]]
  2295. match x:
  2296. case list([({-0-0j: int(real=0+0j, imag=0-0j) | (1) as z},)]):
  2297. y = 0
  2298. self.assertEqual(x, [[{0: 0}]])
  2299. self.assertEqual(y, 0)
  2300. self.assertEqual(z, 0)
  2301. def test_patma_242(self):
  2302. x = range(3)
  2303. match x:
  2304. case [y, *_, z]:
  2305. w = 0
  2306. self.assertEqual(w, 0)
  2307. self.assertEqual(x, range(3))
  2308. self.assertEqual(y, 0)
  2309. self.assertEqual(z, 2)
  2310. def test_patma_243(self):
  2311. x = range(3)
  2312. match x:
  2313. case [_, *_, y]:
  2314. z = 0
  2315. self.assertEqual(x, range(3))
  2316. self.assertEqual(y, 2)
  2317. self.assertEqual(z, 0)
  2318. def test_patma_244(self):
  2319. x = range(3)
  2320. match x:
  2321. case [*_, y]:
  2322. z = 0
  2323. self.assertEqual(x, range(3))
  2324. self.assertEqual(y, 2)
  2325. self.assertEqual(z, 0)
  2326. def test_patma_245(self):
  2327. x = {"y": 1}
  2328. match x:
  2329. case {"y": (0 as y) | (1 as y)}:
  2330. z = 0
  2331. self.assertEqual(x, {"y": 1})
  2332. self.assertEqual(y, 1)
  2333. self.assertEqual(z, 0)
  2334. def test_patma_246(self):
  2335. def f(x):
  2336. match x:
  2337. case ((a, b, c, d, e, f, g, h, i, 9) |
  2338. (h, g, i, a, b, d, e, c, f, 10) |
  2339. (g, b, a, c, d, -5, e, h, i, f) |
  2340. (-1, d, f, b, g, e, i, a, h, c)):
  2341. w = 0
  2342. out = locals()
  2343. del out["x"]
  2344. return out
  2345. alts = [
  2346. dict(a=0, b=1, c=2, d=3, e=4, f=5, g=6, h=7, i=8, w=0),
  2347. dict(h=1, g=2, i=3, a=4, b=5, d=6, e=7, c=8, f=9, w=0),
  2348. dict(g=0, b=-1, a=-2, c=-3, d=-4, e=-6, h=-7, i=-8, f=-9, w=0),
  2349. dict(d=-2, f=-3, b=-4, g=-5, e=-6, i=-7, a=-8, h=-9, c=-10, w=0),
  2350. dict(),
  2351. ]
  2352. self.assertEqual(f(range(10)), alts[0])
  2353. self.assertEqual(f(range(1, 11)), alts[1])
  2354. self.assertEqual(f(range(0, -10, -1)), alts[2])
  2355. self.assertEqual(f(range(-1, -11, -1)), alts[3])
  2356. self.assertEqual(f(range(10, 20)), alts[4])
  2357. def test_patma_247(self):
  2358. def f(x):
  2359. match x:
  2360. case [y, (a, b, c, d, e, f, g, h, i, 9) |
  2361. (h, g, i, a, b, d, e, c, f, 10) |
  2362. (g, b, a, c, d, -5, e, h, i, f) |
  2363. (-1, d, f, b, g, e, i, a, h, c), z]:
  2364. w = 0
  2365. out = locals()
  2366. del out["x"]
  2367. return out
  2368. alts = [
  2369. dict(a=0, b=1, c=2, d=3, e=4, f=5, g=6, h=7, i=8, w=0, y=False, z=True),
  2370. dict(h=1, g=2, i=3, a=4, b=5, d=6, e=7, c=8, f=9, w=0, y=False, z=True),
  2371. dict(g=0, b=-1, a=-2, c=-3, d=-4, e=-6, h=-7, i=-8, f=-9, w=0, y=False, z=True),
  2372. dict(d=-2, f=-3, b=-4, g=-5, e=-6, i=-7, a=-8, h=-9, c=-10, w=0, y=False, z=True),
  2373. dict(),
  2374. ]
  2375. self.assertEqual(f((False, range(10), True)), alts[0])
  2376. self.assertEqual(f((False, range(1, 11), True)), alts[1])
  2377. self.assertEqual(f((False, range(0, -10, -1), True)), alts[2])
  2378. self.assertEqual(f((False, range(-1, -11, -1), True)), alts[3])
  2379. self.assertEqual(f((False, range(10, 20), True)), alts[4])
  2380. def test_patma_248(self):
  2381. class C(dict):
  2382. @staticmethod
  2383. def get(key, default=None):
  2384. return 'bar'
  2385. x = C({'foo': 'bar'})
  2386. match x:
  2387. case {'foo': bar}:
  2388. y = bar
  2389. self.assertEqual(y, 'bar')
  2390. class TestSyntaxErrors(unittest.TestCase):
  2391. def assert_syntax_error(self, code: str):
  2392. with self.assertRaises(SyntaxError):
  2393. compile(inspect.cleandoc(code), "<test>", "exec")
  2394. def test_alternative_patterns_bind_different_names_0(self):
  2395. self.assert_syntax_error("""
  2396. match ...:
  2397. case "a" | a:
  2398. pass
  2399. """)
  2400. def test_alternative_patterns_bind_different_names_1(self):
  2401. self.assert_syntax_error("""
  2402. match ...:
  2403. case [a, [b] | [c] | [d]]:
  2404. pass
  2405. """)
  2406. def test_attribute_name_repeated_in_class_pattern(self):
  2407. self.assert_syntax_error("""
  2408. match ...:
  2409. case Class(a=_, a=_):
  2410. pass
  2411. """)
  2412. def test_imaginary_number_required_in_complex_literal_0(self):
  2413. self.assert_syntax_error("""
  2414. match ...:
  2415. case 0+0:
  2416. pass
  2417. """)
  2418. def test_imaginary_number_required_in_complex_literal_1(self):
  2419. self.assert_syntax_error("""
  2420. match ...:
  2421. case {0+0: _}:
  2422. pass
  2423. """)
  2424. def test_invalid_syntax_0(self):
  2425. self.assert_syntax_error("""
  2426. match ...:
  2427. case {**rest, "key": value}:
  2428. pass
  2429. """)
  2430. def test_invalid_syntax_1(self):
  2431. self.assert_syntax_error("""
  2432. match ...:
  2433. case {"first": first, **rest, "last": last}:
  2434. pass
  2435. """)
  2436. def test_invalid_syntax_2(self):
  2437. self.assert_syntax_error("""
  2438. match ...:
  2439. case {**_}:
  2440. pass
  2441. """)
  2442. def test_invalid_syntax_3(self):
  2443. self.assert_syntax_error("""
  2444. match ...:
  2445. case 42 as _:
  2446. pass
  2447. """)
  2448. def test_mapping_pattern_keys_may_only_match_literals_and_attribute_lookups(self):
  2449. self.assert_syntax_error("""
  2450. match ...:
  2451. case {f"": _}:
  2452. pass
  2453. """)
  2454. def test_multiple_assignments_to_name_in_pattern_0(self):
  2455. self.assert_syntax_error("""
  2456. match ...:
  2457. case a, a:
  2458. pass
  2459. """)
  2460. def test_multiple_assignments_to_name_in_pattern_1(self):
  2461. self.assert_syntax_error("""
  2462. match ...:
  2463. case {"k": a, "l": a}:
  2464. pass
  2465. """)
  2466. def test_multiple_assignments_to_name_in_pattern_2(self):
  2467. self.assert_syntax_error("""
  2468. match ...:
  2469. case MyClass(x, x):
  2470. pass
  2471. """)
  2472. def test_multiple_assignments_to_name_in_pattern_3(self):
  2473. self.assert_syntax_error("""
  2474. match ...:
  2475. case MyClass(x=x, y=x):
  2476. pass
  2477. """)
  2478. def test_multiple_assignments_to_name_in_pattern_4(self):
  2479. self.assert_syntax_error("""
  2480. match ...:
  2481. case MyClass(x, y=x):
  2482. pass
  2483. """)
  2484. def test_multiple_assignments_to_name_in_pattern_5(self):
  2485. self.assert_syntax_error("""
  2486. match ...:
  2487. case a as a:
  2488. pass
  2489. """)
  2490. def test_multiple_starred_names_in_sequence_pattern_0(self):
  2491. self.assert_syntax_error("""
  2492. match ...:
  2493. case *a, b, *c, d, *e:
  2494. pass
  2495. """)
  2496. def test_multiple_starred_names_in_sequence_pattern_1(self):
  2497. self.assert_syntax_error("""
  2498. match ...:
  2499. case a, *b, c, *d, e:
  2500. pass
  2501. """)
  2502. def test_name_capture_makes_remaining_patterns_unreachable_0(self):
  2503. self.assert_syntax_error("""
  2504. match ...:
  2505. case a | "a":
  2506. pass
  2507. """)
  2508. def test_name_capture_makes_remaining_patterns_unreachable_1(self):
  2509. self.assert_syntax_error("""
  2510. match 42:
  2511. case x:
  2512. pass
  2513. case y:
  2514. pass
  2515. """)
  2516. def test_name_capture_makes_remaining_patterns_unreachable_2(self):
  2517. self.assert_syntax_error("""
  2518. match ...:
  2519. case x | [_ as x] if x:
  2520. pass
  2521. """)
  2522. def test_name_capture_makes_remaining_patterns_unreachable_3(self):
  2523. self.assert_syntax_error("""
  2524. match ...:
  2525. case x:
  2526. pass
  2527. case [x] if x:
  2528. pass
  2529. """)
  2530. def test_name_capture_makes_remaining_patterns_unreachable_4(self):
  2531. self.assert_syntax_error("""
  2532. match ...:
  2533. case x:
  2534. pass
  2535. case _:
  2536. pass
  2537. """)
  2538. def test_patterns_may_only_match_literals_and_attribute_lookups_0(self):
  2539. self.assert_syntax_error("""
  2540. match ...:
  2541. case f"":
  2542. pass
  2543. """)
  2544. def test_patterns_may_only_match_literals_and_attribute_lookups_1(self):
  2545. self.assert_syntax_error("""
  2546. match ...:
  2547. case f"{x}":
  2548. pass
  2549. """)
  2550. def test_real_number_required_in_complex_literal_0(self):
  2551. self.assert_syntax_error("""
  2552. match ...:
  2553. case 0j+0:
  2554. pass
  2555. """)
  2556. def test_real_number_required_in_complex_literal_1(self):
  2557. self.assert_syntax_error("""
  2558. match ...:
  2559. case 0j+0j:
  2560. pass
  2561. """)
  2562. def test_real_number_required_in_complex_literal_2(self):
  2563. self.assert_syntax_error("""
  2564. match ...:
  2565. case {0j+0: _}:
  2566. pass
  2567. """)
  2568. def test_real_number_required_in_complex_literal_3(self):
  2569. self.assert_syntax_error("""
  2570. match ...:
  2571. case {0j+0j: _}:
  2572. pass
  2573. """)
  2574. def test_wildcard_makes_remaining_patterns_unreachable_0(self):
  2575. self.assert_syntax_error("""
  2576. match ...:
  2577. case _ | _:
  2578. pass
  2579. """)
  2580. def test_wildcard_makes_remaining_patterns_unreachable_1(self):
  2581. self.assert_syntax_error("""
  2582. match ...:
  2583. case (_ as x) | [x]:
  2584. pass
  2585. """)
  2586. def test_wildcard_makes_remaining_patterns_unreachable_2(self):
  2587. self.assert_syntax_error("""
  2588. match ...:
  2589. case _ | _ if condition():
  2590. pass
  2591. """)
  2592. def test_wildcard_makes_remaining_patterns_unreachable_3(self):
  2593. self.assert_syntax_error("""
  2594. match ...:
  2595. case _:
  2596. pass
  2597. case None:
  2598. pass
  2599. """)
  2600. def test_wildcard_makes_remaining_patterns_unreachable_4(self):
  2601. self.assert_syntax_error("""
  2602. match ...:
  2603. case (None | _) | _:
  2604. pass
  2605. """)
  2606. def test_wildcard_makes_remaining_patterns_unreachable_5(self):
  2607. self.assert_syntax_error("""
  2608. match ...:
  2609. case _ | (True | False):
  2610. pass
  2611. """)
  2612. def test_mapping_pattern_duplicate_key(self):
  2613. self.assert_syntax_error("""
  2614. match ...:
  2615. case {"a": _, "a": _}:
  2616. pass
  2617. """)
  2618. def test_mapping_pattern_duplicate_key_edge_case0(self):
  2619. self.assert_syntax_error("""
  2620. match ...:
  2621. case {0: _, False: _}:
  2622. pass
  2623. """)
  2624. def test_mapping_pattern_duplicate_key_edge_case1(self):
  2625. self.assert_syntax_error("""
  2626. match ...:
  2627. case {0: _, 0.0: _}:
  2628. pass
  2629. """)
  2630. def test_mapping_pattern_duplicate_key_edge_case2(self):
  2631. self.assert_syntax_error("""
  2632. match ...:
  2633. case {0: _, -0: _}:
  2634. pass
  2635. """)
  2636. def test_mapping_pattern_duplicate_key_edge_case3(self):
  2637. self.assert_syntax_error("""
  2638. match ...:
  2639. case {0: _, 0j: _}:
  2640. pass
  2641. """)
  2642. class TestTypeErrors(unittest.TestCase):
  2643. def test_accepts_positional_subpatterns_0(self):
  2644. class Class:
  2645. __match_args__ = ()
  2646. x = Class()
  2647. y = z = None
  2648. with self.assertRaises(TypeError):
  2649. match x:
  2650. case Class(y):
  2651. z = 0
  2652. self.assertIs(y, None)
  2653. self.assertIs(z, None)
  2654. def test_accepts_positional_subpatterns_1(self):
  2655. x = range(10)
  2656. y = None
  2657. with self.assertRaises(TypeError):
  2658. match x:
  2659. case range(10):
  2660. y = 0
  2661. self.assertEqual(x, range(10))
  2662. self.assertIs(y, None)
  2663. def test_got_multiple_subpatterns_for_attribute_0(self):
  2664. class Class:
  2665. __match_args__ = ("a", "a")
  2666. a = None
  2667. x = Class()
  2668. w = y = z = None
  2669. with self.assertRaises(TypeError):
  2670. match x:
  2671. case Class(y, z):
  2672. w = 0
  2673. self.assertIs(w, None)
  2674. self.assertIs(y, None)
  2675. self.assertIs(z, None)
  2676. def test_got_multiple_subpatterns_for_attribute_1(self):
  2677. class Class:
  2678. __match_args__ = ("a",)
  2679. a = None
  2680. x = Class()
  2681. w = y = z = None
  2682. with self.assertRaises(TypeError):
  2683. match x:
  2684. case Class(y, a=z):
  2685. w = 0
  2686. self.assertIs(w, None)
  2687. self.assertIs(y, None)
  2688. self.assertIs(z, None)
  2689. def test_match_args_elements_must_be_strings(self):
  2690. class Class:
  2691. __match_args__ = (None,)
  2692. x = Class()
  2693. y = z = None
  2694. with self.assertRaises(TypeError):
  2695. match x:
  2696. case Class(y):
  2697. z = 0
  2698. self.assertIs(y, None)
  2699. self.assertIs(z, None)
  2700. def test_match_args_must_be_a_tuple_0(self):
  2701. class Class:
  2702. __match_args__ = None
  2703. x = Class()
  2704. y = z = None
  2705. with self.assertRaises(TypeError):
  2706. match x:
  2707. case Class(y):
  2708. z = 0
  2709. self.assertIs(y, None)
  2710. self.assertIs(z, None)
  2711. def test_match_args_must_be_a_tuple_1(self):
  2712. class Class:
  2713. __match_args__ = "XYZ"
  2714. x = Class()
  2715. y = z = None
  2716. with self.assertRaises(TypeError):
  2717. match x:
  2718. case Class(y):
  2719. z = 0
  2720. self.assertIs(y, None)
  2721. self.assertIs(z, None)
  2722. def test_match_args_must_be_a_tuple_2(self):
  2723. class Class:
  2724. __match_args__ = ["spam", "eggs"]
  2725. spam = 0
  2726. eggs = 1
  2727. x = Class()
  2728. w = y = z = None
  2729. with self.assertRaises(TypeError):
  2730. match x:
  2731. case Class(y, z):
  2732. w = 0
  2733. self.assertIs(w, None)
  2734. self.assertIs(y, None)
  2735. self.assertIs(z, None)
  2736. class TestValueErrors(unittest.TestCase):
  2737. def test_mapping_pattern_checks_duplicate_key_1(self):
  2738. class Keys:
  2739. KEY = "a"
  2740. x = {"a": 0, "b": 1}
  2741. w = y = z = None
  2742. with self.assertRaises(ValueError):
  2743. match x:
  2744. case {Keys.KEY: y, "a": z}:
  2745. w = 0
  2746. self.assertIs(w, None)
  2747. self.assertIs(y, None)
  2748. self.assertIs(z, None)
  2749. class TestTracing(unittest.TestCase):
  2750. @staticmethod
  2751. def _trace(func, *args, **kwargs):
  2752. actual_linenos = []
  2753. def trace(frame, event, arg):
  2754. if event == "line" and frame.f_code.co_name == func.__name__:
  2755. assert arg is None
  2756. relative_lineno = frame.f_lineno - func.__code__.co_firstlineno
  2757. actual_linenos.append(relative_lineno)
  2758. return trace
  2759. old_trace = sys.gettrace()
  2760. sys.settrace(trace)
  2761. try:
  2762. func(*args, **kwargs)
  2763. finally:
  2764. sys.settrace(old_trace)
  2765. return actual_linenos
  2766. def test_default_wildcard(self):
  2767. def f(command): # 0
  2768. match command.split(): # 1
  2769. case ["go", direction] if direction in "nesw": # 2
  2770. return f"go {direction}" # 3
  2771. case ["go", _]: # 4
  2772. return "no go" # 5
  2773. case _: # 6
  2774. return "default" # 7
  2775. self.assertListEqual(self._trace(f, "go n"), [1, 2, 3])
  2776. self.assertListEqual(self._trace(f, "go x"), [1, 2, 4, 5])
  2777. self.assertListEqual(self._trace(f, "spam"), [1, 2, 4, 6, 7])
  2778. def test_default_capture(self):
  2779. def f(command): # 0
  2780. match command.split(): # 1
  2781. case ["go", direction] if direction in "nesw": # 2
  2782. return f"go {direction}" # 3
  2783. case ["go", _]: # 4
  2784. return "no go" # 5
  2785. case x: # 6
  2786. return x # 7
  2787. self.assertListEqual(self._trace(f, "go n"), [1, 2, 3])
  2788. self.assertListEqual(self._trace(f, "go x"), [1, 2, 4, 5])
  2789. self.assertListEqual(self._trace(f, "spam"), [1, 2, 4, 6, 7])
  2790. def test_no_default(self):
  2791. def f(command): # 0
  2792. match command.split(): # 1
  2793. case ["go", direction] if direction in "nesw": # 2
  2794. return f"go {direction}" # 3
  2795. case ["go", _]: # 4
  2796. return "no go" # 5
  2797. self.assertListEqual(self._trace(f, "go n"), [1, 2, 3])
  2798. self.assertListEqual(self._trace(f, "go x"), [1, 2, 4, 5])
  2799. self.assertListEqual(self._trace(f, "spam"), [1, 2, 4])
  2800. def test_only_default_wildcard(self):
  2801. def f(command): # 0
  2802. match command.split(): # 1
  2803. case _: # 2
  2804. return "default" # 3
  2805. self.assertListEqual(self._trace(f, "go n"), [1, 2, 3])
  2806. self.assertListEqual(self._trace(f, "go x"), [1, 2, 3])
  2807. self.assertListEqual(self._trace(f, "spam"), [1, 2, 3])
  2808. def test_only_default_capture(self):
  2809. def f(command): # 0
  2810. match command.split(): # 1
  2811. case x: # 2
  2812. return x # 3
  2813. self.assertListEqual(self._trace(f, "go n"), [1, 2, 3])
  2814. self.assertListEqual(self._trace(f, "go x"), [1, 2, 3])
  2815. self.assertListEqual(self._trace(f, "spam"), [1, 2, 3])
  2816. def test_parser_deeply_nested_patterns(self):
  2817. # Deeply nested patterns can cause exponential backtracking when parsing.
  2818. # See gh-93671 for more information.
  2819. levels = 100
  2820. patterns = [
  2821. "A" + "(" * levels + ")" * levels,
  2822. "{1:" * levels + "1" + "}" * levels,
  2823. "[" * levels + "1" + "]" * levels,
  2824. ]
  2825. for pattern in patterns:
  2826. with self.subTest(pattern):
  2827. code = inspect.cleandoc("""
  2828. match None:
  2829. case {}:
  2830. pass
  2831. """.format(pattern))
  2832. compile(code, "<string>", "exec")
  2833. if __name__ == "__main__":
  2834. """
  2835. # From inside environment using this Python, with pyperf installed:
  2836. sudo $(which pyperf) system tune && \
  2837. $(which python) -m test.test_patma --rigorous; \
  2838. sudo $(which pyperf) system reset
  2839. """
  2840. import pyperf
  2841. class PerfPatma(TestPatma):
  2842. def assertEqual(*_, **__):
  2843. pass
  2844. def assertIs(*_, **__):
  2845. pass
  2846. def assertRaises(*_, **__):
  2847. assert False, "this test should be a method of a different class!"
  2848. def run_perf(self, count):
  2849. tests = []
  2850. for attr in vars(TestPatma):
  2851. if attr.startswith("test_"):
  2852. tests.append(getattr(self, attr))
  2853. tests *= count
  2854. start = pyperf.perf_counter()
  2855. for test in tests:
  2856. test()
  2857. return pyperf.perf_counter() - start
  2858. runner = pyperf.Runner()
  2859. runner.bench_time_func("patma", PerfPatma().run_perf)