run-i64.test 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519
  1. [case testI64BasicOps]
  2. from typing import List, Any, Tuple, Union
  3. from mypy_extensions import i64, i32, i16
  4. from testutil import assertRaises
  5. def inc(n: i64) -> i64:
  6. return n + 1
  7. def test_inc() -> None:
  8. # Use int() to avoid constant folding
  9. n = 1 + int()
  10. m = 2 + int()
  11. assert inc(n) == m
  12. def min_ll(x: i64, y: i64) -> i64:
  13. if x < y:
  14. return x
  15. else:
  16. return y
  17. def test_min() -> None:
  18. assert min_ll(1 + int(), 2) == 1
  19. assert min_ll(2 + int(), 1) == 1
  20. assert min_ll(1 + int(), 1) == 1
  21. assert min_ll(-2 + int(), 1) == -2
  22. assert min_ll(1 + int(), -2) == -2
  23. def eq(x: i64, y: i64) -> bool:
  24. return x == y
  25. def test_eq() -> None:
  26. assert eq(int(), int())
  27. assert eq(5 + int(), 5 + int())
  28. assert eq(-5 + int(), -5 + int())
  29. assert not eq(int(), 1 + int())
  30. assert not eq(5 + int(), 6 + int())
  31. assert not eq(-5 + int(), -6 + int())
  32. assert not eq(-5 + int(), 5 + int())
  33. def test_comparisons() -> None:
  34. one: i64 = 1 + int()
  35. one2: i64 = 1 + int()
  36. two: i64 = 2 + int()
  37. assert one < two
  38. assert not (one < one2)
  39. assert not (two < one)
  40. assert two > one
  41. assert not (one > one2)
  42. assert not (one > two)
  43. assert one <= two
  44. assert one <= one2
  45. assert not (two <= one)
  46. assert two >= one
  47. assert one >= one2
  48. assert not (one >= two)
  49. assert one == one2
  50. assert not (one == two)
  51. assert one != two
  52. assert not (one != one2)
  53. def is_true(x: i64) -> bool:
  54. if x:
  55. return True
  56. else:
  57. return False
  58. def is_true2(x: i64) -> bool:
  59. return bool(x)
  60. def is_false(x: i64) -> bool:
  61. if not x:
  62. return True
  63. else:
  64. return False
  65. def test_i64_as_bool() -> None:
  66. assert not is_true(0)
  67. assert not is_true2(0)
  68. assert is_false(0)
  69. for x in 1, 55, -1, -7, 1 << 40, -(1 << 50):
  70. assert is_true(x)
  71. assert is_true2(x)
  72. assert not is_false(x)
  73. def bool_as_i64(b: bool) -> i64:
  74. return b
  75. def test_bool_as_i64() -> None:
  76. assert bool_as_i64(False) == 0
  77. assert bool_as_i64(True) == 1
  78. def div_by_3(x: i64) -> i64:
  79. return x // 3
  80. def div_by_neg_3(x: i64) -> i64:
  81. return x // -3
  82. def div(x: i64, y: i64) -> i64:
  83. return x // y
  84. def test_divide_by_constant() -> None:
  85. for i in range(-1000, 1000):
  86. assert div_by_3(i) == i // 3
  87. for i in range(-2**63, -2**63 + 1000):
  88. assert div_by_3(i) == i // 3
  89. for i in range(2**63 - 1000, 2**63):
  90. assert div_by_3(i) == i // 3
  91. def test_divide_by_negative_constant() -> None:
  92. for i in range(-1000, 1000):
  93. assert div_by_neg_3(i) == i // -3
  94. for i in range(-2**63, -2**63 + 1000):
  95. assert div_by_neg_3(i) == i // -3
  96. for i in range(2**63 - 1000, 2**63):
  97. assert div_by_neg_3(i) == i // -3
  98. def test_divide_by_variable() -> None:
  99. values = (list(range(-50, 50)) +
  100. list(range(-2**63, -2**63 + 10)) +
  101. list(range(2**63 - 10, 2**63)))
  102. for x in values:
  103. for y in values:
  104. if y != 0:
  105. if x // y == 2**63:
  106. with assertRaises(OverflowError, "integer division overflow"):
  107. div(x, y)
  108. else:
  109. assert div(x, y) == x // y
  110. else:
  111. with assertRaises(ZeroDivisionError, "integer division or modulo by zero"):
  112. div(x, y)
  113. def mod_by_7(x: i64) -> i64:
  114. return x % 7
  115. def mod_by_neg_7(x: i64) -> i64:
  116. return x // -7
  117. def mod(x: i64, y: i64) -> i64:
  118. return x % y
  119. def test_mod_by_constant() -> None:
  120. for i in range(-1000, 1000):
  121. assert mod_by_7(i) == i % 7
  122. for i in range(-2**63, -2**63 + 1000):
  123. assert mod_by_7(i) == i % 7
  124. for i in range(2**63 - 1000, 2**63):
  125. assert mod_by_7(i) == i % 7
  126. def test_mod_by_negative_constant() -> None:
  127. for i in range(-1000, 1000):
  128. assert mod_by_neg_7(i) == i // -7
  129. for i in range(-2**63, -2**63 + 1000):
  130. assert mod_by_neg_7(i) == i // -7
  131. for i in range(2**63 - 1000, 2**63):
  132. assert mod_by_neg_7(i) == i // -7
  133. def test_mod_by_variable() -> None:
  134. values = (list(range(-50, 50)) +
  135. list(range(-2**63, -2**63 + 10)) +
  136. list(range(2**63 - 10, 2**63)))
  137. for x in values:
  138. for y in values:
  139. if y != 0:
  140. assert mod(x, y) == x % y
  141. else:
  142. with assertRaises(ZeroDivisionError, "integer division or modulo by zero"):
  143. mod(x, y)
  144. def get_item(a: List[i64], n: i64) -> i64:
  145. return a[n]
  146. def test_get_list_item() -> None:
  147. a = [1, 6, -2]
  148. assert get_item(a, 0) == 1
  149. assert get_item(a, 1) == 6
  150. assert get_item(a, 2) == -2
  151. assert get_item(a, -1) == -2
  152. assert get_item(a, -2) == 6
  153. assert get_item(a, -3) == 1
  154. with assertRaises(IndexError, "list index out of range"):
  155. get_item(a, 3)
  156. with assertRaises(IndexError, "list index out of range"):
  157. get_item(a, -4)
  158. # TODO: Very large/small values and indexes
  159. def test_simple_arithmetic_ops() -> None:
  160. zero: i64 = int()
  161. one: i64 = zero + 1
  162. two: i64 = one + 1
  163. neg_one: i64 = -one
  164. assert one + one == 2
  165. assert one + two == 3
  166. assert one + neg_one == 0
  167. assert one - one == 0
  168. assert one - two == -1
  169. assert one * one == 1
  170. assert one * two == 2
  171. assert two * two == 4
  172. assert two * neg_one == -2
  173. assert neg_one * one == -1
  174. assert neg_one * neg_one == 1
  175. assert two * 0 == 0
  176. assert 0 * two == 0
  177. assert -one == -1
  178. assert -two == -2
  179. assert -neg_one == 1
  180. assert -zero == 0
  181. def test_bitwise_ops() -> None:
  182. x: i64 = 7997307308812232241 + int()
  183. y: i64 = 4333433528471475340 + int()
  184. z: i64 = -2462230749488444526 + int()
  185. zero: i64 = int()
  186. one: i64 = zero + 1
  187. two: i64 = zero + 2
  188. neg_one: i64 = -one
  189. assert x & y == 3179577071592752128
  190. assert x & z == 5536089561888850448
  191. assert z & z == z
  192. assert x & zero == 0
  193. assert x | y == 9151163765690955453
  194. assert x | z == -1013002565062733
  195. assert z | z == z
  196. assert x | 0 == x
  197. assert x ^ y == 5971586694098203325
  198. assert x ^ z == -5537102564453913181
  199. assert z ^ z == 0
  200. assert z ^ 0 == z
  201. assert x << one == -2452129456085087134
  202. assert x << two == -4904258912170174268
  203. assert z << two == 8597821075755773512
  204. assert z << 0 == z
  205. assert x >> one == 3998653654406116120
  206. assert x >> two == 1999326827203058060
  207. assert z >> two == -615557687372111132
  208. assert z >> 0 == z
  209. assert ~x == -7997307308812232242
  210. assert ~z == 2462230749488444525
  211. assert ~zero == -1
  212. assert ~neg_one == 0
  213. def test_coerce_to_and_from_int() -> None:
  214. for shift in range(0, 64):
  215. for sign in 1, -1:
  216. for delta in range(-5, 5):
  217. n = sign * (1 << shift) + delta
  218. if -(1 << 63) <= n < (1 << 63):
  219. x: i64 = n
  220. m: int = x
  221. assert m == n
  222. def test_coerce_to_and_from_int2() -> None:
  223. for shift in range(0, 64):
  224. for sign in 1, -1:
  225. for delta in range(-5, 5):
  226. n = sign * (1 << shift) + delta
  227. if -(1 << 63) <= n < (1 << 63):
  228. x: i64 = i64(n)
  229. m: int = int(x)
  230. assert m == n
  231. def test_explicit_conversion_to_i64() -> None:
  232. x = i64(5)
  233. assert x == 5
  234. y = int() - 113
  235. x = i64(y)
  236. assert x == -113
  237. n32: i32 = 1733
  238. x = i64(n32)
  239. assert x == 1733
  240. n32 = -1733
  241. x = i64(n32)
  242. assert x == -1733
  243. z = i64(x)
  244. assert z == -1733
  245. a: i16 = int() + 19764
  246. assert i64(a) == 19764
  247. a = int() - 1
  248. assert i64(a) == -1
  249. def test_explicit_conversion_overflow() -> None:
  250. max_i64 = int() + 2**63 - 1
  251. x = i64(max_i64)
  252. assert x == 2**63 - 1
  253. assert int(x) == max_i64
  254. min_i64 = int() - 2**63
  255. y = i64(min_i64)
  256. assert y == -2**63
  257. assert int(y) == min_i64
  258. too_big = int() + 2**63
  259. with assertRaises(OverflowError):
  260. x = i64(too_big)
  261. too_small = int() - 2**63 - 1
  262. with assertRaises(OverflowError):
  263. x = i64(too_small)
  264. def test_i64_from_large_small_literal() -> None:
  265. x = i64(2**63 - 1)
  266. assert x == 2**63 - 1
  267. x = i64(-2**63)
  268. assert x == -2**63
  269. def from_float(x: float) -> i64:
  270. return i64(x)
  271. def test_explicit_conversion_from_float() -> None:
  272. assert from_float(0.0) == 0
  273. assert from_float(1.456) == 1
  274. assert from_float(-1234.567) == -1234
  275. # Subtract 1024 due to limited precision of 64-bit floats
  276. assert from_float(2**63 - 1024) == 2**63 - 1024
  277. assert from_float(-2**63) == -2**63
  278. # The error message could be better, but this is acceptable
  279. with assertRaises(OverflowError, "int too large to convert to i64"):
  280. assert from_float(float(2**63))
  281. with assertRaises(OverflowError, "int too large to convert to i64"):
  282. # One ulp below the lowest valid i64 value
  283. from_float(float(-2**63 - 2048))
  284. def from_str(s: str) -> i64:
  285. return i64(s)
  286. def test_explicit_conversion_from_str() -> None:
  287. assert from_str("0") == 0
  288. assert from_str("1") == 1
  289. assert from_str("-1234") == -1234
  290. with assertRaises(ValueError):
  291. from_str("1.2")
  292. def from_str_with_base(s: str, base: int) -> i64:
  293. return i64(s, base)
  294. def test_explicit_conversion_from_str_with_base() -> None:
  295. assert from_str_with_base("101", 2) == 5
  296. assert from_str_with_base("109", 10) == 109
  297. assert from_str_with_base("-f0A", 16) == -3850
  298. assert from_str_with_base("0x1a", 16) == 26
  299. assert from_str_with_base("0X1A", 16) == 26
  300. with assertRaises(ValueError):
  301. from_str_with_base("1.2", 16)
  302. def from_bool(b: bool) -> i64:
  303. return i64(b)
  304. def test_explicit_conversion_from_bool() -> None:
  305. assert from_bool(True) == 1
  306. assert from_bool(False) == 0
  307. class IntConv:
  308. def __init__(self, x: i64) -> None:
  309. self.x = x
  310. def __int__(self) -> i64:
  311. return self.x + 1
  312. def test_explicit_conversion_from_instance() -> None:
  313. assert i64(IntConv(0)) == 1
  314. assert i64(IntConv(12345)) == 12346
  315. assert i64(IntConv(-23)) == -22
  316. def test_explicit_conversion_from_any() -> None:
  317. # This can't be specialized
  318. a: Any = "101"
  319. assert i64(a, base=2) == 5
  320. def test_tuple_i64() -> None:
  321. a: i64 = 1
  322. b: i64 = 2
  323. t = (a, b)
  324. a, b = t
  325. assert a == 1
  326. assert b == 2
  327. x: Any = t
  328. tt: Tuple[i64, i64] = x
  329. assert tt == (1, 2)
  330. def test_list_set_item() -> None:
  331. a: List[i64] = [0, 2, 6]
  332. z: i64 = int()
  333. a[z] = 1
  334. assert a == [1, 2, 6]
  335. a[z + 2] = 9
  336. assert a == [1, 2, 9]
  337. a[-(z + 1)] = 10
  338. assert a == [1, 2, 10]
  339. a[-(z + 3)] = 3
  340. assert a == [3, 2, 10]
  341. with assertRaises(IndexError):
  342. a[z + 3] = 0
  343. with assertRaises(IndexError):
  344. a[-(z + 4)] = 0
  345. assert a == [3, 2, 10]
  346. class C:
  347. def __init__(self, x: i64) -> None:
  348. self.x = x
  349. def test_attributes() -> None:
  350. i: i64
  351. for i in range(-1000, 1000):
  352. c = C(i)
  353. assert c.x == i
  354. c.x = i + 1
  355. assert c.x == i + 1
  356. def test_mixed_comparisons() -> None:
  357. i64_3: i64 = int() + 3
  358. int_5 = int() + 5
  359. assert i64_3 < int_5
  360. assert int_5 > i64_3
  361. b = i64_3 > int_5
  362. assert not b
  363. int_largest = int() + (1 << 63) - 1
  364. assert int_largest > i64_3
  365. int_smallest = int() - (1 << 63)
  366. assert i64_3 > int_smallest
  367. int_too_big = int() + (1 << 63)
  368. int_too_small = int() - (1 << 63) - 1
  369. with assertRaises(OverflowError):
  370. assert i64_3 < int_too_big
  371. with assertRaises(OverflowError):
  372. assert int_too_big < i64_3
  373. with assertRaises(OverflowError):
  374. assert i64_3 > int_too_small
  375. with assertRaises(OverflowError):
  376. assert int_too_small < i64_3
  377. def test_mixed_comparisons_32bit() -> None:
  378. # Test edge cases on 32-bit platforms
  379. i64_3: i64 = int() + 3
  380. int_5 = int() + 5
  381. int_largest_short = int() + (1 << 30) - 1
  382. int_largest_short_i64: i64 = int_largest_short
  383. assert int_largest_short > i64_3
  384. int_smallest_short = int() - (1 << 30)
  385. int_smallest_short_i64: i64 = int_smallest_short
  386. assert i64_3 > int_smallest_short
  387. int_big = int() + (1 << 30)
  388. assert int_big > i64_3
  389. int_small = int() - (1 << 30) - 1
  390. assert i64_3 > int_small
  391. assert int_smallest_short_i64 > int_small
  392. assert int_largest_short_i64 < int_big
  393. def test_mixed_arithmetic_and_bitwise_ops() -> None:
  394. i64_3: i64 = int() + 3
  395. int_5 = int() + 5
  396. assert i64_3 + int_5 == 8
  397. assert int_5 - i64_3 == 2
  398. assert i64_3 << int_5 == 96
  399. assert int_5 << i64_3 == 40
  400. assert i64_3 ^ int_5 == 6
  401. assert int_5 | i64_3 == 7
  402. int_largest = int() + (1 << 63) - 1
  403. assert int_largest - i64_3 == 9223372036854775804
  404. int_smallest = int() - (1 << 63)
  405. assert int_smallest + i64_3 == -9223372036854775805
  406. int_too_big = int() + (1 << 63)
  407. int_too_small = int() - (1 << 63) - 1
  408. with assertRaises(OverflowError):
  409. assert i64_3 & int_too_big
  410. with assertRaises(OverflowError):
  411. assert int_too_small & i64_3
  412. def test_for_loop() -> None:
  413. n: i64 = 0
  414. for i in range(i64(5 + int())):
  415. n += i
  416. assert n == 10
  417. n = 0
  418. for i in range(i64(5)):
  419. n += i
  420. assert n == 10
  421. n = 0
  422. for i in range(i64(2 + int()), 5 + int()):
  423. n += i
  424. assert n == 9
  425. n = 0
  426. for i in range(2, i64(5 + int())):
  427. n += i
  428. assert n == 9
  429. assert sum([x * x for x in range(i64(4 + int()))]) == 1 + 4 + 9
  430. def narrow1(x: Union[str, i64]) -> i64:
  431. if isinstance(x, i64):
  432. return x
  433. return len(x)
  434. def narrow2(x: Union[str, i64]) -> i64:
  435. if isinstance(x, int):
  436. return x
  437. return len(x)
  438. def test_isinstance() -> None:
  439. assert narrow1(123) == 123
  440. assert narrow1("foobar") == 6
  441. assert narrow2(123) == 123
  442. assert narrow2("foobar") == 6
  443. [case testI64ErrorValuesAndUndefined]
  444. from typing import Any, Tuple
  445. import sys
  446. from mypy_extensions import mypyc_attr, i64
  447. from typing_extensions import Final
  448. from testutil import assertRaises
  449. def maybe_raise(n: i64, error: bool) -> i64:
  450. if error:
  451. raise ValueError()
  452. return n
  453. def test_error_value() -> None:
  454. for i in range(-1000, 1000):
  455. assert maybe_raise(i, False) == i
  456. with assertRaises(ValueError):
  457. maybe_raise(0, True)
  458. class C:
  459. def maybe_raise(self, n: i64, error: bool) -> i64:
  460. if error:
  461. raise ValueError()
  462. return n
  463. def test_method_error_value() -> None:
  464. for i in range(-1000, 1000):
  465. assert C().maybe_raise(i, False) == i
  466. with assertRaises(ValueError):
  467. C().maybe_raise(0, True)
  468. def maybe_raise_tuple(n: i64, error: bool) -> Tuple[i64, i64]:
  469. if error:
  470. raise ValueError()
  471. return n, n+ 1
  472. def test_tuple_error_value() -> None:
  473. for i in range(-1000, 1000):
  474. assert maybe_raise_tuple(i, False) == (i, i + 1)
  475. with assertRaises(ValueError):
  476. maybe_raise_tuple(0, True)
  477. f: Any = maybe_raise_tuple
  478. for i in range(-1000, 1000):
  479. assert f(i, False) == (i, i + 1)
  480. with assertRaises(ValueError):
  481. f(0, True)
  482. def maybe_raise_tuple2(n: i64, error: bool) -> Tuple[i64, int]:
  483. if error:
  484. raise ValueError()
  485. return n, n+ 1
  486. def test_tuple_error_value_2() -> None:
  487. for i in range(-1000, 1000):
  488. assert maybe_raise_tuple2(i, False) == (i, i + 1)
  489. with assertRaises(ValueError):
  490. maybe_raise_tuple(0, True)
  491. def test_unbox_int() -> None:
  492. for i in list(range(-1000, 1000)) + [-(1 << 63), (1 << 63) - 1]:
  493. o: Any = i
  494. x: i64 = i
  495. assert x == i
  496. y: i64 = o
  497. assert y == i
  498. def test_unbox_int_fails() -> None:
  499. o: Any = 'x'
  500. if sys.version_info[0] == 3 and sys.version_info[1] < 10:
  501. msg = "an integer is required (got type str)"
  502. else:
  503. msg = "'str' object cannot be interpreted as an integer"
  504. with assertRaises(TypeError, msg):
  505. x: i64 = o
  506. o2: Any = 1 << 63
  507. with assertRaises(OverflowError, "int too large to convert to i64"):
  508. y: i64 = o2
  509. o3: Any = -(1 << 63 + 1)
  510. with assertRaises(OverflowError, "int too large to convert to i64"):
  511. z: i64 = o3
  512. class Uninit:
  513. x: i64
  514. y: i64 = 0
  515. z: i64
  516. class Derived(Uninit):
  517. a: i64 = 1
  518. b: i64
  519. c: i64 = 2
  520. class Derived2(Derived):
  521. h: i64
  522. def test_uninitialized_attr() -> None:
  523. o = Uninit()
  524. assert o.y == 0
  525. with assertRaises(AttributeError):
  526. o.x
  527. with assertRaises(AttributeError):
  528. o.z
  529. o.x = 1
  530. assert o.x == 1
  531. with assertRaises(AttributeError):
  532. o.z
  533. o.z = 2
  534. assert o.z == 2
  535. # This is the error value, but it's also a valid normal value
  536. MAGIC: Final = -113
  537. def test_magic_value() -> None:
  538. o = Uninit()
  539. o.x = MAGIC
  540. assert o.x == MAGIC
  541. with assertRaises(AttributeError):
  542. o.z
  543. o.z = MAGIC
  544. assert o.x == MAGIC
  545. assert o.z == MAGIC
  546. def test_magic_value_via_any() -> None:
  547. o: Any = Uninit()
  548. with assertRaises(AttributeError):
  549. o.x
  550. with assertRaises(AttributeError):
  551. o.z
  552. o.x = MAGIC
  553. assert o.x == MAGIC
  554. with assertRaises(AttributeError):
  555. o.z
  556. o.z = MAGIC
  557. assert o.z == MAGIC
  558. def test_magic_value_and_inheritance() -> None:
  559. o = Derived2()
  560. o.x = MAGIC
  561. assert o.x == MAGIC
  562. with assertRaises(AttributeError):
  563. o.z
  564. with assertRaises(AttributeError):
  565. o.b
  566. with assertRaises(AttributeError):
  567. o.h
  568. o.z = MAGIC
  569. assert o.z == MAGIC
  570. with assertRaises(AttributeError):
  571. o.b
  572. with assertRaises(AttributeError):
  573. o.h
  574. o.h = MAGIC
  575. assert o.h == MAGIC
  576. with assertRaises(AttributeError):
  577. o.b
  578. o.b = MAGIC
  579. assert o.b == MAGIC
  580. @mypyc_attr(allow_interpreted_subclasses=True)
  581. class MagicInit:
  582. x: i64 = MAGIC
  583. def test_magic_value_as_initializer() -> None:
  584. o = MagicInit()
  585. assert o.x == MAGIC
  586. class ManyUninit:
  587. a1: i64
  588. a2: i64
  589. a3: i64
  590. a4: i64
  591. a5: i64
  592. a6: i64
  593. a7: i64
  594. a8: i64
  595. a9: i64
  596. a10: i64
  597. a11: i64
  598. a12: i64
  599. a13: i64
  600. a14: i64
  601. a15: i64
  602. a16: i64
  603. a17: i64
  604. a18: i64
  605. a19: i64
  606. a20: i64
  607. a21: i64
  608. a22: i64
  609. a23: i64
  610. a24: i64
  611. a25: i64
  612. a26: i64
  613. a27: i64
  614. a28: i64
  615. a29: i64
  616. a30: i64
  617. a31: i64
  618. a32: i64
  619. a33: i64
  620. a34: i64
  621. a35: i64
  622. a36: i64
  623. a37: i64
  624. a38: i64
  625. a39: i64
  626. a40: i64
  627. a41: i64
  628. a42: i64
  629. a43: i64
  630. a44: i64
  631. a45: i64
  632. a46: i64
  633. a47: i64
  634. a48: i64
  635. a49: i64
  636. a50: i64
  637. a51: i64
  638. a52: i64
  639. a53: i64
  640. a54: i64
  641. a55: i64
  642. a56: i64
  643. a57: i64
  644. a58: i64
  645. a59: i64
  646. a60: i64
  647. a61: i64
  648. a62: i64
  649. a63: i64
  650. a64: i64
  651. a65: i64
  652. a66: i64
  653. a67: i64
  654. a68: i64
  655. a69: i64
  656. a70: i64
  657. a71: i64
  658. a72: i64
  659. a73: i64
  660. a74: i64
  661. a75: i64
  662. a76: i64
  663. a77: i64
  664. a78: i64
  665. a79: i64
  666. a80: i64
  667. a81: i64
  668. a82: i64
  669. a83: i64
  670. a84: i64
  671. a85: i64
  672. a86: i64
  673. a87: i64
  674. a88: i64
  675. a89: i64
  676. a90: i64
  677. a91: i64
  678. a92: i64
  679. a93: i64
  680. a94: i64
  681. a95: i64
  682. a96: i64
  683. a97: i64
  684. a98: i64
  685. a99: i64
  686. a100: i64
  687. def test_many_uninitialized_attributes() -> None:
  688. o = ManyUninit()
  689. with assertRaises(AttributeError):
  690. o.a1
  691. with assertRaises(AttributeError):
  692. o.a10
  693. with assertRaises(AttributeError):
  694. o.a20
  695. with assertRaises(AttributeError):
  696. o.a30
  697. with assertRaises(AttributeError):
  698. o.a31
  699. with assertRaises(AttributeError):
  700. o.a32
  701. with assertRaises(AttributeError):
  702. o.a33
  703. with assertRaises(AttributeError):
  704. o.a40
  705. with assertRaises(AttributeError):
  706. o.a50
  707. with assertRaises(AttributeError):
  708. o.a60
  709. with assertRaises(AttributeError):
  710. o.a62
  711. with assertRaises(AttributeError):
  712. o.a63
  713. with assertRaises(AttributeError):
  714. o.a64
  715. with assertRaises(AttributeError):
  716. o.a65
  717. with assertRaises(AttributeError):
  718. o.a80
  719. with assertRaises(AttributeError):
  720. o.a100
  721. o.a30 = MAGIC
  722. assert o.a30 == MAGIC
  723. o.a31 = MAGIC
  724. assert o.a31 == MAGIC
  725. o.a32 = MAGIC
  726. assert o.a32 == MAGIC
  727. o.a33 = MAGIC
  728. assert o.a33 == MAGIC
  729. with assertRaises(AttributeError):
  730. o.a34
  731. o.a62 = MAGIC
  732. assert o.a62 == MAGIC
  733. o.a63 = MAGIC
  734. assert o.a63 == MAGIC
  735. o.a64 = MAGIC
  736. assert o.a64 == MAGIC
  737. o.a65 = MAGIC
  738. assert o.a65 == MAGIC
  739. with assertRaises(AttributeError):
  740. o.a66
  741. class BaseNoBitmap:
  742. x: int = 5
  743. class DerivedBitmap(BaseNoBitmap):
  744. # Subclass needs a bitmap, but base class doesn't have it.
  745. y: i64
  746. def test_derived_adds_bitmap() -> None:
  747. d = DerivedBitmap()
  748. d.x = 643
  749. b: BaseNoBitmap = d
  750. assert b.x == 643
  751. class Delete:
  752. __deletable__ = ['x', 'y']
  753. x: i64
  754. y: i64
  755. def test_del() -> None:
  756. o = Delete()
  757. o.x = MAGIC
  758. o.y = -1
  759. assert o.x == MAGIC
  760. assert o.y == -1
  761. del o.x
  762. with assertRaises(AttributeError):
  763. o.x
  764. assert o.y == -1
  765. del o.y
  766. with assertRaises(AttributeError):
  767. o.y
  768. o.x = 5
  769. assert o.x == 5
  770. with assertRaises(AttributeError):
  771. o.y
  772. del o.x
  773. with assertRaises(AttributeError):
  774. o.x
  775. class UndefinedTuple:
  776. def __init__(self, x: i64, y: i64) -> None:
  777. if x != 0:
  778. self.t = (x, y)
  779. def test_undefined_native_int_tuple() -> None:
  780. o = UndefinedTuple(MAGIC, MAGIC)
  781. assert o.t[0] == MAGIC
  782. assert o.t[1] == MAGIC
  783. o = UndefinedTuple(0, 0)
  784. with assertRaises(AttributeError):
  785. o.t
  786. o = UndefinedTuple(-13, 45)
  787. assert o.t == (-13, 45)
  788. def test_undefined_native_int_tuple_via_any() -> None:
  789. cls: Any = UndefinedTuple
  790. o: Any = cls(MAGIC, MAGIC)
  791. assert o.t[0] == MAGIC
  792. assert o.t[1] == MAGIC
  793. o = cls(0, 0)
  794. with assertRaises(AttributeError):
  795. o.t
  796. o = UndefinedTuple(-13, 45)
  797. assert o.t == (-13, 45)
  798. [case testI64DefaultArgValues]
  799. from typing import Any, Iterator, Tuple
  800. from typing_extensions import Final
  801. MAGIC: Final = -113
  802. from mypy_extensions import i64
  803. def f(x: i64, y: i64 = 5) -> i64:
  804. return x + y
  805. def test_simple_default_arg() -> None:
  806. assert f(3) == 8
  807. assert f(4, 9) == 13
  808. assert f(5, MAGIC) == -108
  809. for i in range(-1000, 1000):
  810. assert f(1, i) == 1 + i
  811. f2: Any = f
  812. assert f2(3) == 8
  813. assert f2(4, 9) == 13
  814. assert f2(5, MAGIC) == -108
  815. def g(a: i64, b: i64 = 1, c: int = 2, d: i64 = 3) -> i64:
  816. return a + b + c + d
  817. def test_two_default_args() -> None:
  818. assert g(10) == 16
  819. assert g(10, 2) == 17
  820. assert g(10, 2, 3) == 18
  821. assert g(10, 2, 3, 4) == 19
  822. g2: Any = g
  823. assert g2(10) == 16
  824. assert g2(10, 2) == 17
  825. assert g2(10, 2, 3) == 18
  826. assert g2(10, 2, 3, 4) == 19
  827. class C:
  828. def __init__(self) -> None:
  829. self.i: i64 = 1
  830. def m(self, a: i64, b: i64 = 1, c: int = 2, d: i64 = 3) -> i64:
  831. return self.i + a + b + c + d
  832. class D(C):
  833. def m(self, a: i64, b: i64 = 2, c: int = 3, d: i64 = 4) -> i64:
  834. return self.i + a + b + c + d
  835. def mm(self, a: i64 = 2, b: i64 = 1) -> i64:
  836. return self.i + a + b
  837. @staticmethod
  838. def s(a: i64 = 2, b: i64 = 1) -> i64:
  839. return a + b
  840. @classmethod
  841. def c(cls, a: i64 = 2, b: i64 = 3) -> i64:
  842. assert cls is D
  843. return a + b
  844. def test_method_default_args() -> None:
  845. a = [C(), D()]
  846. assert a[0].m(4) == 11
  847. d = D()
  848. assert d.mm() == 4
  849. assert d.mm(5) == 7
  850. assert d.mm(MAGIC) == MAGIC + 2
  851. assert d.mm(b=5) == 8
  852. assert D.mm(d) == 4
  853. assert D.mm(d, 6) == 8
  854. assert D.mm(d, MAGIC) == MAGIC + 2
  855. assert D.mm(d, b=6) == 9
  856. dd: Any = d
  857. assert dd.mm() == 4
  858. assert dd.mm(5) == 7
  859. assert dd.mm(MAGIC) == MAGIC + 2
  860. assert dd.mm(b=5) == 8
  861. def test_static_method_default_args() -> None:
  862. d = D()
  863. assert d.s() == 3
  864. assert d.s(5) == 6
  865. assert d.s(MAGIC) == MAGIC + 1
  866. assert d.s(5, 6) == 11
  867. assert D.s() == 3
  868. assert D.s(5) == 6
  869. assert D.s(MAGIC) == MAGIC + 1
  870. assert D.s(5, 6) == 11
  871. dd: Any = d
  872. assert dd.s() == 3
  873. assert dd.s(5) == 6
  874. assert dd.s(MAGIC) == MAGIC + 1
  875. assert dd.s(5, 6) == 11
  876. def test_class_method_default_args() -> None:
  877. d = D()
  878. assert d.c() == 5
  879. assert d.c(5) == 8
  880. assert d.c(MAGIC) == MAGIC + 3
  881. assert d.c(b=5) == 7
  882. assert D.c() == 5
  883. assert D.c(5) == 8
  884. assert D.c(MAGIC) == MAGIC + 3
  885. assert D.c(b=5) == 7
  886. dd: Any = d
  887. assert dd.c() == 5
  888. assert dd.c(5) == 8
  889. assert dd.c(MAGIC) == MAGIC + 3
  890. assert dd.c(b=5) == 7
  891. class Init:
  892. def __init__(self, x: i64 = 2, y: i64 = 5) -> None:
  893. self.x = x
  894. self.y = y
  895. def test_init_default_args() -> None:
  896. o = Init()
  897. assert o.x == 2
  898. assert o.y == 5
  899. o = Init(7, 8)
  900. assert o.x == 7
  901. assert o.y == 8
  902. o = Init(4)
  903. assert o.x == 4
  904. assert o.y == 5
  905. o = Init(MAGIC, MAGIC)
  906. assert o.x == MAGIC
  907. assert o.y == MAGIC
  908. o = Init(3, MAGIC)
  909. assert o.x == 3
  910. assert o.y == MAGIC
  911. o = Init(MAGIC, 11)
  912. assert o.x == MAGIC
  913. assert o.y == 11
  914. o = Init(MAGIC)
  915. assert o.x == MAGIC
  916. assert o.y == 5
  917. o = Init(y=MAGIC)
  918. assert o.x == 2
  919. assert o.y == MAGIC
  920. def kw_only(*, a: i64 = 1, b: int = 2, c: i64 = 3) -> i64:
  921. return a + b + c * 2
  922. def test_kw_only_default_args() -> None:
  923. assert kw_only() == 9
  924. assert kw_only(a=2) == 10
  925. assert kw_only(b=4) == 11
  926. assert kw_only(c=11) == 25
  927. assert kw_only(a=2, c=4) == 12
  928. assert kw_only(c=4, a=2) == 12
  929. kw_only2: Any = kw_only
  930. assert kw_only2() == 9
  931. assert kw_only2(a=2) == 10
  932. assert kw_only2(b=4) == 11
  933. assert kw_only2(c=11) == 25
  934. assert kw_only2(a=2, c=4) == 12
  935. assert kw_only2(c=4, a=2) == 12
  936. def tuples(t: Tuple[i64, i64] = (MAGIC, MAGIC)) -> i64:
  937. return t[0] + t[1]
  938. def test_tuple_arg_defaults() -> None:
  939. assert tuples() == 2 * MAGIC
  940. assert tuples((1, 2)) == 3
  941. assert tuples((MAGIC, MAGIC)) == 2 * MAGIC
  942. tuples2: Any = tuples
  943. assert tuples2() == 2 * MAGIC
  944. assert tuples2((1, 2)) == 3
  945. assert tuples2((MAGIC, MAGIC)) == 2 * MAGIC
  946. class TupleInit:
  947. def __init__(self, t: Tuple[i64, i64] = (MAGIC, MAGIC)) -> None:
  948. self.t = t[0] + t[1]
  949. def test_tuple_init_arg_defaults() -> None:
  950. assert TupleInit().t == 2 * MAGIC
  951. assert TupleInit((1, 2)).t == 3
  952. assert TupleInit((MAGIC, MAGIC)).t == 2 * MAGIC
  953. o: Any = TupleInit
  954. assert o().t == 2 * MAGIC
  955. assert o((1, 2)).t == 3
  956. assert o((MAGIC, MAGIC)).t == 2 * MAGIC
  957. def many_args(
  958. a1: i64 = 0,
  959. a2: i64 = 1,
  960. a3: i64 = 2,
  961. a4: i64 = 3,
  962. a5: i64 = 4,
  963. a6: i64 = 5,
  964. a7: i64 = 6,
  965. a8: i64 = 7,
  966. a9: i64 = 8,
  967. a10: i64 = 9,
  968. a11: i64 = 10,
  969. a12: i64 = 11,
  970. a13: i64 = 12,
  971. a14: i64 = 13,
  972. a15: i64 = 14,
  973. a16: i64 = 15,
  974. a17: i64 = 16,
  975. a18: i64 = 17,
  976. a19: i64 = 18,
  977. a20: i64 = 19,
  978. a21: i64 = 20,
  979. a22: i64 = 21,
  980. a23: i64 = 22,
  981. a24: i64 = 23,
  982. a25: i64 = 24,
  983. a26: i64 = 25,
  984. a27: i64 = 26,
  985. a28: i64 = 27,
  986. a29: i64 = 28,
  987. a30: i64 = 29,
  988. a31: i64 = 30,
  989. a32: i64 = 31,
  990. a33: i64 = 32,
  991. a34: i64 = 33,
  992. ) -> i64:
  993. return a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + a11 + a12 + a13 + a14 + a15 + a16 + a17 + a18 + a19 + a20 + a21 + a22 + a23 + a24 + a25 + a26 + a27 + a28 + a29 + a30 + a31 + a32 + a33 + a34
  994. def test_many_args() -> None:
  995. assert many_args() == 561
  996. assert many_args(a1=100) == 661
  997. assert many_args(a2=101) == 661
  998. assert many_args(a15=114) == 661
  999. assert many_args(a31=130) == 661
  1000. assert many_args(a32=131) == 661
  1001. assert many_args(a33=232) == 761
  1002. assert many_args(a34=333) == 861
  1003. assert many_args(a1=100, a33=232) == 861
  1004. f: Any = many_args
  1005. assert f() == 561
  1006. assert f(a1=100) == 661
  1007. assert f(a2=101) == 661
  1008. assert f(a15=114) == 661
  1009. assert f(a31=130) == 661
  1010. assert f(a32=131) == 661
  1011. assert f(a33=232) == 761
  1012. assert f(a34=333) == 861
  1013. assert f(a1=100, a33=232) == 861
  1014. def test_nested_function_defaults() -> None:
  1015. a: i64 = 1
  1016. def nested(x: i64 = 2, y: i64 = 3) -> i64:
  1017. return a + x + y
  1018. assert nested() == 6
  1019. assert nested(3) == 7
  1020. assert nested(y=5) == 8
  1021. assert nested(MAGIC) == MAGIC + 4
  1022. a = 11
  1023. assert nested() == 16
  1024. def test_nested_function_defaults_via_any() -> None:
  1025. a: i64 = 1
  1026. def nested_native(x: i64 = 2, y: i64 = 3) -> i64:
  1027. return a + x + y
  1028. nested: Any = nested_native
  1029. assert nested() == 6
  1030. assert nested(3) == 7
  1031. assert nested(y=5) == 8
  1032. assert nested(MAGIC) == MAGIC + 4
  1033. a = 11
  1034. assert nested() == 16
  1035. def gen(x: i64 = 1, y: i64 = 2) -> Iterator[i64]:
  1036. yield x + y
  1037. def test_generator() -> None:
  1038. g = gen()
  1039. assert next(g) == 3
  1040. g = gen(2)
  1041. assert next(g) == 4
  1042. g = gen(2, 3)
  1043. assert next(g) == 5
  1044. a: Any = gen
  1045. g = a()
  1046. assert next(g) == 3
  1047. g = a(2)
  1048. assert next(g) == 4
  1049. g = a(2, 3)
  1050. assert next(g) == 5
  1051. def magic_default(x: i64 = MAGIC) -> i64:
  1052. return x
  1053. def test_magic_default() -> None:
  1054. assert magic_default() == MAGIC
  1055. assert magic_default(1) == 1
  1056. assert magic_default(MAGIC) == MAGIC
  1057. a: Any = magic_default
  1058. assert a() == MAGIC
  1059. assert a(1) == 1
  1060. assert a(MAGIC) == MAGIC
  1061. [case testI64UndefinedLocal]
  1062. from typing_extensions import Final
  1063. from mypy_extensions import i64, i32
  1064. from testutil import assertRaises
  1065. MAGIC: Final = -113
  1066. def test_conditionally_defined_local() -> None:
  1067. x = not int()
  1068. if x:
  1069. y: i64 = 5
  1070. z: i32 = 6
  1071. assert y == 5
  1072. assert z == 6
  1073. def test_conditionally_undefined_local() -> None:
  1074. x = int()
  1075. if x:
  1076. y: i64 = 5
  1077. z: i32 = 6
  1078. else:
  1079. ok: i64 = 7
  1080. assert ok == 7
  1081. try:
  1082. print(y)
  1083. except NameError as e:
  1084. assert str(e) == 'local variable "y" referenced before assignment'
  1085. else:
  1086. assert False
  1087. try:
  1088. print(z)
  1089. except NameError as e:
  1090. assert str(e) == 'local variable "z" referenced before assignment'
  1091. else:
  1092. assert False
  1093. def test_assign_error_value_conditionally() -> None:
  1094. x = int()
  1095. if not x:
  1096. y: i64 = MAGIC
  1097. z: i32 = MAGIC
  1098. assert y == MAGIC
  1099. assert z == MAGIC
  1100. def tuple_case(x: i64, y: i64) -> None:
  1101. if not int():
  1102. t = (x, y)
  1103. assert t == (x, y)
  1104. if int():
  1105. t2 = (x, y)
  1106. try:
  1107. print(t2)
  1108. except NameError as e:
  1109. assert str(e) == 'local variable "t2" referenced before assignment'
  1110. else:
  1111. assert False
  1112. def test_conditionally_undefined_tuple() -> None:
  1113. tuple_case(2, 3)
  1114. tuple_case(-2, -3)
  1115. tuple_case(MAGIC, MAGIC)
  1116. def test_many_locals() -> None:
  1117. x = int()
  1118. if x:
  1119. a0: i64 = 0
  1120. a1: i64 = 1
  1121. a2: i64 = 2
  1122. a3: i64 = 3
  1123. a4: i64 = 4
  1124. a5: i64 = 5
  1125. a6: i64 = 6
  1126. a7: i64 = 7
  1127. a8: i64 = 8
  1128. a9: i64 = 9
  1129. a10: i64 = 10
  1130. a11: i64 = 11
  1131. a12: i64 = 12
  1132. a13: i64 = 13
  1133. a14: i64 = 14
  1134. a15: i64 = 15
  1135. a16: i64 = 16
  1136. a17: i64 = 17
  1137. a18: i64 = 18
  1138. a19: i64 = 19
  1139. a20: i64 = 20
  1140. a21: i64 = 21
  1141. a22: i64 = 22
  1142. a23: i64 = 23
  1143. a24: i64 = 24
  1144. a25: i64 = 25
  1145. a26: i64 = 26
  1146. a27: i64 = 27
  1147. a28: i64 = 28
  1148. a29: i64 = 29
  1149. a30: i64 = 30
  1150. a31: i64 = 31
  1151. a32: i64 = 32
  1152. a33: i64 = 33
  1153. with assertRaises(NameError):
  1154. print(a0)
  1155. with assertRaises(NameError):
  1156. print(a31)
  1157. with assertRaises(NameError):
  1158. print(a32)
  1159. with assertRaises(NameError):
  1160. print(a33)
  1161. a0 = 5
  1162. assert a0 == 5
  1163. with assertRaises(NameError):
  1164. print(a31)
  1165. with assertRaises(NameError):
  1166. print(a32)
  1167. with assertRaises(NameError):
  1168. print(a33)
  1169. a32 = 55
  1170. assert a0 == 5
  1171. assert a32 == 55
  1172. with assertRaises(NameError):
  1173. print(a31)
  1174. with assertRaises(NameError):
  1175. print(a33)
  1176. a31 = 10
  1177. a33 = 20
  1178. assert a0 == 5
  1179. assert a31 == 10
  1180. assert a32 == 55
  1181. assert a33 == 20
  1182. [case testI64GlueMethodsAndInheritance]
  1183. from typing import Any
  1184. from typing_extensions import Final
  1185. from mypy_extensions import i64, trait
  1186. from testutil import assertRaises
  1187. MAGIC: Final = -113
  1188. class Base:
  1189. def foo(self) -> i64:
  1190. return 5
  1191. def bar(self, x: i64 = 2) -> i64:
  1192. return x + 1
  1193. def hoho(self, x: i64) -> i64:
  1194. return x - 1
  1195. class Derived(Base):
  1196. def foo(self, x: i64 = 5) -> i64:
  1197. return x + 10
  1198. def bar(self, x: i64 = 3, y: i64 = 20) -> i64:
  1199. return x + y + 2
  1200. def hoho(self, x: i64 = 7) -> i64:
  1201. return x - 2
  1202. def test_derived_adds_bitmap() -> None:
  1203. b: Base = Derived()
  1204. assert b.foo() == 15
  1205. def test_derived_adds_another_default_arg() -> None:
  1206. b: Base = Derived()
  1207. assert b.bar() == 25
  1208. assert b.bar(1) == 23
  1209. assert b.bar(MAGIC) == MAGIC + 22
  1210. def test_derived_switches_arg_to_have_default() -> None:
  1211. b: Base = Derived()
  1212. assert b.hoho(5) == 3
  1213. assert b.hoho(MAGIC) == MAGIC - 2
  1214. @trait
  1215. class T:
  1216. @property
  1217. def x(self) -> i64: ...
  1218. @property
  1219. def y(self) -> i64: ...
  1220. class C(T):
  1221. x: i64 = 1
  1222. y: i64 = 4
  1223. def test_read_only_property_in_trait_implemented_as_attribute() -> None:
  1224. c = C()
  1225. c.x = 5
  1226. assert c.x == 5
  1227. c.x = MAGIC
  1228. assert c.x == MAGIC
  1229. assert c.y == 4
  1230. c.y = 6
  1231. assert c.y == 6
  1232. t: T = C()
  1233. assert t.y == 4
  1234. t = c
  1235. assert t.x == MAGIC
  1236. c.x = 55
  1237. assert t.x == 55
  1238. assert t.y == 6
  1239. a: Any = c
  1240. assert a.x == 55
  1241. assert a.y == 6
  1242. a.x = 7
  1243. a.y = 8
  1244. assert a.x == 7
  1245. assert a.y == 8
  1246. class D(T):
  1247. xx: i64
  1248. @property
  1249. def x(self) -> i64:
  1250. return self.xx
  1251. @property
  1252. def y(self) -> i64:
  1253. raise TypeError
  1254. def test_read_only_property_in_trait_implemented_as_property() -> None:
  1255. d = D()
  1256. d.xx = 5
  1257. assert d.x == 5
  1258. d.xx = MAGIC
  1259. assert d.x == MAGIC
  1260. with assertRaises(TypeError):
  1261. d.y
  1262. t: T = d
  1263. assert t.x == MAGIC
  1264. d.xx = 6
  1265. assert t.x == 6
  1266. with assertRaises(TypeError):
  1267. t.y
  1268. @trait
  1269. class T2:
  1270. x: i64
  1271. y: i64
  1272. class C2(T2):
  1273. pass
  1274. def test_inherit_trait_attribute() -> None:
  1275. c = C2()
  1276. c.x = 5
  1277. assert c.x == 5
  1278. c.x = MAGIC
  1279. assert c.x == MAGIC
  1280. with assertRaises(AttributeError):
  1281. c.y
  1282. c.y = 6
  1283. assert c.y == 6
  1284. t: T2 = C2()
  1285. with assertRaises(AttributeError):
  1286. t.y
  1287. t = c
  1288. assert t.x == MAGIC
  1289. c.x = 55
  1290. assert t.x == 55
  1291. assert t.y == 6
  1292. a: Any = c
  1293. assert a.x == 55
  1294. assert a.y == 6
  1295. a.x = 7
  1296. a.y = 8
  1297. assert a.x == 7
  1298. assert a.y == 8
  1299. class D2(T2):
  1300. x: i64
  1301. y: i64 = 4
  1302. def test_implement_trait_attribute() -> None:
  1303. d = D2()
  1304. d.x = 5
  1305. assert d.x == 5
  1306. d.x = MAGIC
  1307. assert d.x == MAGIC
  1308. assert d.y == 4
  1309. d.y = 6
  1310. assert d.y == 6
  1311. t: T2 = D2()
  1312. assert t.y == 4
  1313. t = d
  1314. assert t.x == MAGIC
  1315. d.x = 55
  1316. assert t.x == 55
  1317. assert t.y == 6
  1318. a: Any = d
  1319. assert a.x == 55
  1320. assert a.y == 6
  1321. a.x = 7
  1322. a.y = 8
  1323. assert a.x == 7
  1324. assert a.y == 8
  1325. class DunderErr:
  1326. def __contains__(self, i: i64) -> bool:
  1327. raise IndexError()
  1328. def test_dunder_arg_check() -> None:
  1329. o: Any = DunderErr()
  1330. with assertRaises(TypeError):
  1331. 'x' in o
  1332. with assertRaises(TypeError):
  1333. 2**63 in o
  1334. with assertRaises(IndexError):
  1335. 1 in o