run-match.test 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. [case testTheBigMatch_python3_10]
  2. class Person:
  3. __match_args__ = ("name", "age")
  4. name: str
  5. age: int
  6. def __init__(self, name: str, age: int) -> None:
  7. self.name = name
  8. self.age = age
  9. def __str__(self) -> str:
  10. return f"Person(name={self.name!r}, age={self.age})"
  11. def f(x: object) -> None:
  12. match x:
  13. case 123:
  14. print("test 1")
  15. case 456 | 789:
  16. print("test 2")
  17. case True | False | None:
  18. print("test 3")
  19. case Person("bob" as name, age):
  20. print(f"test 4 ({name=}, {age=})")
  21. case num if num == 5:
  22. print("test 5")
  23. case 6 as num:
  24. print(f"test 6 ({num=})")
  25. case (7 | "7") as value:
  26. print(f"test 7 ({value=})")
  27. case Person("alice", age=123):
  28. print("test 8")
  29. case Person("charlie", age=123 | 456):
  30. print("test 9")
  31. case Person("dave", 123) as dave:
  32. print(f"test 10 {dave}")
  33. case {"test": 11}:
  34. print("test 11")
  35. case {"test": 12, **rest}:
  36. print(f"test 12 (rest={rest})")
  37. case {}:
  38. print("test map final")
  39. case ["test", 13]:
  40. print("test 13")
  41. case ["test", 13, _]:
  42. print("test 13b")
  43. case ["test", 14, *_]:
  44. print("test 14")
  45. # TODO: Fix "rest" being used here coliding with above "rest"
  46. case ["test", 15, *rest2]:
  47. print(f"test 15 ({rest2})")
  48. case ["test", *rest3, 16]:
  49. print(f"test 16 ({rest3})")
  50. case [*rest4, "test", 17]:
  51. print(f"test 17 ({rest4})")
  52. case [*rest4, "test", 18, "some", "fluff"]:
  53. print(f"test 18 ({rest4})")
  54. case str("test 19"):
  55. print("test 19")
  56. case str(test_20) if test_20.startswith("test 20"):
  57. print(f"test 20 ({test_20[7:]!r})")
  58. case ("test 21" as value) | ("test 21 as well" as value):
  59. print(f"test 21 ({value[7:]!r})")
  60. case []:
  61. print("test sequence final")
  62. case _:
  63. print("test final")
  64. [file driver.py]
  65. from native import f, Person
  66. # test 1
  67. f(123)
  68. # test 2
  69. f(456)
  70. f(789)
  71. # test 3
  72. f(True)
  73. f(False)
  74. f(None)
  75. # test 4
  76. f(Person("bob", 123))
  77. # test 5
  78. f(5)
  79. # test 6
  80. f(6)
  81. # test 7
  82. f(7)
  83. f("7")
  84. # test 8
  85. f(Person("alice", 123))
  86. # test 9
  87. f(Person("charlie", 123))
  88. f(Person("charlie", 456))
  89. # test 10
  90. f(Person("dave", 123))
  91. # test 11
  92. f({"test": 11})
  93. f({"test": 11, "some": "key"})
  94. # test 12
  95. f({"test": 12})
  96. f({"test": 12, "key": "value"})
  97. f({"test": 12, "key": "value", "abc": "123"})
  98. # test map final
  99. f({})
  100. # test 13
  101. f(["test", 13])
  102. # test 13b
  103. f(["test", 13, "fail"])
  104. # test 14
  105. f(["test", 14])
  106. f(["test", 14, "something"])
  107. # test 15
  108. f(["test", 15])
  109. f(["test", 15, "something"])
  110. # test 16
  111. f(["test", 16])
  112. f(["test", "filler", 16])
  113. f(["test", "more", "filler", 16])
  114. # test 17
  115. f(["test", 17])
  116. f(["stuff", "test", 17])
  117. f(["more", "stuff", "test", 17])
  118. # test 18
  119. f(["test", 18, "some", "fluff"])
  120. f(["stuff", "test", 18, "some", "fluff"])
  121. f(["more", "stuff", "test", 18, "some", "fluff"])
  122. # test 19
  123. f("test 19")
  124. # test 20
  125. f("test 20")
  126. f("test 20 something else")
  127. # test 21
  128. f("test 21")
  129. f("test 21 as well")
  130. # test sequence final
  131. f([])
  132. # test final
  133. f("")
  134. [out]
  135. test 1
  136. test 2
  137. test 2
  138. test 3
  139. test 3
  140. test 3
  141. test 4 (name='bob', age=123)
  142. test 5
  143. test 6 (num=6)
  144. test 7 (value=7)
  145. test 7 (value='7')
  146. test 8
  147. test 9
  148. test 9
  149. test 10 Person(name='dave', age=123)
  150. test 11
  151. test 11
  152. test 12 (rest={})
  153. test 12 (rest={'key': 'value'})
  154. test 12 (rest={'key': 'value', 'abc': '123'})
  155. test map final
  156. test 13
  157. test 13b
  158. test 14
  159. test 14
  160. test 15 ([])
  161. test 15 (['something'])
  162. test 16 ([])
  163. test 16 (['filler'])
  164. test 16 (['more', 'filler'])
  165. test 17 ([])
  166. test 17 (['stuff'])
  167. test 17 (['more', 'stuff'])
  168. test 18 ([])
  169. test 18 (['stuff'])
  170. test 18 (['more', 'stuff'])
  171. test 19
  172. test 20 ('')
  173. test 20 (' something else')
  174. test 21 ('')
  175. test 21 (' as well')
  176. test sequence final
  177. test final
  178. [case testCustomMappingAndSequenceObjects_python3_10]
  179. def f(x: object) -> None:
  180. match x:
  181. case {"key": "value", **rest}:
  182. print(rest, type(rest))
  183. case [1, 2, *rest2]:
  184. print(rest2, type(rest2))
  185. [file driver.py]
  186. from collections.abc import Mapping, Sequence
  187. from native import f
  188. class CustomMapping(Mapping):
  189. inner: dict
  190. def __init__(self, inner: dict) -> None:
  191. self.inner = inner
  192. def __getitem__(self, key):
  193. return self.inner[key]
  194. def __iter__(self):
  195. return iter(self.inner)
  196. def __len__(self) -> int:
  197. return len(self.inner)
  198. class CustomSequence(Sequence):
  199. inner: list
  200. def __init__(self, inner: list) -> None:
  201. self.inner = inner
  202. def __getitem__(self, index: int) -> None:
  203. return self.inner[index]
  204. def __len__(self) -> int:
  205. return len(self.inner)
  206. mapping = CustomMapping({"key": "value", "some": "data"})
  207. sequence = CustomSequence([1, 2, 3])
  208. f(mapping)
  209. f(sequence)
  210. [out]
  211. {'some': 'data'} <class 'dict'>
  212. [3] <class 'list'>