99_builtin_func.py 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940
  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. # 无法测试 -----------------------------------------------
  78. # 248: 192: _vm->bind_builtin_func<1>("__import__", [](VM* vm, ArgsView args) {
  79. # 67: 193: const Str& name = CAST(Str&, args[0]);
  80. # 67: 194: auto dot = name.sv().find_last_of(".");
  81. # 67: 195: if(dot != std::string_view::npos){
  82. # #####: 196: auto ext = name.sv().substr(dot);
  83. # #####: 197: if(ext == ".so" || ext == ".dll" || ext == ".dylib"){
  84. # #####: 198: dylib_entry_t entry = load_dylib(name.c_str());
  85. # #####: 199: if(!entry){
  86. # #####: 200: vm->_error("ImportError", "cannot load dynamic library: " + name.escape());
  87. # #####: 201: }
  88. # #####: 202: vm->_c.s_view.push(ArgsView(vm->s_data.end(), vm->s_data.end()));
  89. # #####: 203: const char* name = entry(vm, PK_VERSION);
  90. # #####: 204: vm->_c.s_view.pop();
  91. # #####: 205: if(name == nullptr){
  92. # #####: 206: vm->_error("ImportError", "module initialization failed: " + Str(name).escape());
  93. # #####: 207: }
  94. # #####: 208: return vm->_modules[name];
  95. # #####: 209: }
  96. # #####: 210: }
  97. # 67: 211: return vm->py_import(name);
  98. # 67: 212: });
  99. # test hash:
  100. # 测试整数类型的输入
  101. assert hash(0) == 0
  102. assert hash(123) == 123
  103. assert hash(-456) == -456
  104. # 测试字符串类型的输入
  105. assert type(hash("hello")) is int
  106. # 测试浮点数类型的输入
  107. assert type(hash(3.14)) is int
  108. assert type(hash(-2.71828)) is int
  109. # 测试边界情况
  110. assert type(hash(None)) is int
  111. assert hash(True) == 1
  112. assert hash(False) == 0
  113. # 测试元组
  114. assert type(hash((4, 5, 6, (1234,1122), 2.3983, 'abcd'))) is int
  115. # 测试自定义类和对象的输入
  116. class A():
  117. pass
  118. a = A()
  119. assert type(hash(A)) is int
  120. assert type(hash(a)) is int
  121. # 测试函数的输入
  122. def f():
  123. pass
  124. assert type(hash(a)) is int
  125. # 测试不可哈希对象
  126. try:
  127. hash({1:1})
  128. print('未能拦截错误')
  129. exit(1)
  130. except:
  131. pass
  132. try:
  133. hash([1])
  134. print('未能拦截错误')
  135. exit(1)
  136. except:
  137. pass
  138. # -----------------------------------------------
  139. # 114: 259: _vm->bind_builtin_func<1>("chr", [](VM* vm, ArgsView args) {
  140. # #####: 260: i64 i = CAST(i64, args[0]);
  141. # #####: 261: if (i < 0 || i > 128) vm->ValueError("chr() arg not in range(128)");
  142. # #####: 262: return VAR(std::string(1, (char)i));
  143. # #####: 263: });
  144. # test chr
  145. l = []
  146. for i in range(128):
  147. l.append(f'{i} {chr(i)}')
  148. 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']
  149. assert type(bin(1234)) is str
  150. # 无法测试, 不能覆盖-----------------------------------------------
  151. # 136: 285: _vm->bind_builtin_func<1>("dir", [](VM* vm, ArgsView args) {
  152. # 10: 286: std::set<StrName> names;
  153. # 10: 287: if(!is_tagged(args[0]) && args[0]->is_attr_valid()){
  154. # #####: 288: std::vector<StrName> keys = args[0]->attr().keys();
  155. # #####: 289: names.insert(keys.begin(), keys.end());
  156. # #####: 290: }
  157. # 10: 291: const NameDict& t_attr = vm->_t(args[0])->attr();
  158. # 10: 292: std::vector<StrName> keys = t_attr.keys();
  159. # 10: 293: names.insert(keys.begin(), keys.end());
  160. # 10: 294: List ret;
  161. # 305: 295: for (StrName name : names) ret.push_back(VAR(name.sv()));
  162. # 10: 296: return VAR(std::move(ret));
  163. # 10: 297: });
  164. # test dir:
  165. # test __repr__:
  166. class A():
  167. def __init__(self):
  168. self.attr = 0
  169. repr(A())
  170. # 未完全测试准确性-----------------------------------------------
  171. # 33600: 318: _vm->bind_constructor<-1>("range", [](VM* vm, ArgsView args) {
  172. # 16742: 319: args._begin += 1; // skip cls
  173. # 16742: 320: Range r;
  174. # 16742: 321: switch (args.size()) {
  175. # 8735: 322: case 1: r.stop = CAST(i64, args[0]); break;
  176. # 3867: 323: case 2: r.start = CAST(i64, args[0]); r.stop = CAST(i64, args[1]); break;
  177. # 4140: 324: case 3: r.start = CAST(i64, args[0]); r.stop = CAST(i64, args[1]); r.step = CAST(i64, args[2]); break;
  178. # #####: 325: default: vm->TypeError("expected 1-3 arguments, got " + std::to_string(args.size()));
  179. # #####: 326: }
  180. # 33484: 327: return VAR(r);
  181. # 16742: 328: });
  182. # -: 329:
  183. # test range:
  184. try:
  185. range(1,2,3,4)
  186. print('未能拦截错误, 在测试 range')
  187. exit(1)
  188. except:
  189. pass
  190. # /************ int ************/
  191. try:
  192. int('asad')
  193. print('未能拦截错误, 在测试 int')
  194. exit(1)
  195. except:
  196. pass
  197. try:
  198. int(123, 16)
  199. print('未能拦截错误, 在测试 int')
  200. exit(1)
  201. except:
  202. pass
  203. # 未完全测试准确性-----------------------------------------------
  204. # 116: 392: _vm->bind_method<0>("int", "bit_length", [](VM* vm, ArgsView args) {
  205. # #####: 393: i64 x = _CAST(i64, args[0]);
  206. # #####: 394: if(x < 0) x = -x;
  207. # -: 395: int bits = 0;
  208. # #####: 396: while(x){ x >>= 1; bits++; }
  209. # #####: 397: return VAR(bits);
  210. # -: 398: });
  211. # test int.bit_length:
  212. assert type(int.bit_length(100)) is int
  213. # 未完全测试准确性-----------------------------------------------
  214. # 116: 400: _vm->bind__floordiv__(_vm->tp_int, [](VM* vm, PyObject* lhs_, PyObject* rhs_) {
  215. # #####: 401: i64 rhs = CAST(i64, rhs_);
  216. # #####: 402: return VAR(_CAST(i64, lhs_) / rhs);
  217. # -: 403: });
  218. # test int.__floordiv__:
  219. assert type(10//11) is int
  220. # 未完全测试准确性-----------------------------------------------
  221. # 116: 405: _vm->bind__mod__(_vm->tp_int, [](VM* vm, PyObject* lhs_, PyObject* rhs_) {
  222. # #####: 406: i64 rhs = CAST(i64, rhs_);
  223. # #####: 407: return VAR(_CAST(i64, lhs_) % rhs);
  224. # test int.__mod__:
  225. assert type(11%2) is int
  226. try:
  227. float('asad')
  228. print('未能拦截错误, 在测试 float')
  229. exit(1)
  230. except:
  231. pass
  232. try:
  233. float([])
  234. print('未能拦截错误, 在测试 float')
  235. exit(1)
  236. except:
  237. pass
  238. # /************ str ************/
  239. # test str.__rmul__:
  240. assert type(12 * '12') is str
  241. # 未完全测试准确性-----------------------------------------------
  242. # 116: 554: _vm->bind_method<1>("str", "index", [](VM* vm, ArgsView args) {
  243. # #####: 555: const Str& self = _CAST(Str&, args[0]);
  244. # #####: 556: const Str& sub = CAST(Str&, args[1]);
  245. # #####: 557: int index = self.index(sub);
  246. # #####: 558: if(index == -1) vm->ValueError("substring not found");
  247. # #####: 559: return VAR(index);
  248. # #####: 560: });
  249. # test str.index:
  250. assert type('25363546'.index('63')) is int
  251. try:
  252. '25363546'.index('err')
  253. print('未能拦截错误, 在测试 str.index')
  254. exit(1)
  255. except:
  256. pass
  257. # 未完全测试准确性-----------------------------------------------
  258. # 116: 562: _vm->bind_method<1>("str", "find", [](VM* vm, ArgsView args) {
  259. # #####: 563: const Str& self = _CAST(Str&, args[0]);
  260. # #####: 564: const Str& sub = CAST(Str&, args[1]);
  261. # #####: 565: return VAR(self.index(sub));
  262. # -: 566: });
  263. # test str.find:
  264. assert type('25363546'.find('63')) is int
  265. assert type('25363546'.find('err')) is int
  266. # /************ list ************/
  267. # 未完全测试准确性-----------------------------------------------
  268. # 174: 615: _vm->bind_constructor<-1>("list", [](VM* vm, ArgsView args) {
  269. # 29: 616: if(args.size() == 1+0) return VAR(List());
  270. # 29: 617: if(args.size() == 1+1){
  271. # 29: 618: return vm->py_list(args[1]);
  272. # -: 619: }
  273. # #####: 620: vm->TypeError("list() takes 0 or 1 arguments");
  274. # #####: 621: return vm->None;
  275. # 29: 622: });
  276. # test list:
  277. try:
  278. list(1,2)
  279. print('未能拦截错误, 在测试 list')
  280. exit(1)
  281. except:
  282. pass
  283. # 未完全测试准确性----------------------------------------------
  284. # 116: 648: _vm->bind_method<1>("list", "index", [](VM* vm, ArgsView args) {
  285. # #####: 649: List& self = _CAST(List&, args[0]);
  286. # #####: 650: PyObject* obj = args[1];
  287. # #####: 651: for(int i=0; i<self.size(); i++){
  288. # #####: 652: if(vm->py_eq(self[i], obj)) return VAR(i);
  289. # -: 653: }
  290. # #####: 654: vm->ValueError(_CAST(Str&, vm->py_repr(obj)) + " is not in list");
  291. # #####: 655: return vm->None;
  292. # #####: 656: });
  293. # test list.index:
  294. assert type([1,2,3,4,5].index(4)) is int
  295. try:
  296. [1,2,3,4,5].index(6)
  297. print('未能拦截错误, 在测试 list.index')
  298. exit(1)
  299. except:
  300. pass
  301. # 未完全测试准确性----------------------------------------------
  302. # 118: 658: _vm->bind_method<1>("list", "remove", [](VM* vm, ArgsView args) {
  303. # 1: 659: List& self = _CAST(List&, args[0]);
  304. # 1: 660: PyObject* obj = args[1];
  305. # 2: 661: for(int i=0; i<self.size(); i++){
  306. # 2: 662: if(vm->py_eq(self[i], obj)){
  307. # 1: 663: self.erase(i);
  308. # 1: 664: return vm->None;
  309. # -: 665: }
  310. # -: 666: }
  311. # #####: 667: vm->ValueError(_CAST(Str&, vm->py_repr(obj)) + " is not in list");
  312. # #####: 668: return vm->None;
  313. # 1: 669: });
  314. # test list.remove:
  315. try:
  316. [1,2,3,4,5].remove(6)
  317. print('未能拦截错误, 在测试 list.remove')
  318. exit(1)
  319. except:
  320. pass
  321. # 未完全测试准确性----------------------------------------------
  322. # 2536: 671: _vm->bind_method<-1>("list", "pop", [](VM* vm, ArgsView args) {
  323. # 1210: 672: List& self = _CAST(List&, args[0]);
  324. # 1210: 673: if(args.size() == 1+0){
  325. # 1208: 674: if(self.empty()) vm->IndexError("pop from empty list");
  326. # 1208: 675: return self.popx_back();
  327. # -: 676: }
  328. # 2: 677: if(args.size() == 1+1){
  329. # 2: 678: int index = CAST(int, args[1]);
  330. # 2: 679: index = vm->normalized_index(index, self.size());
  331. # 2: 680: PyObject* ret = self[index];
  332. # 2: 681: self.erase(index);
  333. # -: 682: return ret;
  334. # -: 683: }
  335. # #####: 684: vm->TypeError("pop() takes at most 1 argument");
  336. # #####: 685: return vm->None;
  337. # 1210: 686: });
  338. # test list.pop:
  339. try:
  340. [1,2,3,4,5].pop(1,2,3,4)
  341. print('未能拦截错误, 在测试 list.pop')
  342. exit(1)
  343. except:
  344. pass
  345. # 未完全测试准确性-----------------------------------------------
  346. # test list.__rmul__:
  347. assert type(12 * [12]) is list
  348. # /************ tuple ************/
  349. # 未完全测试准确性-----------------------------------------------
  350. # 180: 783: _vm->bind_constructor<-1>("tuple", [](VM* vm, ArgsView args) {
  351. # 32: 784: if(args.size() == 1+0) return VAR(Tuple(0));
  352. # 32: 785: if(args.size() == 1+1){
  353. # 32: 786: List list = CAST(List, vm->py_list(args[1]));
  354. # 32: 787: return VAR(Tuple(std::move(list)));
  355. # 32: 788: }
  356. # #####: 789: vm->TypeError("tuple() takes at most 1 argument");
  357. # #####: 790: return vm->None;
  358. # 32: 791: });
  359. # -: 792:
  360. # test tuple:
  361. try:
  362. tuple(1,2)
  363. print('未能拦截错误, 在测试 tuple')
  364. exit(1)
  365. except:
  366. pass
  367. # 未完全测试准确性-----------------------------------------------
  368. # 118: 793: _vm->bind__contains__(_vm->tp_tuple, [](VM* vm, PyObject* obj, PyObject* item) {
  369. # 1: 794: Tuple& self = _CAST(Tuple&, obj);
  370. # 3: 795: for(PyObject* i: self) if(vm->py_eq(i, item)) return vm->True;
  371. # #####: 796: return vm->False;
  372. # 1: 797: });
  373. # test tuple.__contains__:
  374. assert (1,2,3).__contains__(5) == False
  375. # 未完全测试准确性-----------------------------------------------
  376. # 116: 799: _vm->bind_method<1>("tuple", "count", [](VM* vm, ArgsView args) {
  377. # #####: 800: Tuple& self = _CAST(Tuple&, args[0]);
  378. # -: 801: int count = 0;
  379. # #####: 802: for(PyObject* i: self) if(vm->py_eq(i, args[1])) count++;
  380. # #####: 803: return VAR(count);
  381. # -: 804: });
  382. # test tuple.count:
  383. assert (1,2,2,3,3,3).count(3) == 3
  384. assert (1,2,2,3,3,3).count(0) == 0
  385. # /************ bool ************/
  386. # -----------------------------------------------
  387. # 116: 842: _vm->bind__repr__(_vm->tp_bool, [](VM* vm, PyObject* self) {
  388. # #####: 843: bool val = _CAST(bool, self);
  389. # #####: 844: return VAR(val ? "True" : "False");
  390. # -: 845: });
  391. # test bool.__repr__:
  392. assert repr(True) == 'True'
  393. assert repr(False) == 'False'
  394. # 未完全测试准确性-----------------------------------------------
  395. # 116: 882: _vm->bind__and__(_vm->tp_bool, [](VM* vm, PyObject* lhs, PyObject* rhs) {
  396. # #####: 883: return VAR(_CAST(bool, lhs) && CAST(bool, rhs));
  397. # -: 884: });
  398. # test bool.__and__:
  399. assert True & True == 1
  400. # 未完全测试准确性-----------------------------------------------
  401. # 116: 885: _vm->bind__or__(_vm->tp_bool, [](VM* vm, PyObject* lhs, PyObject* rhs) {
  402. # #####: 886: return VAR(_CAST(bool, lhs) || CAST(bool, rhs));
  403. # -: 887: });
  404. # test bool.__or__:
  405. assert True | True == 1
  406. # 未完全测试准确性-----------------------------------------------
  407. # 116: 888: _vm->bind__xor__(_vm->tp_bool, [](VM* vm, PyObject* lhs, PyObject* rhs) {
  408. # #####: 889: return VAR(_CAST(bool, lhs) != CAST(bool, rhs));
  409. # -: 890: });
  410. # test bool.__xor__:
  411. assert (True ^ True) == 0
  412. # 未完全测试准确性-----------------------------------------------
  413. # 120: 891: _vm->bind__eq__(_vm->tp_bool, [](VM* vm, PyObject* lhs, PyObject* rhs) {
  414. # 2: 892: if(is_non_tagged_type(rhs, vm->tp_bool)) return VAR(lhs == rhs);
  415. # #####: 893: if(is_int(rhs)) return VAR(_CAST(bool, lhs) == (bool)CAST(i64, rhs));
  416. # #####: 894: return vm->NotImplemented;
  417. # 2: 895: });
  418. # test bool.__eq__:
  419. assert (True == True) == 1
  420. # /************ bytes ************/
  421. # 未完全测试准确性-----------------------------------------------
  422. # 116: 922: _vm->bind__hash__(_vm->tp_bytes, [](VM* vm, PyObject* obj) {
  423. # #####: 923: const Bytes& self = _CAST(Bytes&, obj);
  424. # #####: 924: std::string_view view(self.data(), self.size());
  425. # #####: 925: return (i64)std::hash<std::string_view>()(view);
  426. # #####: 926: });
  427. # test bytes.__hash__:
  428. assert type(hash(bytes([0x41, 0x42, 0x43]))) is int
  429. # 未完全测试准确性-----------------------------------------------
  430. # test bytes.__repr__:
  431. assert type(repr(bytes([0x41, 0x42, 0x43]))) is str
  432. # /************ slice ************/
  433. # 未完全测试准确性-----------------------------------------------
  434. # 116: 953: _vm->bind_constructor<4>("slice", [](VM* vm, ArgsView args) {
  435. # #####: 954: return VAR(Slice(args[1], args[2], args[3]));
  436. # -: 955: });
  437. # test slice:
  438. assert type(slice(0.1, 0.2, 0.3)) is slice
  439. # 未完全测试准确性-----------------------------------------------
  440. # 116: 1529: bind_property(_t(tp_slice), "start", [](VM* vm, ArgsView args){
  441. # #####: 1530: return CAST(Slice&, args[0]).start;
  442. # -: 1531: });
  443. # 116: 1532: bind_property(_t(tp_slice), "stop", [](VM* vm, ArgsView args){
  444. # #####: 1533: return CAST(Slice&, args[0]).stop;
  445. # -: 1534: });
  446. # 116: 1535: bind_property(_t(tp_slice), "step", [](VM* vm, ArgsView args){
  447. # #####: 1536: return CAST(Slice&, args[0]).step;
  448. # -: 1537: });
  449. s = slice(1, 2, 3)
  450. assert type(s) is slice
  451. assert s.start == 1
  452. assert s.stop == 2
  453. assert s.step == 3
  454. assert slice.__dict__['start'].__signature__ == 'start'
  455. # 未完全测试准确性-----------------------------------------------
  456. # test slice.__repr__
  457. assert type(repr(slice(1,1,1))) is str
  458. # /************ mappingproxy ************/
  459. # 未完全测试准确性-----------------------------------------------
  460. # 116: 968: _vm->bind_method<0>("mappingproxy", "keys", [](VM* vm, ArgsView args) {
  461. # #####: 969: MappingProxy& self = _CAST(MappingProxy&, args[0]);
  462. # #####: 970: List keys;
  463. # #####: 971: for(StrName name : self.attr().keys()) keys.push_back(VAR(name.sv()));
  464. # #####: 972: return VAR(std::move(keys));
  465. # #####: 973: });
  466. # test mappingproxy.keys:
  467. class A():
  468. def __init__(self):
  469. self.a = 10
  470. def method(self):
  471. pass
  472. my_mappingproxy = A().__dict__
  473. assert type(my_mappingproxy.keys()) is list
  474. # 未完全测试准确性-----------------------------------------------
  475. # 116: 975: _vm->bind_method<0>("mappingproxy", "values", [](VM* vm, ArgsView args) {
  476. # #####: 976: MappingProxy& self = _CAST(MappingProxy&, args[0]);
  477. # #####: 977: List values;
  478. # #####: 978: for(auto& item : self.attr().items()) values.push_back(item.second);
  479. # #####: 979: return VAR(std::move(values));
  480. # #####: 980: });
  481. # test mappingproxy.values:
  482. class A():
  483. def __init__(self):
  484. self.a = 10
  485. def method(self):
  486. pass
  487. my_mappingproxy = A().__dict__
  488. assert type(my_mappingproxy.values()) is list
  489. # 未完全测试准确性-----------------------------------------------
  490. # 116: 992: _vm->bind__len__(_vm->tp_mappingproxy, [](VM* vm, PyObject* obj) {
  491. # #####: 993: return (i64)_CAST(MappingProxy&, obj).attr().size();
  492. # -: 994: });
  493. # test mappingproxy.__len__:
  494. class A():
  495. def __init__(self):
  496. self.a = 10
  497. def method(self):
  498. pass
  499. my_mappingproxy = A().__dict__
  500. assert type(len(my_mappingproxy)) is int
  501. # 未完全测试准确性-----------------------------------------------
  502. # 116: 996: _vm->bind__hash__(_vm->tp_mappingproxy, [](VM* vm, PyObject* obj) {
  503. # #####: 997: vm->TypeError("unhashable type: 'mappingproxy'");
  504. # #####: 998: return (i64)0;
  505. # #####: 999: });
  506. # test mappingproxy.__hash__:
  507. class A():
  508. def __init__(self):
  509. self.a = 10
  510. def method(self):
  511. pass
  512. my_mappingproxy = A().__dict__
  513. try:
  514. hash(my_mappingproxy)
  515. print('未能拦截错误, 在测试 mappingproxy.__hash__')
  516. exit(1)
  517. except TypeError:
  518. pass
  519. a = hash(object()) # object is hashable
  520. a = hash(A()) # A is hashable
  521. class B:
  522. def __eq__(self, o): return True
  523. try:
  524. hash(B())
  525. print('未能拦截错误, 在测试 B.__hash__')
  526. exit(1)
  527. except TypeError:
  528. pass
  529. # 未完全测试准确性-----------------------------------------------
  530. # test mappingproxy.__repr__:
  531. class A():
  532. def __init__(self):
  533. self.a = 10
  534. def method(self):
  535. pass
  536. my_mappingproxy = A().__dict__
  537. assert type(repr(my_mappingproxy)) is str
  538. # /************ dict ************/
  539. # 未完全测试准确性-----------------------------------------------
  540. # 202: 1033: _vm->bind_method<-1>("dict", "__init__", [](VM* vm, ArgsView args){
  541. # 43: 1034: if(args.size() == 1+0) return vm->None;
  542. # 42: 1035: if(args.size() == 1+1){
  543. # 42: 1036: auto _lock = vm->heap.gc_scope_lock();
  544. # 42: 1037: Dict& self = _CAST(Dict&, args[0]);
  545. # 42: 1038: List& list = CAST(List&, args[1]);
  546. # 165: 1039: for(PyObject* item : list){
  547. # 123: 1040: Tuple& t = CAST(Tuple&, item);
  548. # 123: 1041: if(t.size() != 2){
  549. # #####: 1042: vm->ValueError("dict() takes an iterable of tuples (key, value)");
  550. # #####: 1043: return vm->None;
  551. # -: 1044: }
  552. # 123: 1045: self.set(t[0], t[1]);
  553. # 246: 1046: }
  554. # 42: 1047: return vm->None;
  555. # 42: 1048: }
  556. # #####: 1049: vm->TypeError("dict() takes at most 1 argument");
  557. # #####: 1050: return vm->None;
  558. # 43: 1051: });
  559. # test dict:
  560. assert type(dict([(1,2)])) is dict
  561. try:
  562. dict([(1, 2, 3)])
  563. print('未能拦截错误, 在测试 dict')
  564. exit(1)
  565. except:
  566. pass
  567. try:
  568. dict([(1, 2)], 1)
  569. print('未能拦截错误, 在测试 dict')
  570. exit(1)
  571. except:
  572. pass
  573. # 未完全测试准确性-----------------------------------------------
  574. # 116: 1057: _vm->bind__hash__(_vm->tp_dict, [](VM* vm, PyObject* obj) {
  575. # #####: 1058: vm->TypeError("unhashable type: 'dict'");
  576. # #####: 1059: return (i64)0;
  577. # #####: 1060: });
  578. # test dict.__hash__
  579. try:
  580. hash(dict([(1,2)]))
  581. print('未能拦截错误, 在测试 dict.__hash__')
  582. exit(1)
  583. except:
  584. pass
  585. # 未完全测试准确性-----------------------------------------------
  586. # 116: 1093: _vm->bind__iter__(_vm->tp_dict, [](VM* vm, PyObject* obj) {
  587. # #####: 1094: const Dict& self = _CAST(Dict&, obj);
  588. # #####: 1095: return vm->py_iter(VAR(self.keys()));
  589. # #####: 1096: });
  590. # test dict.__iter__
  591. for k in {1:2, 2:3, 3:4}:
  592. assert k in [1,2,3]
  593. # 未完全测试准确性-----------------------------------------------
  594. # 166: 1098: _vm->bind_method<-1>("dict", "get", [](VM* vm, ArgsView args) {
  595. # 25: 1099: Dict& self = _CAST(Dict&, args[0]);
  596. # 25: 1100: if(args.size() == 1+1){
  597. # #####: 1101: PyObject* ret = self.try_get(args[1]);
  598. # #####: 1102: if(ret != nullptr) return ret;
  599. # #####: 1103: return vm->None;
  600. # 25: 1104: }else if(args.size() == 1+2){
  601. # 25: 1105: PyObject* ret = self.try_get(args[1]);
  602. # 25: 1106: if(ret != nullptr) return ret;
  603. # 19: 1107: return args[2];
  604. # -: 1108: }
  605. # #####: 1109: vm->TypeError("get() takes at most 2 arguments");
  606. # #####: 1110: return vm->None;
  607. # 25: 1111: });
  608. # test dict.get
  609. assert {1:2, 3:4}.get(1) == 2
  610. assert {1:2, 3:4}.get(2) is None
  611. assert {1:2, 3:4}.get(20, 100) == 100
  612. try:
  613. {1:2, 3:4}.get(1,1, 1)
  614. print('未能拦截错误, 在测试 dict.get')
  615. exit(1)
  616. except:
  617. pass
  618. # 未完全测试准确性-----------------------------------------------
  619. # test dict.__repr__
  620. assert type(repr({1:2, 3:4})) is str
  621. # /************ property ************/
  622. class A():
  623. def __init__(self):
  624. self._name = '123'
  625. @property
  626. def value(self):
  627. return 2
  628. def get_name(self):
  629. '''
  630. doc string 1
  631. '''
  632. return self._name
  633. def set_name(self, val):
  634. '''
  635. doc string 2
  636. '''
  637. self._name = val
  638. assert A().value == 2
  639. assert A.__dict__['value'].__signature__ == ''
  640. A.name = property(A.get_name, A.set_name, "name: str")
  641. assert A.__dict__['name'].__signature__ == 'name: str'
  642. try:
  643. property(A.get_name, A.set_name, 1)
  644. print('未能拦截错误, 在测试 property')
  645. exit(1)
  646. except:
  647. pass
  648. class Vector2:
  649. def __init__(self) -> None:
  650. self._x = 0
  651. @property
  652. def x(self):
  653. return self._x
  654. @x.setter
  655. def x(self, val):
  656. self._x = val
  657. v = Vector2()
  658. assert v.x == 0
  659. v.x = 10
  660. assert v.x == 10
  661. # /************ module timeit ************/
  662. import timeit
  663. def aaa():
  664. for i in range(10):
  665. for j in range(10):
  666. pass
  667. assert type(timeit.timeit(aaa, 2)) is float
  668. # 未完全测试准确性-----------------------------------------------
  669. # 116: 1218: _vm->bind_property(_vm->_t(_vm->tp_function), "__doc__", [](VM* vm, ArgsView args) {
  670. # #####: 1219: Function& func = _CAST(Function&, args[0]);
  671. # #####: 1220: return VAR(func.decl->docstring);
  672. # -: 1221: });
  673. # function.__doc__
  674. def aaa():
  675. '12345'
  676. pass
  677. assert type(aaa.__doc__) is str
  678. # 未完全测试准确性-----------------------------------------------
  679. # 116: 1229: _vm->bind_property(_vm->_t(_vm->tp_function), "__signature__", [](VM* vm, ArgsView args) {
  680. # #####: 1230: Function& func = _CAST(Function&, args[0]);
  681. # #####: 1231: return VAR(func.decl->signature);
  682. # -: 1232: });
  683. # function.__signature__
  684. def aaa():
  685. pass
  686. assert type(aaa.__signature__) is str
  687. # /************ module time ************/
  688. import time
  689. # 未完全测试准确性-----------------------------------------------
  690. # 116: 1267: vm->bind_func<1>(mod, "sleep", [](VM* vm, ArgsView args) {
  691. # #####: 1268: f64 seconds = CAST_F(args[0]);
  692. # #####: 1269: auto begin = std::chrono::system_clock::now();
  693. # #####: 1270: while(true){
  694. # #####: 1271: auto now = std::chrono::system_clock::now();
  695. # #####: 1272: f64 elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - begin).count() / 1000.0;
  696. # #####: 1273: if(elapsed >= seconds) break;
  697. # #####: 1274: }
  698. # #####: 1275: return vm->None;
  699. # #####: 1276: });
  700. # test time.time
  701. assert type(time.time()) is float
  702. local_t = time.localtime()
  703. assert type(local_t.tm_year) is int
  704. assert type(local_t.tm_mon) is int
  705. assert type(local_t.tm_mday) is int
  706. assert type(local_t.tm_hour) is int
  707. assert type(local_t.tm_min) is int
  708. assert type(local_t.tm_sec) is int
  709. assert type(local_t.tm_wday) is int
  710. assert type(local_t.tm_yday) is int
  711. assert type(local_t.tm_isdst) is int
  712. # 未完全测试准确性-----------------------------------------------
  713. # 116: 1267: vm->bind_func<1>(mod, "sleep", [](VM* vm, ArgsView args) {
  714. # #####: 1268: f64 seconds = CAST_F(args[0]);
  715. # #####: 1269: auto begin = std::chrono::system_clock::now();
  716. # #####: 1270: while(true){
  717. # #####: 1271: auto now = std::chrono::system_clock::now();
  718. # #####: 1272: f64 elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - begin).count() / 1000.0;
  719. # #####: 1273: if(elapsed >= seconds) break;
  720. # #####: 1274: }
  721. # #####: 1275: return vm->None;
  722. # #####: 1276: });
  723. # test time.sleep
  724. time.sleep(0.1)
  725. # 未完全测试准确性-----------------------------------------------
  726. # 116: 1278: vm->bind_func<0>(mod, "localtime", [](VM* vm, ArgsView args) {
  727. # #####: 1279: auto now = std::chrono::system_clock::now();
  728. # #####: 1280: std::time_t t = std::chrono::system_clock::to_time_t(now);
  729. # #####: 1281: std::tm* tm = std::localtime(&t);
  730. # #####: 1282: Dict d(vm);
  731. # #####: 1283: d.set(VAR("tm_year"), VAR(tm->tm_year + 1900));
  732. # #####: 1284: d.set(VAR("tm_mon"), VAR(tm->tm_mon + 1));
  733. # #####: 1285: d.set(VAR("tm_mday"), VAR(tm->tm_mday));
  734. # #####: 1286: d.set(VAR("tm_hour"), VAR(tm->tm_hour));
  735. # #####: 1287: d.set(VAR("tm_min"), VAR(tm->tm_min));
  736. # #####: 1288: d.set(VAR("tm_sec"), VAR(tm->tm_sec + 1));
  737. # #####: 1289: d.set(VAR("tm_wday"), VAR((tm->tm_wday + 6) % 7));
  738. # #####: 1290: d.set(VAR("tm_yday"), VAR(tm->tm_yday + 1));
  739. # #####: 1291: d.set(VAR("tm_isdst"), VAR(tm->tm_isdst));
  740. # #####: 1292: return VAR(std::move(d));
  741. # #####: 1293: });
  742. # 58: 1294:}
  743. # test time.localtime
  744. assert type(time.localtime()) is time.struct_time
  745. # test min/max
  746. assert min(1, 2) == 1
  747. assert min(1, 2, 3) == 1
  748. assert min([1, 2]) == 1
  749. assert min([1, 2], key=lambda x: -x) == 2
  750. assert max(1, 2) == 2
  751. assert max(1, 2, 3) == 3
  752. assert max([1, 2]) == 2
  753. assert max([1, 2, 3], key=lambda x: -x) == 1
  754. assert min([
  755. (1, 2),
  756. (1, 3),
  757. (1, 4),
  758. ]) == (1, 2)
  759. assert min(1, 2) == 1
  760. assert max(1, 2) == 2
  761. # test callable
  762. assert callable(lambda: 1) is True # function
  763. assert callable(1) is False # int
  764. assert callable(object) is True # type
  765. assert callable(object()) is False
  766. assert callable([].append) is True # bound method
  767. assert callable([].__getitem__) is True # bound method
  768. class A:
  769. def __init__(self):
  770. pass
  771. def __call__(self):
  772. pass
  773. assert callable(A) is True # type
  774. assert callable(A()) is True # instance with __call__
  775. assert callable(A.__call__) is True # bound method
  776. assert callable(A.__init__) is True # bound method
  777. assert callable(print) is True # builtin function
  778. assert callable(isinstance) is True # builtin function
  779. assert id(0) is None
  780. assert id(2**62) is not None
  781. # test issubclass
  782. assert issubclass(int, int) is True
  783. assert issubclass(int, object) is True
  784. assert issubclass(object, int) is False
  785. assert issubclass(object, object) is True
  786. assert issubclass(int, type) is False
  787. assert issubclass(type, type) is True
  788. assert issubclass(float, int) is False