run-attrs.test 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. -- Test cases for dataclasses based on the attrs library, where auto_attribs=True
  2. [case testRunAttrsclass]
  3. import attr
  4. from typing import Set, List, Callable, Any
  5. @attr.s(auto_attribs=True)
  6. class Person1:
  7. age : int
  8. name : str
  9. def __bool__(self) -> bool:
  10. return self.name == 'robot'
  11. def testBool(p: Person1) -> bool:
  12. if p:
  13. return True
  14. else:
  15. return False
  16. @attr.s(auto_attribs=True)
  17. class Person1b(Person1):
  18. id: str = '000'
  19. @attr.s(auto_attribs=True)
  20. class Person2:
  21. age : int
  22. name : str = attr.ib(default='robot')
  23. @attr.s(auto_attribs=True, order=True)
  24. class Person3:
  25. age : int = attr.ib(default = 6)
  26. friendIDs : List[int] = attr.ib(factory = list)
  27. def get_age(self) -> int:
  28. return (self.age)
  29. def set_age(self, new_age : int) -> None:
  30. self.age = new_age
  31. def add_friendID(self, fid : int) -> None:
  32. self.friendIDs.append(fid)
  33. def get_friendIDs(self) -> List[int]:
  34. return self.friendIDs
  35. def get_next_age(g: Callable[[Any], int]) -> Callable[[Any], int]:
  36. def f(a: Any) -> int:
  37. return g(a) + 1
  38. return f
  39. @attr.s(auto_attribs=True)
  40. class Person4:
  41. age : int
  42. _name : str = 'Bot'
  43. @get_next_age
  44. def get_age(self) -> int:
  45. return self.age
  46. @property
  47. def name(self) -> str:
  48. return self._name
  49. @attr.s(auto_attribs=True)
  50. class Point:
  51. x : int = attr.ib(converter=int)
  52. y : int = attr.ib(init=False)
  53. def __attrs_post_init__(self):
  54. self.y = self.x + 1
  55. [file other.py]
  56. from native import Person1, Person1b, Person2, Person3, Person4, testBool, Point
  57. i1 = Person1(age = 5, name = 'robot')
  58. assert i1.age == 5
  59. assert i1.name == 'robot'
  60. assert testBool(i1) == True
  61. assert testBool(Person1(age = 5, name = 'robo')) == False
  62. i1b = Person1b(age = 5, name = 'robot')
  63. assert i1b.age == 5
  64. assert i1b.name == 'robot'
  65. assert i1b.id == '000'
  66. assert testBool(i1b) == True
  67. assert testBool(Person1b(age = 5, name = 'robo')) == False
  68. i1c = Person1b(age = 20, name = 'robot', id = 'test')
  69. assert i1c.age == 20
  70. assert i1c.id == 'test'
  71. i2 = Person2(age = 5)
  72. assert i2.age == 5
  73. assert i2.name == 'robot'
  74. i3 = Person2(age = 5, name = 'new_robot')
  75. assert i3.age == 5
  76. assert i3.name == 'new_robot'
  77. i4 = Person3()
  78. assert i4.age == 6
  79. assert i4.friendIDs == []
  80. i5 = Person3(age = 5)
  81. assert i5.age == 5
  82. assert i5.friendIDs == []
  83. i6 = Person3(age = 5, friendIDs = [1,2,3])
  84. assert i6.age == 5
  85. assert i6.friendIDs == [1,2,3]
  86. assert i6.get_age() == 5
  87. i6.set_age(10)
  88. assert i6.get_age() == 10
  89. i6.add_friendID(4)
  90. assert i6.get_friendIDs() == [1,2,3,4]
  91. i7 = Person4(age = 5)
  92. assert i7.get_age() == 6
  93. i7.age += 3
  94. assert i7.age == 8
  95. assert i7.name == 'Bot'
  96. i8 = Person3(age = 1, friendIDs = [1,2])
  97. i9 = Person3(age = 1, friendIDs = [1,2])
  98. assert i8 == i9
  99. i8.age = 2
  100. assert i8 > i9
  101. assert Person1.__annotations__ == {'age': int, 'name': str}
  102. assert Person2.__annotations__ == {'age': int, 'name': str}
  103. p1 = Point(2)
  104. assert p1.x == 2
  105. assert p1.y == 3
  106. p2 = Point('2')
  107. assert p2.x == 2
  108. assert p2.y == 3
  109. assert Point.__annotations__ == {'x': int, 'y': int}
  110. [file driver.py]
  111. import sys
  112. # PEP 526 introduced in 3.6
  113. version = sys.version_info[:2]
  114. if version[0] < 3 or version[1] < 6:
  115. exit()
  116. # Run the tests in both interpreted and compiled mode
  117. import other
  118. import other_interpreted
  119. # Test for an exceptional cases
  120. from testutil import assertRaises
  121. from native import Person1, Person1b, Person3
  122. from types import BuiltinMethodType
  123. with assertRaises(TypeError, "missing 1 required positional argument"):
  124. Person1(0)
  125. with assertRaises(TypeError, "missing 2 required positional arguments"):
  126. Person1b()
  127. with assertRaises(TypeError, "int object expected; got str"):
  128. Person1('nope', 'test')
  129. p = Person1(0, 'test')
  130. with assertRaises(TypeError, "int object expected; got str"):
  131. p.age = 'nope'
  132. assert isinstance(Person3().get_age, BuiltinMethodType)
  133. [case testRunAttrsclassNonAuto]
  134. import attr
  135. from typing import Set, List, Callable, Any
  136. @attr.s
  137. class Person1:
  138. age = attr.ib(type=int)
  139. name = attr.ib(type=str)
  140. def __bool__(self) -> bool:
  141. return self.name == 'robot'
  142. def testBool(p: Person1) -> bool:
  143. if p:
  144. return True
  145. else:
  146. return False
  147. @attr.s
  148. class Person1b(Person1):
  149. id = attr.ib(type=str, default='000')
  150. @attr.s
  151. class Person2:
  152. age = attr.ib(type=int)
  153. name = attr.ib(type=str, default='robot')
  154. @attr.s(order=True)
  155. class Person3:
  156. age = attr.ib(type=int, default=6)
  157. friendIDs = attr.ib(factory=list, type=List[int])
  158. def get_age(self) -> int:
  159. return (self.age)
  160. def set_age(self, new_age : int) -> None:
  161. self.age = new_age
  162. def add_friendID(self, fid : int) -> None:
  163. self.friendIDs.append(fid)
  164. def get_friendIDs(self) -> List[int]:
  165. return self.friendIDs
  166. def get_next_age(g: Callable[[Any], int]) -> Callable[[Any], int]:
  167. def f(a: Any) -> int:
  168. return g(a) + 1
  169. return f
  170. @attr.s
  171. class Person4:
  172. age = attr.ib(type=int)
  173. _name = attr.ib(type=str, default='Bot')
  174. @get_next_age
  175. def get_age(self) -> int:
  176. return self.age
  177. @property
  178. def name(self) -> str:
  179. return self._name
  180. @attr.s
  181. class Point:
  182. x = attr.ib(type=int, converter=int)
  183. y = attr.ib(type=int, init=False)
  184. def __attrs_post_init__(self):
  185. self.y = self.x + 1
  186. [file other.py]
  187. from native import Person1, Person1b, Person2, Person3, Person4, testBool, Point
  188. i1 = Person1(age = 5, name = 'robot')
  189. assert i1.age == 5
  190. assert i1.name == 'robot'
  191. assert testBool(i1) == True
  192. assert testBool(Person1(age = 5, name = 'robo')) == False
  193. i1b = Person1b(age = 5, name = 'robot')
  194. assert i1b.age == 5
  195. assert i1b.name == 'robot'
  196. assert i1b.id == '000'
  197. assert testBool(i1b) == True
  198. assert testBool(Person1b(age = 5, name = 'robo')) == False
  199. i1c = Person1b(age = 20, name = 'robot', id = 'test')
  200. assert i1c.age == 20
  201. assert i1c.id == 'test'
  202. i2 = Person2(age = 5)
  203. assert i2.age == 5
  204. assert i2.name == 'robot'
  205. i3 = Person2(age = 5, name = 'new_robot')
  206. assert i3.age == 5
  207. assert i3.name == 'new_robot'
  208. i4 = Person3()
  209. assert i4.age == 6
  210. assert i4.friendIDs == []
  211. i5 = Person3(age = 5)
  212. assert i5.age == 5
  213. assert i5.friendIDs == []
  214. i6 = Person3(age = 5, friendIDs = [1,2,3])
  215. assert i6.age == 5
  216. assert i6.friendIDs == [1,2,3]
  217. assert i6.get_age() == 5
  218. i6.set_age(10)
  219. assert i6.get_age() == 10
  220. i6.add_friendID(4)
  221. assert i6.get_friendIDs() == [1,2,3,4]
  222. i7 = Person4(age = 5)
  223. assert i7.get_age() == 6
  224. i7.age += 3
  225. assert i7.age == 8
  226. assert i7.name == 'Bot'
  227. i8 = Person3(age = 1, friendIDs = [1,2])
  228. i9 = Person3(age = 1, friendIDs = [1,2])
  229. assert i8 == i9
  230. i8.age = 2
  231. assert i8 > i9
  232. p1 = Point(2)
  233. assert p1.x == 2
  234. assert p1.y == 3
  235. p2 = Point('2')
  236. assert p2.x == 2
  237. assert p2.y == 3
  238. [file driver.py]
  239. import sys
  240. # Run the tests in both interpreted and compiled mode
  241. import other
  242. import other_interpreted
  243. # Test for an exceptional cases
  244. from testutil import assertRaises
  245. from native import Person1, Person1b, Person3
  246. from types import BuiltinMethodType
  247. with assertRaises(TypeError, "missing 1 required positional argument"):
  248. Person1(0)
  249. with assertRaises(TypeError, "missing 2 required positional arguments"):
  250. Person1b()
  251. with assertRaises(TypeError, "int object expected; got str"):
  252. Person1('nope', 'test')
  253. p = Person1(0, 'test')
  254. with assertRaises(TypeError, "int object expected; got str"):
  255. p.age = 'nope'
  256. assert isinstance(Person3().get_age, BuiltinMethodType)