99_builtin_func.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619
  1. # test super:
  2. class TestSuperBase():
  3. def __init__(self):
  4. self.base_attr = 1
  5. def base_method(self):
  6. return self.base_attr
  7. def error(self):
  8. raise Exception('未能拦截错误')
  9. class TestSuperChild1(TestSuperBase):
  10. def __init__(self):
  11. super(TestSuperChild1, self).__init__()
  12. def child_method(self):
  13. return super(TestSuperChild1, self).base_method()
  14. def error_handling(self):
  15. try:
  16. super(TestSuperChild1, self).error()
  17. except:
  18. pass
  19. class TestSuperChild2(TestSuperBase):
  20. pass
  21. test_base = TestSuperBase()
  22. # 测试属性
  23. assert test_base.base_attr == 1
  24. # 测试方法
  25. assert test_base.base_method() == 1
  26. test_child1 = TestSuperChild1()
  27. # 测试继承的属性
  28. assert test_child1.base_attr == 1
  29. # 测试继承的方法
  30. assert test_child1.base_method() == 1
  31. # 测试子类添加的方法
  32. assert test_child1.child_method() == 1
  33. # 测试子类的错误拦截
  34. test_child1.error_handling()
  35. test_child2 = TestSuperChild2()
  36. # 测试继承的属性
  37. assert test_child2.base_attr == 1
  38. # 测试继承的方法
  39. assert test_child2.base_method() == 1
  40. class TestSuperNoBaseMethod(TestSuperBase):
  41. def __init__(self):
  42. super(TestSuperNoBaseMethod, self).append(1)
  43. try:
  44. t = TestSuperNoParent()
  45. print('未能拦截错误')
  46. exit(1)
  47. except:
  48. pass
  49. try:
  50. t = TestSuperNoBaseMethod()
  51. print('未能拦截错误')
  52. exit(1)
  53. except:
  54. pass
  55. class B():
  56. pass
  57. class C():
  58. def method(self):
  59. super(C, self).method()
  60. class D():
  61. def method(self):
  62. super(B, self).method()
  63. try:
  64. c = C()
  65. c.method()
  66. print('未能拦截错误')
  67. exit(1)
  68. except:
  69. pass
  70. try:
  71. d = D()
  72. d.method()
  73. print('未能拦截错误')
  74. exit(1)
  75. except:
  76. pass
  77. # test hash:
  78. # 测试整数类型的输入
  79. assert hash(0) == 0
  80. assert hash(123) == 123
  81. assert hash(-456) == -456
  82. # 测试字符串类型的输入
  83. assert type(hash("hello")) is int
  84. # 测试浮点数类型的输入
  85. assert type(hash(3.14)) is int
  86. assert type(hash(-2.71828)) is int
  87. # 测试边界情况
  88. assert type(hash(None)) is int
  89. assert hash(True) == 1
  90. assert hash(False) == 0
  91. # 测试元组
  92. assert type(hash((4, 5, 6, (1234,1122), 2.3983, 'abcd'))) is int
  93. # 测试自定义类和对象的输入
  94. class A():
  95. pass
  96. a = A()
  97. assert type(hash(A)) is int
  98. assert type(hash(a)) is int
  99. # 测试函数的输入
  100. def f():
  101. pass
  102. assert type(hash(a)) is int
  103. # 测试不可哈希对象
  104. try:
  105. hash({1:1})
  106. print('未能拦截错误')
  107. exit(1)
  108. except:
  109. pass
  110. try:
  111. hash([1])
  112. print('未能拦截错误')
  113. exit(1)
  114. except:
  115. pass
  116. # test chr
  117. l = []
  118. for i in range(128):
  119. l.append(f'{i} {chr(i)}')
  120. assert l == ['0 \x00', '1 \x01', '2 \x02', '3 \x03', '4 \x04', '5 \x05', '6 \x06', '7 \x07', '8 \x08', '9 \t', '10 \n', '11 \x0b', '12 \x0c', '13 \r', '14 \x0e', '15 \x0f', '16 \x10', '17 \x11', '18 \x12', '19 \x13', '20 \x14', '21 \x15', '22 \x16', '23 \x17', '24 \x18', '25 \x19', '26 \x1a', '27 \x1b', '28 \x1c', '29 \x1d', '30 \x1e', '31 \x1f', '32 ', '33 !', '34 "', '35 #', '36 $', '37 %', '38 &', "39 '", '40 (', '41 )', '42 *', '43 +', '44 ,', '45 -', '46 .', '47 /', '48 0', '49 1', '50 2', '51 3', '52 4', '53 5', '54 6', '55 7', '56 8', '57 9', '58 :', '59 ;', '60 <', '61 =', '62 >', '63 ?', '64 @', '65 A', '66 B', '67 C', '68 D', '69 E', '70 F', '71 G', '72 H', '73 I', '74 J', '75 K', '76 L', '77 M', '78 N', '79 O', '80 P', '81 Q', '82 R', '83 S', '84 T', '85 U', '86 V', '87 W', '88 X', '89 Y', '90 Z', '91 [', '92 \\', '93 ]', '94 ^', '95 _', '96 `', '97 a', '98 b', '99 c', '100 d', '101 e', '102 f', '103 g', '104 h', '105 i', '106 j', '107 k', '108 l', '109 m', '110 n', '111 o', '112 p', '113 q', '114 r', '115 s', '116 t', '117 u', '118 v', '119 w', '120 x', '121 y', '122 z', '123 {', '124 |', '125 }', '126 ~', '127 \x7f']
  121. assert type(bin(1234)) is str
  122. # test __repr__:
  123. class A():
  124. def __init__(self):
  125. self.attr = 0
  126. repr(A())
  127. try:
  128. range(1,2,3,4)
  129. print('未能拦截错误, 在测试 range')
  130. exit(1)
  131. except:
  132. pass
  133. # /************ int ************/
  134. try:
  135. int('asad')
  136. print('未能拦截错误, 在测试 int')
  137. exit(1)
  138. except:
  139. pass
  140. try:
  141. int(123, 16)
  142. print('未能拦截错误, 在测试 int')
  143. exit(1)
  144. except:
  145. pass
  146. assert type(10//11) is int
  147. assert type(11%2) is int
  148. try:
  149. float('asad')
  150. print('未能拦截错误, 在测试 float')
  151. exit(1)
  152. except:
  153. pass
  154. try:
  155. float([])
  156. print('未能拦截错误, 在测试 float')
  157. exit(1)
  158. except:
  159. pass
  160. # /************ str ************/
  161. # test str.__rmul__:
  162. assert type(12 * '12') is str
  163. # 未完全测试准确性-----------------------------------------------
  164. # test str.index:
  165. assert type('25363546'.index('63')) is int
  166. try:
  167. '25363546'.index('err')
  168. print('未能拦截错误, 在测试 str.index')
  169. exit(1)
  170. except:
  171. pass
  172. # 未完全测试准确性-----------------------------------------------
  173. # test str.find:
  174. assert '25363546'.find('63') == 3
  175. assert '25363546'.find('err') == -1
  176. # /************ list ************/
  177. try:
  178. list(1,2)
  179. print('未能拦截错误, 在测试 list')
  180. exit(1)
  181. except:
  182. pass
  183. # 未完全测试准确性----------------------------------------------
  184. # test list.index:
  185. assert type([1,2,3,4,5].index(4)) is int
  186. try:
  187. [1,2,3,4,5].index(6)
  188. print('未能拦截错误, 在测试 list.index')
  189. exit(1)
  190. except:
  191. pass
  192. # 未完全测试准确性----------------------------------------------
  193. # test list.remove:
  194. try:
  195. [1,2,3,4,5].remove(6)
  196. print('未能拦截错误, 在测试 list.remove')
  197. exit(1)
  198. except:
  199. pass
  200. # 未完全测试准确性----------------------------------------------
  201. # test list.pop:
  202. try:
  203. [1,2,3,4,5].pop(1,2,3,4)
  204. print('未能拦截错误, 在测试 list.pop')
  205. exit(1)
  206. except:
  207. pass
  208. # 未完全测试准确性-----------------------------------------------
  209. # test list.__rmul__:
  210. assert type(12 * [12]) is list
  211. # /************ tuple ************/
  212. # 未完全测试准确性-----------------------------------------------
  213. # 180: 783: _vm->bind_constructor<-1>("tuple", [](VM* vm, ArgsView args) {
  214. # 32: 784: if(args.size() == 1+0) return VAR(Tuple(0));
  215. # 32: 785: if(args.size() == 1+1){
  216. # 32: 786: List list = CAST(List, vm->py_list(args[1]));
  217. # 32: 787: return VAR(Tuple(std::move(list)));
  218. # 32: 788: }
  219. # #####: 789: vm->TypeError("tuple() takes at most 1 argument");
  220. # #####: 790: return vm->None;
  221. # 32: 791: });
  222. # -: 792:
  223. # test tuple:
  224. try:
  225. tuple(1,2)
  226. print('未能拦截错误, 在测试 tuple')
  227. exit(1)
  228. except:
  229. pass
  230. assert (1,2,3).__contains__(5) == False
  231. assert (1,2,2,3,3,3).count(3) == 3
  232. assert (1,2,2,3,3,3).count(0) == 0
  233. assert repr(True) == 'True'
  234. assert repr(False) == 'False'
  235. assert True & True == 1
  236. assert True | True == 1
  237. assert (True ^ True) == 0
  238. assert (True == True) == 1
  239. assert type(hash(bytes([0x41, 0x42, 0x43]))) is int
  240. # 未完全测试准确性-----------------------------------------------
  241. # test bytes.__repr__:
  242. assert type(repr(bytes([0x41, 0x42, 0x43]))) is str
  243. # /************ slice ************/
  244. # 未完全测试准确性-----------------------------------------------
  245. # 116: 953: _vm->bind_constructor<4>("slice", [](VM* vm, ArgsView args) {
  246. # #####: 954: return VAR(Slice(args[1], args[2], args[3]));
  247. # -: 955: });
  248. # test slice:
  249. assert type(slice(0.1, 0.2, 0.3)) is slice
  250. # 未完全测试准确性-----------------------------------------------
  251. # 116: 1529: bind_property(_t(tp_slice), "start", [](VM* vm, ArgsView args){
  252. # #####: 1530: return CAST(Slice&, args[0]).start;
  253. # -: 1531: });
  254. # 116: 1532: bind_property(_t(tp_slice), "stop", [](VM* vm, ArgsView args){
  255. # #####: 1533: return CAST(Slice&, args[0]).stop;
  256. # -: 1534: });
  257. # 116: 1535: bind_property(_t(tp_slice), "step", [](VM* vm, ArgsView args){
  258. # #####: 1536: return CAST(Slice&, args[0]).step;
  259. # -: 1537: });
  260. s = slice(1, 2, 3)
  261. assert type(s) is slice
  262. assert s.start == 1
  263. assert s.stop == 2
  264. assert s.step == 3
  265. assert slice.__dict__['start'].__signature__ == 'start'
  266. # 未完全测试准确性-----------------------------------------------
  267. # test slice.__repr__
  268. assert type(repr(slice(1,1,1))) is str
  269. # /************ mappingproxy ************/
  270. # test mappingproxy.keys:
  271. class A():
  272. def __init__(self):
  273. self.a = 10
  274. def method(self):
  275. pass
  276. my_mappingproxy = A().__dict__
  277. assert type(my_mappingproxy.keys()) is list
  278. # 未完全测试准确性-----------------------------------------------
  279. # test mappingproxy.values:
  280. class A():
  281. def __init__(self):
  282. self.a = 10
  283. def method(self):
  284. pass
  285. my_mappingproxy = A().__dict__
  286. assert type(my_mappingproxy.values()) is list
  287. class A():
  288. def __init__(self):
  289. self.a = 10
  290. def method(self):
  291. pass
  292. my_mappingproxy = A().__dict__
  293. assert type(len(my_mappingproxy)) is int
  294. class A():
  295. def __init__(self):
  296. self.a = 10
  297. def method(self):
  298. pass
  299. my_mappingproxy = A().__dict__
  300. try:
  301. hash(my_mappingproxy)
  302. print('未能拦截错误, 在测试 mappingproxy.__hash__')
  303. exit(1)
  304. except TypeError:
  305. pass
  306. a = hash(object()) # object is hashable
  307. a = hash(A()) # A is hashable
  308. class B:
  309. def __eq__(self, o): return True
  310. try:
  311. hash(B())
  312. print('未能拦截错误, 在测试 B.__hash__')
  313. exit(1)
  314. except TypeError:
  315. pass
  316. # 未完全测试准确性-----------------------------------------------
  317. # test mappingproxy.__repr__:
  318. class A():
  319. def __init__(self):
  320. self.a = 10
  321. def method(self):
  322. pass
  323. my_mappingproxy = A().__dict__
  324. assert type(repr(my_mappingproxy)) is str
  325. # /************ dict ************/
  326. # 未完全测试准确性-----------------------------------------------
  327. # test dict:
  328. assert type(dict([(1,2)])) is dict
  329. try:
  330. dict([(1, 2, 3)])
  331. print('未能拦截错误, 在测试 dict')
  332. exit(1)
  333. except:
  334. pass
  335. try:
  336. dict([(1, 2)], 1)
  337. print('未能拦截错误, 在测试 dict')
  338. exit(1)
  339. except:
  340. pass
  341. try:
  342. hash(dict([(1,2)]))
  343. print('未能拦截错误, 在测试 dict.__hash__')
  344. exit(1)
  345. except:
  346. pass
  347. # test dict.__iter__
  348. for k in {1:2, 2:3, 3:4}:
  349. assert k in [1,2,3]
  350. # 未完全测试准确性-----------------------------------------------
  351. # test dict.get
  352. assert {1:2, 3:4}.get(1) == 2
  353. assert {1:2, 3:4}.get(2) is None
  354. assert {1:2, 3:4}.get(20, 100) == 100
  355. try:
  356. {1:2, 3:4}.get(1,1, 1)
  357. print('未能拦截错误, 在测试 dict.get')
  358. exit(1)
  359. except:
  360. pass
  361. # 未完全测试准确性-----------------------------------------------
  362. # test dict.__repr__
  363. assert type(repr({1:2, 3:4})) is str
  364. # /************ property ************/
  365. class A():
  366. def __init__(self):
  367. self._name = '123'
  368. @property
  369. def value(self):
  370. return 2
  371. def get_name(self):
  372. '''
  373. doc string 1
  374. '''
  375. return self._name
  376. def set_name(self, val):
  377. '''
  378. doc string 2
  379. '''
  380. self._name = val
  381. assert A().value == 2
  382. assert A.__dict__['value'].__signature__ == ''
  383. A.name = property(A.get_name, A.set_name, "name: str")
  384. assert A.__dict__['name'].__signature__ == 'name: str'
  385. try:
  386. property(A.get_name, A.set_name, 1)
  387. print('未能拦截错误, 在测试 property')
  388. exit(1)
  389. except:
  390. pass
  391. class Vector2:
  392. def __init__(self) -> None:
  393. self._x = 0
  394. @property
  395. def x(self):
  396. return self._x
  397. @x.setter
  398. def x(self, val):
  399. self._x = val
  400. v = Vector2()
  401. assert v.x == 0
  402. v.x = 10
  403. assert v.x == 10
  404. # function.__doc__
  405. def aaa():
  406. '12345'
  407. pass
  408. assert type(aaa.__doc__) is str
  409. # function.__signature__
  410. def aaa():
  411. pass
  412. assert type(aaa.__signature__) is str
  413. # /************ module time ************/
  414. import time
  415. # test time.time
  416. assert type(time.time()) is float
  417. local_t = time.localtime()
  418. assert type(local_t.tm_year) is int
  419. assert type(local_t.tm_mon) is int
  420. assert type(local_t.tm_mday) is int
  421. assert type(local_t.tm_hour) is int
  422. assert type(local_t.tm_min) is int
  423. assert type(local_t.tm_sec) is int
  424. assert type(local_t.tm_wday) is int
  425. assert type(local_t.tm_yday) is int
  426. assert type(local_t.tm_isdst) is int
  427. # test time.sleep
  428. time.sleep(0.1)
  429. # test time.localtime
  430. assert type(time.localtime()) is time.struct_time
  431. # test min/max
  432. assert min(1, 2) == 1
  433. assert min(1, 2, 3) == 1
  434. assert min([1, 2]) == 1
  435. assert min([1, 2], key=lambda x: -x) == 2
  436. assert max(1, 2) == 2
  437. assert max(1, 2, 3) == 3
  438. assert max([1, 2]) == 2
  439. assert max([1, 2, 3], key=lambda x: -x) == 1
  440. assert min([
  441. (1, 2),
  442. (1, 3),
  443. (1, 4),
  444. ]) == (1, 2)
  445. assert min(1, 2) == 1
  446. assert max(1, 2) == 2
  447. # test callable
  448. assert callable(lambda: 1) is True # function
  449. assert callable(1) is False # int
  450. assert callable(object) is True # type
  451. assert callable(object()) is False
  452. assert callable([].append) is True # bound method
  453. assert callable([].__getitem__) is True # bound method
  454. class A:
  455. def __init__(self):
  456. pass
  457. def __call__(self):
  458. pass
  459. assert callable(A) is True # type
  460. assert callable(A()) is True # instance with __call__
  461. assert callable(A.__call__) is True # bound method
  462. assert callable(A.__init__) is True # bound method
  463. assert callable(print) is True # builtin function
  464. assert callable(isinstance) is True # builtin function
  465. assert id(0) is None
  466. assert id(2**62) is not None
  467. # test issubclass
  468. assert issubclass(int, int) is True
  469. assert issubclass(int, object) is True
  470. assert issubclass(object, int) is False
  471. assert issubclass(object, object) is True
  472. assert issubclass(int, type) is False
  473. assert issubclass(type, type) is True
  474. assert issubclass(float, int) is False
  475. def f(a, b):
  476. c = a
  477. del a
  478. return sum([b, c])
  479. assert f(1, 2) == 3
  480. dir_int = dir(int)
  481. assert dir_int[:4] == ['__add__', '__and__', '__base__', '__eq__']