99_builtin_func.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782
  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. # 未完全测试准确性-----------------------------------------------
  128. # 33600: 318: _vm->bind_constructor<-1>("range", [](VM* vm, ArgsView args) {
  129. # 16742: 319: args._begin += 1; // skip cls
  130. # 16742: 320: Range r;
  131. # 16742: 321: switch (args.size()) {
  132. # 8735: 322: case 1: r.stop = CAST(i64, args[0]); break;
  133. # 3867: 323: case 2: r.start = CAST(i64, args[0]); r.stop = CAST(i64, args[1]); break;
  134. # 4140: 324: case 3: r.start = CAST(i64, args[0]); r.stop = CAST(i64, args[1]); r.step = CAST(i64, args[2]); break;
  135. # #####: 325: default: vm->TypeError("expected 1-3 arguments, got " + std::to_string(args.size()));
  136. # #####: 326: }
  137. # 33484: 327: return VAR(r);
  138. # 16742: 328: });
  139. # -: 329:
  140. # test range:
  141. try:
  142. range(1,2,3,4)
  143. print('未能拦截错误, 在测试 range')
  144. exit(1)
  145. except:
  146. pass
  147. # /************ int ************/
  148. try:
  149. int('asad')
  150. print('未能拦截错误, 在测试 int')
  151. exit(1)
  152. except:
  153. pass
  154. try:
  155. int(123, 16)
  156. print('未能拦截错误, 在测试 int')
  157. exit(1)
  158. except:
  159. pass
  160. assert type(10//11) is int
  161. assert type(11%2) is int
  162. try:
  163. float('asad')
  164. print('未能拦截错误, 在测试 float')
  165. exit(1)
  166. except:
  167. pass
  168. try:
  169. float([])
  170. print('未能拦截错误, 在测试 float')
  171. exit(1)
  172. except:
  173. pass
  174. # /************ str ************/
  175. # test str.__rmul__:
  176. assert type(12 * '12') is str
  177. # 未完全测试准确性-----------------------------------------------
  178. # 116: 554: _vm->bind_method<1>("str", "index", [](VM* vm, ArgsView args) {
  179. # #####: 555: const Str& self = _CAST(Str&, args[0]);
  180. # #####: 556: const Str& sub = CAST(Str&, args[1]);
  181. # #####: 557: int index = self.index(sub);
  182. # #####: 558: if(index == -1) vm->ValueError("substring not found");
  183. # #####: 559: return VAR(index);
  184. # #####: 560: });
  185. # test str.index:
  186. assert type('25363546'.index('63')) is int
  187. try:
  188. '25363546'.index('err')
  189. print('未能拦截错误, 在测试 str.index')
  190. exit(1)
  191. except:
  192. pass
  193. # 未完全测试准确性-----------------------------------------------
  194. # 116: 562: _vm->bind_method<1>("str", "find", [](VM* vm, ArgsView args) {
  195. # #####: 563: const Str& self = _CAST(Str&, args[0]);
  196. # #####: 564: const Str& sub = CAST(Str&, args[1]);
  197. # #####: 565: return VAR(self.index(sub));
  198. # -: 566: });
  199. # test str.find:
  200. assert type('25363546'.find('63')) is int
  201. assert type('25363546'.find('err')) is int
  202. # /************ list ************/
  203. # 未完全测试准确性-----------------------------------------------
  204. # 174: 615: _vm->bind_constructor<-1>("list", [](VM* vm, ArgsView args) {
  205. # 29: 616: if(args.size() == 1+0) return VAR(List());
  206. # 29: 617: if(args.size() == 1+1){
  207. # 29: 618: return vm->py_list(args[1]);
  208. # -: 619: }
  209. # #####: 620: vm->TypeError("list() takes 0 or 1 arguments");
  210. # #####: 621: return vm->None;
  211. # 29: 622: });
  212. # test list:
  213. try:
  214. list(1,2)
  215. print('未能拦截错误, 在测试 list')
  216. exit(1)
  217. except:
  218. pass
  219. # 未完全测试准确性----------------------------------------------
  220. # 116: 648: _vm->bind_method<1>("list", "index", [](VM* vm, ArgsView args) {
  221. # #####: 649: List& self = _CAST(List&, args[0]);
  222. # #####: 650: PyObject* obj = args[1];
  223. # #####: 651: for(int i=0; i<self.size(); i++){
  224. # #####: 652: if(vm->py_eq(self[i], obj)) return VAR(i);
  225. # -: 653: }
  226. # #####: 654: vm->ValueError(_CAST(Str&, vm->py_repr(obj)) + " is not in list");
  227. # #####: 655: return vm->None;
  228. # #####: 656: });
  229. # test list.index:
  230. assert type([1,2,3,4,5].index(4)) is int
  231. try:
  232. [1,2,3,4,5].index(6)
  233. print('未能拦截错误, 在测试 list.index')
  234. exit(1)
  235. except:
  236. pass
  237. # 未完全测试准确性----------------------------------------------
  238. # 118: 658: _vm->bind_method<1>("list", "remove", [](VM* vm, ArgsView args) {
  239. # 1: 659: List& self = _CAST(List&, args[0]);
  240. # 1: 660: PyObject* obj = args[1];
  241. # 2: 661: for(int i=0; i<self.size(); i++){
  242. # 2: 662: if(vm->py_eq(self[i], obj)){
  243. # 1: 663: self.erase(i);
  244. # 1: 664: return vm->None;
  245. # -: 665: }
  246. # -: 666: }
  247. # #####: 667: vm->ValueError(_CAST(Str&, vm->py_repr(obj)) + " is not in list");
  248. # #####: 668: return vm->None;
  249. # 1: 669: });
  250. # test list.remove:
  251. try:
  252. [1,2,3,4,5].remove(6)
  253. print('未能拦截错误, 在测试 list.remove')
  254. exit(1)
  255. except:
  256. pass
  257. # 未完全测试准确性----------------------------------------------
  258. # 2536: 671: _vm->bind_method<-1>("list", "pop", [](VM* vm, ArgsView args) {
  259. # 1210: 672: List& self = _CAST(List&, args[0]);
  260. # 1210: 673: if(args.size() == 1+0){
  261. # 1208: 674: if(self.empty()) vm->IndexError("pop from empty list");
  262. # 1208: 675: return self.popx_back();
  263. # -: 676: }
  264. # 2: 677: if(args.size() == 1+1){
  265. # 2: 678: int index = CAST(int, args[1]);
  266. # 2: 679: index = vm->normalized_index(index, self.size());
  267. # 2: 680: PyObject* ret = self[index];
  268. # 2: 681: self.erase(index);
  269. # -: 682: return ret;
  270. # -: 683: }
  271. # #####: 684: vm->TypeError("pop() takes at most 1 argument");
  272. # #####: 685: return vm->None;
  273. # 1210: 686: });
  274. # test list.pop:
  275. try:
  276. [1,2,3,4,5].pop(1,2,3,4)
  277. print('未能拦截错误, 在测试 list.pop')
  278. exit(1)
  279. except:
  280. pass
  281. # 未完全测试准确性-----------------------------------------------
  282. # test list.__rmul__:
  283. assert type(12 * [12]) is list
  284. # /************ tuple ************/
  285. # 未完全测试准确性-----------------------------------------------
  286. # 180: 783: _vm->bind_constructor<-1>("tuple", [](VM* vm, ArgsView args) {
  287. # 32: 784: if(args.size() == 1+0) return VAR(Tuple(0));
  288. # 32: 785: if(args.size() == 1+1){
  289. # 32: 786: List list = CAST(List, vm->py_list(args[1]));
  290. # 32: 787: return VAR(Tuple(std::move(list)));
  291. # 32: 788: }
  292. # #####: 789: vm->TypeError("tuple() takes at most 1 argument");
  293. # #####: 790: return vm->None;
  294. # 32: 791: });
  295. # -: 792:
  296. # test tuple:
  297. try:
  298. tuple(1,2)
  299. print('未能拦截错误, 在测试 tuple')
  300. exit(1)
  301. except:
  302. pass
  303. assert (1,2,3).__contains__(5) == False
  304. assert (1,2,2,3,3,3).count(3) == 3
  305. assert (1,2,2,3,3,3).count(0) == 0
  306. assert repr(True) == 'True'
  307. assert repr(False) == 'False'
  308. assert True & True == 1
  309. assert True | True == 1
  310. assert (True ^ True) == 0
  311. assert (True == True) == 1
  312. assert type(hash(bytes([0x41, 0x42, 0x43]))) is int
  313. # 未完全测试准确性-----------------------------------------------
  314. # test bytes.__repr__:
  315. assert type(repr(bytes([0x41, 0x42, 0x43]))) is str
  316. # /************ slice ************/
  317. # 未完全测试准确性-----------------------------------------------
  318. # 116: 953: _vm->bind_constructor<4>("slice", [](VM* vm, ArgsView args) {
  319. # #####: 954: return VAR(Slice(args[1], args[2], args[3]));
  320. # -: 955: });
  321. # test slice:
  322. assert type(slice(0.1, 0.2, 0.3)) is slice
  323. # 未完全测试准确性-----------------------------------------------
  324. # 116: 1529: bind_property(_t(tp_slice), "start", [](VM* vm, ArgsView args){
  325. # #####: 1530: return CAST(Slice&, args[0]).start;
  326. # -: 1531: });
  327. # 116: 1532: bind_property(_t(tp_slice), "stop", [](VM* vm, ArgsView args){
  328. # #####: 1533: return CAST(Slice&, args[0]).stop;
  329. # -: 1534: });
  330. # 116: 1535: bind_property(_t(tp_slice), "step", [](VM* vm, ArgsView args){
  331. # #####: 1536: return CAST(Slice&, args[0]).step;
  332. # -: 1537: });
  333. s = slice(1, 2, 3)
  334. assert type(s) is slice
  335. assert s.start == 1
  336. assert s.stop == 2
  337. assert s.step == 3
  338. assert slice.__dict__['start'].__signature__ == 'start'
  339. # 未完全测试准确性-----------------------------------------------
  340. # test slice.__repr__
  341. assert type(repr(slice(1,1,1))) is str
  342. # /************ mappingproxy ************/
  343. # 未完全测试准确性-----------------------------------------------
  344. # 116: 968: _vm->bind_method<0>("mappingproxy", "keys", [](VM* vm, ArgsView args) {
  345. # #####: 969: MappingProxy& self = _CAST(MappingProxy&, args[0]);
  346. # #####: 970: List keys;
  347. # #####: 971: for(StrName name : self.attr().keys()) keys.push_back(VAR(name.sv()));
  348. # #####: 972: return VAR(std::move(keys));
  349. # #####: 973: });
  350. # test mappingproxy.keys:
  351. class A():
  352. def __init__(self):
  353. self.a = 10
  354. def method(self):
  355. pass
  356. my_mappingproxy = A().__dict__
  357. assert type(my_mappingproxy.keys()) is list
  358. # 未完全测试准确性-----------------------------------------------
  359. # 116: 975: _vm->bind_method<0>("mappingproxy", "values", [](VM* vm, ArgsView args) {
  360. # #####: 976: MappingProxy& self = _CAST(MappingProxy&, args[0]);
  361. # #####: 977: List values;
  362. # #####: 978: for(auto& item : self.attr().items()) values.push_back(item.second);
  363. # #####: 979: return VAR(std::move(values));
  364. # #####: 980: });
  365. # test mappingproxy.values:
  366. class A():
  367. def __init__(self):
  368. self.a = 10
  369. def method(self):
  370. pass
  371. my_mappingproxy = A().__dict__
  372. assert type(my_mappingproxy.values()) is list
  373. class A():
  374. def __init__(self):
  375. self.a = 10
  376. def method(self):
  377. pass
  378. my_mappingproxy = A().__dict__
  379. assert type(len(my_mappingproxy)) is int
  380. class A():
  381. def __init__(self):
  382. self.a = 10
  383. def method(self):
  384. pass
  385. my_mappingproxy = A().__dict__
  386. try:
  387. hash(my_mappingproxy)
  388. print('未能拦截错误, 在测试 mappingproxy.__hash__')
  389. exit(1)
  390. except TypeError:
  391. pass
  392. a = hash(object()) # object is hashable
  393. a = hash(A()) # A is hashable
  394. class B:
  395. def __eq__(self, o): return True
  396. try:
  397. hash(B())
  398. print('未能拦截错误, 在测试 B.__hash__')
  399. exit(1)
  400. except TypeError:
  401. pass
  402. # 未完全测试准确性-----------------------------------------------
  403. # test mappingproxy.__repr__:
  404. class A():
  405. def __init__(self):
  406. self.a = 10
  407. def method(self):
  408. pass
  409. my_mappingproxy = A().__dict__
  410. assert type(repr(my_mappingproxy)) is str
  411. # /************ dict ************/
  412. # 未完全测试准确性-----------------------------------------------
  413. # 202: 1033: _vm->bind_method<-1>("dict", "__init__", [](VM* vm, ArgsView args){
  414. # 43: 1034: if(args.size() == 1+0) return vm->None;
  415. # 42: 1035: if(args.size() == 1+1){
  416. # 42: 1036: auto _lock = vm->heap.gc_scope_lock();
  417. # 42: 1037: Dict& self = _CAST(Dict&, args[0]);
  418. # 42: 1038: List& list = CAST(List&, args[1]);
  419. # 165: 1039: for(PyObject* item : list){
  420. # 123: 1040: Tuple& t = CAST(Tuple&, item);
  421. # 123: 1041: if(t.size() != 2){
  422. # #####: 1042: vm->ValueError("dict() takes an iterable of tuples (key, value)");
  423. # #####: 1043: return vm->None;
  424. # -: 1044: }
  425. # 123: 1045: self.set(t[0], t[1]);
  426. # 246: 1046: }
  427. # 42: 1047: return vm->None;
  428. # 42: 1048: }
  429. # #####: 1049: vm->TypeError("dict() takes at most 1 argument");
  430. # #####: 1050: return vm->None;
  431. # 43: 1051: });
  432. # test dict:
  433. assert type(dict([(1,2)])) is dict
  434. try:
  435. dict([(1, 2, 3)])
  436. print('未能拦截错误, 在测试 dict')
  437. exit(1)
  438. except:
  439. pass
  440. try:
  441. dict([(1, 2)], 1)
  442. print('未能拦截错误, 在测试 dict')
  443. exit(1)
  444. except:
  445. pass
  446. try:
  447. hash(dict([(1,2)]))
  448. print('未能拦截错误, 在测试 dict.__hash__')
  449. exit(1)
  450. except:
  451. pass
  452. # test dict.__iter__
  453. for k in {1:2, 2:3, 3:4}:
  454. assert k in [1,2,3]
  455. # 未完全测试准确性-----------------------------------------------
  456. # 166: 1098: _vm->bind_method<-1>("dict", "get", [](VM* vm, ArgsView args) {
  457. # 25: 1099: Dict& self = _CAST(Dict&, args[0]);
  458. # 25: 1100: if(args.size() == 1+1){
  459. # #####: 1101: PyObject* ret = self.try_get(args[1]);
  460. # #####: 1102: if(ret != nullptr) return ret;
  461. # #####: 1103: return vm->None;
  462. # 25: 1104: }else if(args.size() == 1+2){
  463. # 25: 1105: PyObject* ret = self.try_get(args[1]);
  464. # 25: 1106: if(ret != nullptr) return ret;
  465. # 19: 1107: return args[2];
  466. # -: 1108: }
  467. # #####: 1109: vm->TypeError("get() takes at most 2 arguments");
  468. # #####: 1110: return vm->None;
  469. # 25: 1111: });
  470. # test dict.get
  471. assert {1:2, 3:4}.get(1) == 2
  472. assert {1:2, 3:4}.get(2) is None
  473. assert {1:2, 3:4}.get(20, 100) == 100
  474. try:
  475. {1:2, 3:4}.get(1,1, 1)
  476. print('未能拦截错误, 在测试 dict.get')
  477. exit(1)
  478. except:
  479. pass
  480. # 未完全测试准确性-----------------------------------------------
  481. # test dict.__repr__
  482. assert type(repr({1:2, 3:4})) is str
  483. # /************ property ************/
  484. class A():
  485. def __init__(self):
  486. self._name = '123'
  487. @property
  488. def value(self):
  489. return 2
  490. def get_name(self):
  491. '''
  492. doc string 1
  493. '''
  494. return self._name
  495. def set_name(self, val):
  496. '''
  497. doc string 2
  498. '''
  499. self._name = val
  500. assert A().value == 2
  501. assert A.__dict__['value'].__signature__ == ''
  502. A.name = property(A.get_name, A.set_name, "name: str")
  503. assert A.__dict__['name'].__signature__ == 'name: str'
  504. try:
  505. property(A.get_name, A.set_name, 1)
  506. print('未能拦截错误, 在测试 property')
  507. exit(1)
  508. except:
  509. pass
  510. class Vector2:
  511. def __init__(self) -> None:
  512. self._x = 0
  513. @property
  514. def x(self):
  515. return self._x
  516. @x.setter
  517. def x(self, val):
  518. self._x = val
  519. v = Vector2()
  520. assert v.x == 0
  521. v.x = 10
  522. assert v.x == 10
  523. # /************ module timeit ************/
  524. import timeit
  525. def aaa():
  526. for i in range(10):
  527. for j in range(10):
  528. pass
  529. assert type(timeit.timeit(aaa, 2)) is float
  530. # function.__doc__
  531. def aaa():
  532. '12345'
  533. pass
  534. assert type(aaa.__doc__) is str
  535. # function.__signature__
  536. def aaa():
  537. pass
  538. assert type(aaa.__signature__) is str
  539. # /************ module time ************/
  540. import time
  541. # 未完全测试准确性-----------------------------------------------
  542. # 116: 1267: vm->bind_func<1>(mod, "sleep", [](VM* vm, ArgsView args) {
  543. # #####: 1268: f64 seconds = CAST_F(args[0]);
  544. # #####: 1269: auto begin = std::chrono::system_clock::now();
  545. # #####: 1270: while(true){
  546. # #####: 1271: auto now = std::chrono::system_clock::now();
  547. # #####: 1272: f64 elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - begin).count() / 1000.0;
  548. # #####: 1273: if(elapsed >= seconds) break;
  549. # #####: 1274: }
  550. # #####: 1275: return vm->None;
  551. # #####: 1276: });
  552. # test time.time
  553. assert type(time.time()) is float
  554. local_t = time.localtime()
  555. assert type(local_t.tm_year) is int
  556. assert type(local_t.tm_mon) is int
  557. assert type(local_t.tm_mday) is int
  558. assert type(local_t.tm_hour) is int
  559. assert type(local_t.tm_min) is int
  560. assert type(local_t.tm_sec) is int
  561. assert type(local_t.tm_wday) is int
  562. assert type(local_t.tm_yday) is int
  563. assert type(local_t.tm_isdst) is int
  564. # 未完全测试准确性-----------------------------------------------
  565. # 116: 1267: vm->bind_func<1>(mod, "sleep", [](VM* vm, ArgsView args) {
  566. # #####: 1268: f64 seconds = CAST_F(args[0]);
  567. # #####: 1269: auto begin = std::chrono::system_clock::now();
  568. # #####: 1270: while(true){
  569. # #####: 1271: auto now = std::chrono::system_clock::now();
  570. # #####: 1272: f64 elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - begin).count() / 1000.0;
  571. # #####: 1273: if(elapsed >= seconds) break;
  572. # #####: 1274: }
  573. # #####: 1275: return vm->None;
  574. # #####: 1276: });
  575. # test time.sleep
  576. time.sleep(0.1)
  577. # 未完全测试准确性-----------------------------------------------
  578. # 116: 1278: vm->bind_func<0>(mod, "localtime", [](VM* vm, ArgsView args) {
  579. # #####: 1279: auto now = std::chrono::system_clock::now();
  580. # #####: 1280: std::time_t t = std::chrono::system_clock::to_time_t(now);
  581. # #####: 1281: std::tm* tm = std::localtime(&t);
  582. # #####: 1282: Dict d(vm);
  583. # #####: 1283: d.set(VAR("tm_year"), VAR(tm->tm_year + 1900));
  584. # #####: 1284: d.set(VAR("tm_mon"), VAR(tm->tm_mon + 1));
  585. # #####: 1285: d.set(VAR("tm_mday"), VAR(tm->tm_mday));
  586. # #####: 1286: d.set(VAR("tm_hour"), VAR(tm->tm_hour));
  587. # #####: 1287: d.set(VAR("tm_min"), VAR(tm->tm_min));
  588. # #####: 1288: d.set(VAR("tm_sec"), VAR(tm->tm_sec + 1));
  589. # #####: 1289: d.set(VAR("tm_wday"), VAR((tm->tm_wday + 6) % 7));
  590. # #####: 1290: d.set(VAR("tm_yday"), VAR(tm->tm_yday + 1));
  591. # #####: 1291: d.set(VAR("tm_isdst"), VAR(tm->tm_isdst));
  592. # #####: 1292: return VAR(std::move(d));
  593. # #####: 1293: });
  594. # 58: 1294:}
  595. # test time.localtime
  596. assert type(time.localtime()) is time.struct_time
  597. # test min/max
  598. assert min(1, 2) == 1
  599. assert min(1, 2, 3) == 1
  600. assert min([1, 2]) == 1
  601. assert min([1, 2], key=lambda x: -x) == 2
  602. assert max(1, 2) == 2
  603. assert max(1, 2, 3) == 3
  604. assert max([1, 2]) == 2
  605. assert max([1, 2, 3], key=lambda x: -x) == 1
  606. assert min([
  607. (1, 2),
  608. (1, 3),
  609. (1, 4),
  610. ]) == (1, 2)
  611. assert min(1, 2) == 1
  612. assert max(1, 2) == 2
  613. # test callable
  614. assert callable(lambda: 1) is True # function
  615. assert callable(1) is False # int
  616. assert callable(object) is True # type
  617. assert callable(object()) is False
  618. assert callable([].append) is True # bound method
  619. assert callable([].__getitem__) is True # bound method
  620. class A:
  621. def __init__(self):
  622. pass
  623. def __call__(self):
  624. pass
  625. assert callable(A) is True # type
  626. assert callable(A()) is True # instance with __call__
  627. assert callable(A.__call__) is True # bound method
  628. assert callable(A.__init__) is True # bound method
  629. assert callable(print) is True # builtin function
  630. assert callable(isinstance) is True # builtin function
  631. assert id(0) is None
  632. assert id(2**62) is not None
  633. # test issubclass
  634. assert issubclass(int, int) is True
  635. assert issubclass(int, object) is True
  636. assert issubclass(object, int) is False
  637. assert issubclass(object, object) is True
  638. assert issubclass(int, type) is False
  639. assert issubclass(type, type) is True
  640. assert issubclass(float, int) is False