99_extras.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. try:
  2. a = [1, 2, 3]
  3. a.index(999)
  4. exit(1)
  5. except ValueError:
  6. pass
  7. # test some python magics
  8. class TestMagics:
  9. def __init__(self):
  10. self.d = {}
  11. def __getitem__(self, index):
  12. return self.d[index]
  13. def __setitem__(self, index, value):
  14. self.d[index] = value
  15. def __contains__(self, index):
  16. return index in self.d
  17. def __delitem__(self, index):
  18. del self.d[index]
  19. a = TestMagics()
  20. a['1'] = 3
  21. assert '1' in a
  22. assert '2' not in a
  23. assert a['1'] == 3
  24. del a['1']
  25. assert '1' not in a
  26. # slice extras
  27. class A:
  28. def __getitem__(self, index):
  29. return index
  30. assert slice(1, 2, None) == slice(1, 2, None)
  31. assert slice(1, 3, None) != slice(1, 2, None)
  32. assert A()[1] == 1
  33. assert A()[1:2, 3] == (slice(1, 2, None), 3)
  34. assert A()[1:2, 3:4] == (slice(1, 2, None), slice(3, 4, None))
  35. assert A()[1:2, 3:4, 5] == (slice(1, 2, None), slice(3, 4, None), 5)
  36. assert A()[:, :] == (slice(None, None, None), slice(None, None, None))
  37. assert A()[::, :] == (slice(None, None, None), slice(None, None, None))
  38. assert A()[::, :2] == (slice(None, None, None), slice(None, 2, None))
  39. assert A()['b':'c':1, :] == (slice('b', 'c', 1), slice(None, None, None))
  40. assert A()[1:2, :A()[3:4, ::-1]] == (slice(1, 2, None), slice(None, (slice(3, 4, None), slice(None, None, -1)), None))
  41. # test right associative
  42. assert 2**2**3 == 256
  43. assert (2**2**3)**2 == 65536
  44. class Number:
  45. def __divmod__(self, other):
  46. return 3, 4
  47. def __round__(self, *args):
  48. return args
  49. assert divmod(Number(), 0) == (3, 4)
  50. assert round(Number()) == tuple()
  51. assert round(Number(), 1) == (1,)
  52. class Z:
  53. def __new__(cls, x):
  54. return cls, x
  55. class B(Z):
  56. def __new__(cls, x):
  57. assert super() is Z
  58. return super().__new__(cls, x)
  59. assert Z(1) == (Z, 1)
  60. assert B(1) == (B, 1)
  61. from pkpy import TValue
  62. class fixed(TValue[int]):
  63. def __new__(cls, value: str):
  64. assert super() is TValue[int]
  65. return super().__new__(cls, int(value))
  66. assert fixed('123').value == 123
  67. # context bug
  68. class Context:
  69. def __enter__(self):
  70. return 1
  71. def __exit__(self, *_):
  72. pass
  73. for _ in range(5):
  74. with Context() as x:
  75. assert x == 1
  76. # bad dict hash
  77. class A:
  78. def __eq__(self, o): return False
  79. def __ne__(self, o): return True
  80. def __hash__(self): return 1
  81. bad_dict = {A(): 1, A(): 2, A(): 3, A(): 4}
  82. assert len(bad_dict) == 4
  83. try:
  84. bad_dict[A()] = 5 # error
  85. exit(1)
  86. except RuntimeError as e:
  87. assert 'maximum collision reached' in str(e)