99_builtin_func.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  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. # 未完全测试准确性-----------------------------------------------
  266. # test slice.__repr__
  267. assert type(repr(slice(1,1,1))) is str
  268. # /************ mappingproxy ************/
  269. # test mappingproxy.keys:
  270. class A():
  271. def __init__(self):
  272. self.a = 10
  273. def method(self):
  274. pass
  275. my_mappingproxy = A().__dict__
  276. assert type(my_mappingproxy.keys()) is list
  277. # 未完全测试准确性-----------------------------------------------
  278. # test mappingproxy.values:
  279. class A():
  280. def __init__(self):
  281. self.a = 10
  282. def method(self):
  283. pass
  284. my_mappingproxy = A().__dict__
  285. assert type(my_mappingproxy.values()) is list
  286. class A():
  287. def __init__(self):
  288. self.a = 10
  289. def method(self):
  290. pass
  291. my_mappingproxy = A().__dict__
  292. assert type(len(my_mappingproxy)) is int
  293. class A():
  294. def __init__(self):
  295. self.a = 10
  296. def method(self):
  297. pass
  298. my_mappingproxy = A().__dict__
  299. try:
  300. hash(my_mappingproxy)
  301. print('未能拦截错误, 在测试 mappingproxy.__hash__')
  302. exit(1)
  303. except TypeError:
  304. pass
  305. a = hash(object()) # object is hashable
  306. a = hash(A()) # A is hashable
  307. class B:
  308. def __eq__(self, o): return True
  309. try:
  310. hash(B())
  311. print('未能拦截错误, 在测试 B.__hash__')
  312. exit(1)
  313. except TypeError:
  314. pass
  315. # 未完全测试准确性-----------------------------------------------
  316. # test mappingproxy.__repr__:
  317. class A():
  318. def __init__(self):
  319. self.a = 10
  320. def method(self):
  321. pass
  322. my_mappingproxy = A().__dict__
  323. assert type(repr(my_mappingproxy)) is str
  324. # /************ dict ************/
  325. # 未完全测试准确性-----------------------------------------------
  326. # test dict:
  327. assert type(dict([(1,2)])) is dict
  328. try:
  329. dict([(1, 2, 3)])
  330. print('未能拦截错误, 在测试 dict')
  331. exit(1)
  332. except:
  333. pass
  334. try:
  335. dict([(1, 2)], 1)
  336. print('未能拦截错误, 在测试 dict')
  337. exit(1)
  338. except:
  339. pass
  340. try:
  341. hash(dict([(1,2)]))
  342. print('未能拦截错误, 在测试 dict.__hash__')
  343. exit(1)
  344. except:
  345. pass
  346. # test dict.__iter__
  347. for k in {1:2, 2:3, 3:4}:
  348. assert k in [1,2,3]
  349. # 未完全测试准确性-----------------------------------------------
  350. # test dict.get
  351. assert {1:2, 3:4}.get(1) == 2
  352. assert {1:2, 3:4}.get(2) is None
  353. assert {1:2, 3:4}.get(20, 100) == 100
  354. try:
  355. {1:2, 3:4}.get(1,1, 1)
  356. print('未能拦截错误, 在测试 dict.get')
  357. exit(1)
  358. except:
  359. pass
  360. # 未完全测试准确性-----------------------------------------------
  361. # test dict.__repr__
  362. assert type(repr({1:2, 3:4})) is str
  363. # /************ property ************/
  364. class A():
  365. def __init__(self):
  366. self._name = '123'
  367. @property
  368. def value(self):
  369. return 2
  370. def get_name(self):
  371. '''
  372. doc string 1
  373. '''
  374. return self._name
  375. def set_name(self, val):
  376. '''
  377. doc string 2
  378. '''
  379. self._name = val
  380. assert A().value == 2
  381. A.name = property(A.get_name, A.set_name)
  382. class Vector2:
  383. def __init__(self) -> None:
  384. self._x = 0
  385. @property
  386. def x(self):
  387. return self._x
  388. @x.setter
  389. def x(self, val):
  390. self._x = val
  391. v = Vector2()
  392. assert v.x == 0
  393. v.x = 10
  394. assert v.x == 10
  395. # function.__doc__
  396. def aaa():
  397. '12345'
  398. pass
  399. assert type(aaa.__doc__) is str
  400. # /************ module time ************/
  401. import time
  402. # test time.time
  403. assert type(time.time()) is float
  404. local_t = time.localtime()
  405. assert type(local_t.tm_year) is int
  406. assert type(local_t.tm_mon) is int
  407. assert type(local_t.tm_mday) is int
  408. assert type(local_t.tm_hour) is int
  409. assert type(local_t.tm_min) is int
  410. assert type(local_t.tm_sec) is int
  411. assert type(local_t.tm_wday) is int
  412. assert type(local_t.tm_yday) is int
  413. assert type(local_t.tm_isdst) is int
  414. # test time.sleep
  415. time.sleep(0.1)
  416. # test time.localtime
  417. assert type(time.localtime()) is time.struct_time
  418. # test min/max
  419. assert min(1, 2) == 1
  420. assert min(1, 2, 3) == 1
  421. assert min([1, 2]) == 1
  422. assert min([1, 2], key=lambda x: -x) == 2
  423. assert max(1, 2) == 2
  424. assert max(1, 2, 3) == 3
  425. assert max([1, 2]) == 2
  426. assert max([1, 2, 3], key=lambda x: -x) == 1
  427. assert min([
  428. (1, 2),
  429. (1, 3),
  430. (1, 4),
  431. ]) == (1, 2)
  432. assert min(1, 2) == 1
  433. assert max(1, 2) == 2
  434. # test callable
  435. assert callable(lambda: 1) is True # function
  436. assert callable(1) is False # int
  437. assert callable(object) is True # type
  438. assert callable(object()) is False
  439. assert callable([].append) is True # bound method
  440. assert callable([].__getitem__) is True # bound method
  441. class A:
  442. def __init__(self):
  443. pass
  444. def __call__(self):
  445. pass
  446. assert callable(A) is True # type
  447. assert callable(A()) is True # instance with __call__
  448. assert callable(A.__call__) is True # bound method
  449. assert callable(A.__init__) is True # bound method
  450. assert callable(print) is True # builtin function
  451. assert callable(isinstance) is True # builtin function
  452. assert id(0) is None
  453. assert id(2**62) is not None
  454. # test issubclass
  455. assert issubclass(int, int) is True
  456. assert issubclass(int, object) is True
  457. assert issubclass(object, int) is False
  458. assert issubclass(object, object) is True
  459. assert issubclass(int, type) is False
  460. assert issubclass(type, type) is True
  461. assert issubclass(float, int) is False
  462. def f(a, b):
  463. c = a
  464. del a
  465. return sum([b, c])
  466. assert f(1, 2) == 3
  467. dir_int = dir(int)
  468. assert dir_int[:4] == ['__add__', '__and__', '__base__', '__eq__']