irbuild-dunders.test 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. # Test cases for (some) dunder methods
  2. [case testDundersLen]
  3. class C:
  4. def __len__(self) -> int:
  5. return 2
  6. def f(c: C) -> int:
  7. return len(c)
  8. [out]
  9. def C.__len__(self):
  10. self :: __main__.C
  11. L0:
  12. return 4
  13. def f(c):
  14. c :: __main__.C
  15. r0 :: int
  16. r1 :: native_int
  17. r2, r3, r4 :: bit
  18. r5 :: bool
  19. L0:
  20. r0 = c.__len__()
  21. r1 = r0 & 1
  22. r2 = r1 != 0
  23. if r2 goto L1 else goto L2 :: bool
  24. L1:
  25. r3 = CPyTagged_IsLt_(r0, 0)
  26. if r3 goto L3 else goto L4 :: bool
  27. L2:
  28. r4 = r0 >= 0 :: signed
  29. if r4 goto L4 else goto L3 :: bool
  30. L3:
  31. r5 = raise ValueError('__len__() should return >= 0')
  32. unreachable
  33. L4:
  34. return r0
  35. [case testDundersSetItem]
  36. class C:
  37. def __setitem__(self, key: int, value: int) -> None:
  38. pass
  39. def f(c: C) -> None:
  40. c[3] = 4
  41. [out]
  42. def C.__setitem__(self, key, value):
  43. self :: __main__.C
  44. key, value :: int
  45. L0:
  46. return 1
  47. def f(c):
  48. c :: __main__.C
  49. r0 :: None
  50. L0:
  51. r0 = c.__setitem__(6, 8)
  52. return 1
  53. [case testDundersContains]
  54. from typing import Any
  55. class C:
  56. def __contains__(self, x: int) -> bool:
  57. return False
  58. def f(c: C) -> bool:
  59. return 7 in c
  60. def g(c: C) -> bool:
  61. return 7 not in c
  62. class D:
  63. def __contains__(self, x: int) -> Any:
  64. return 'x'
  65. def h(d: D) -> bool:
  66. return 7 not in d
  67. [out]
  68. def C.__contains__(self, x):
  69. self :: __main__.C
  70. x :: int
  71. L0:
  72. return 0
  73. def f(c):
  74. c :: __main__.C
  75. r0 :: bool
  76. L0:
  77. r0 = c.__contains__(14)
  78. return r0
  79. def g(c):
  80. c :: __main__.C
  81. r0, r1 :: bool
  82. L0:
  83. r0 = c.__contains__(14)
  84. r1 = r0 ^ 1
  85. return r1
  86. def D.__contains__(self, x):
  87. self :: __main__.D
  88. x :: int
  89. r0 :: str
  90. L0:
  91. r0 = 'x'
  92. return r0
  93. def h(d):
  94. d :: __main__.D
  95. r0 :: object
  96. r1 :: i32
  97. r2 :: bit
  98. r3, r4 :: bool
  99. L0:
  100. r0 = d.__contains__(14)
  101. r1 = PyObject_IsTrue(r0)
  102. r2 = r1 >= 0 :: signed
  103. r3 = truncate r1: i32 to builtins.bool
  104. r4 = r3 ^ 1
  105. return r4
  106. [case testDundersDelItem]
  107. class C:
  108. def __delitem__(self, x: int) -> None:
  109. pass
  110. def f(c: C) -> None:
  111. del c[5]
  112. [out]
  113. def C.__delitem__(self, x):
  114. self :: __main__.C
  115. x :: int
  116. L0:
  117. return 1
  118. def f(c):
  119. c :: __main__.C
  120. r0 :: None
  121. L0:
  122. r0 = c.__delitem__(10)
  123. return 1
  124. [case testDundersUnary]
  125. class C:
  126. def __neg__(self) -> int:
  127. return 1
  128. def __invert__(self) -> int:
  129. return 2
  130. def __int__(self) -> int:
  131. return 3
  132. def __float__(self) -> float:
  133. return 4.0
  134. def __pos__(self) -> int:
  135. return 5
  136. def __abs__(self) -> int:
  137. return 6
  138. def __bool__(self) -> bool:
  139. return False
  140. def __complex__(self) -> complex:
  141. return 7j
  142. def f(c: C) -> None:
  143. -c
  144. ~c
  145. int(c)
  146. float(c)
  147. +c
  148. abs(c)
  149. bool(c)
  150. complex(c)
  151. [out]
  152. def C.__neg__(self):
  153. self :: __main__.C
  154. L0:
  155. return 2
  156. def C.__invert__(self):
  157. self :: __main__.C
  158. L0:
  159. return 4
  160. def C.__int__(self):
  161. self :: __main__.C
  162. L0:
  163. return 6
  164. def C.__float__(self):
  165. self :: __main__.C
  166. L0:
  167. return 4.0
  168. def C.__pos__(self):
  169. self :: __main__.C
  170. L0:
  171. return 10
  172. def C.__abs__(self):
  173. self :: __main__.C
  174. L0:
  175. return 12
  176. def C.__bool__(self):
  177. self :: __main__.C
  178. L0:
  179. return 0
  180. def C.__complex__(self):
  181. self :: __main__.C
  182. r0 :: object
  183. L0:
  184. r0 = 7j
  185. return r0
  186. def f(c):
  187. c :: __main__.C
  188. r0, r1, r2 :: int
  189. r3 :: float
  190. r4, r5 :: int
  191. r6 :: bool
  192. r7 :: object
  193. L0:
  194. r0 = c.__neg__()
  195. r1 = c.__invert__()
  196. r2 = c.__int__()
  197. r3 = c.__float__()
  198. r4 = c.__pos__()
  199. r5 = c.__abs__()
  200. r6 = c.__bool__()
  201. r7 = c.__complex__()
  202. return 1