test_common.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. #define __OOC_CPP__
  2. #define __OOC_DEBUG__
  3. #include "BaseObj.h"
  4. #include "PikaCompiler.h"
  5. #include "PikaParser.h"
  6. #include "PikaVM.h"
  7. #include "TinyObj.h"
  8. #include "dataArgs.h"
  9. #include "dataMemory.h"
  10. #include "dataStrs.h"
  11. extern "C" {
  12. #include <stdio.h>
  13. #include "../fuzzypid/fuzzy_PID.h"
  14. #include "PikaMain.h"
  15. #include "PikaMath_Operator.h"
  16. #include "PikaStdLib_MemChecker.h"
  17. #include "PikaStdLib_SysObj.h"
  18. #include "pikaScript.h"
  19. #include "pika_config_gtest.h"
  20. #include "pika_hal.h"
  21. #include "../jrpc/jrpc.h"
  22. char* PikaStdData_Dict___str__(PikaObj* self);
  23. char* PikaStdData_List___str__(PikaObj* self);
  24. extern PikaMemInfo g_PikaMemInfo;
  25. /* the log_buff of printf */
  26. extern char log_buff[LOG_BUFF_MAX][LOG_SIZE];
  27. }
  28. #define TEST_RUN_SINGLE_FILE(_test_suite_, _test_name_, _file_name_) \
  29. TEST(_test_suite_, _test_name_) { \
  30. g_PikaMemInfo.heapUsedMax = 0; \
  31. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain); \
  32. extern unsigned char pikaModules_py_a[]; \
  33. obj_linkLibrary(pikaMain, pikaModules_py_a); \
  34. /* run */ \
  35. __platform_printf("BEGIN\r\n"); \
  36. pikaVM_runSingleFile(pikaMain, _file_name_); \
  37. /* assert */ \
  38. /* deinit */ \
  39. obj_deinit(pikaMain); \
  40. EXPECT_EQ(pikaMemNow(), 0); \
  41. }
  42. extern "C" {
  43. volatile static FILE* _f_getchar_fp = NULL;
  44. static char _f_getchar(void) {
  45. char c = 0;
  46. size_t n = fread(&c, 1, 1, (FILE*)_f_getchar_fp);
  47. if (n > 0) {
  48. return c;
  49. }
  50. pika_platform_printf("f_getchar error\r\n");
  51. pika_assert(0);
  52. return -1;
  53. }
  54. static char _fmem_getchar(void) {
  55. char c = 0;
  56. size_t n = fread(&c, 1, 1, (FILE*)_f_getchar_fp);
  57. if (n > 0) {
  58. return c;
  59. }
  60. return 0;
  61. }
  62. void pikaScriptShell_withGetchar(PikaObj* self, sh_getchar getchar_fn);
  63. }
  64. #define TEST_RUN_REPL_FILE(_test_suite_, _test_name_, _file_name_) \
  65. TEST(_test_suite_, _test_name_) { \
  66. /* init */ \
  67. g_PikaMemInfo.heapUsedMax = 0; \
  68. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain); \
  69. extern unsigned char pikaModules_py_a[]; \
  70. obj_linkLibrary(pikaMain, pikaModules_py_a); \
  71. /* run */ \
  72. __platform_printf("BEGIN\r\n"); \
  73. _f_getchar_fp = fopen(_file_name_, "rb"); \
  74. pikaScriptShell_withGetchar(pikaMain, _f_getchar); \
  75. fclose((FILE*)_f_getchar_fp); \
  76. /* collect */ \
  77. /* assert */ \
  78. /* deinit */ \
  79. obj_deinit(pikaMain); \
  80. EXPECT_EQ(pikaMemNow(), 0); \
  81. }
  82. #define TEST_RUN_SINGLE_FILE_PASS(_test_suite_, _test_name_, _file_name_) \
  83. TEST(_test_suite_, _test_name_) { \
  84. g_PikaMemInfo.heapUsedMax = 0; \
  85. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain); \
  86. extern unsigned char pikaModules_py_a[]; \
  87. obj_linkLibrary(pikaMain, pikaModules_py_a); \
  88. /* run */ \
  89. __platform_printf("BEGIN\r\n"); \
  90. pikaVM_runSingleFile(pikaMain, _file_name_); \
  91. /* assert */ \
  92. EXPECT_STREQ(log_buff[0], "PASS\r\n"); \
  93. EXPECT_STREQ(log_buff[1], "BEGIN\r\n"); \
  94. /* deinit */ \
  95. obj_deinit(pikaMain); \
  96. EXPECT_EQ(pikaMemNow(), 0); \
  97. }
  98. #define TEST_RUN_LINES_REPL(_test_suite_, _test_name_, _lines_) \
  99. TEST(_test_suite_, _test_name_) { \
  100. /* init */ \
  101. extern volatile pika_bool g_always_repl_mode; \
  102. g_always_repl_mode = pika_false; \
  103. g_PikaMemInfo.heapUsedMax = 0; \
  104. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain); \
  105. extern unsigned char pikaModules_py_a[]; \
  106. obj_linkLibrary(pikaMain, pikaModules_py_a); \
  107. /* run */ \
  108. __platform_printf("BEGIN\r\n"); \
  109. _f_getchar_fp = fmemopen((void*)_lines_, strlen(_lines_), "rb"); \
  110. pikaScriptShell_withGetchar(pikaMain, _fmem_getchar); \
  111. fclose((FILE*)_f_getchar_fp); \
  112. /* collect */ \
  113. /* assert */ \
  114. /* deinit */ \
  115. obj_deinit(pikaMain); \
  116. EXPECT_EQ(pikaMemNow(), 0); \
  117. g_always_repl_mode = pika_true; \
  118. }
  119. #define TEST_RUN_SINGLE_FILE_ASSERT(_test_suite_, _test_name_, _file_name_, \
  120. __expt__) \
  121. TEST(_test_suite_, _test_name_) { \
  122. g_PikaMemInfo.heapUsedMax = 0; \
  123. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain); \
  124. extern unsigned char pikaModules_py_a[]; \
  125. obj_linkLibrary(pikaMain, pikaModules_py_a); \
  126. /* run */ \
  127. __platform_printf("BEGIN\r\n"); \
  128. pikaVM_runSingleFile(pikaMain, _file_name_); \
  129. /* assert */ \
  130. EXPECT_TRUE((__expt__)); \
  131. /* deinit */ \
  132. obj_deinit(pikaMain); \
  133. EXPECT_EQ(pikaMemNow(), 0); \
  134. }
  135. #define TEST_RUN_SINGLE_FILE_EXCEPT_OUTPUT(_test_suite_, _test_name_, \
  136. _file_name_, _except_output_) \
  137. TEST(_test_suite_, _test_name_) { \
  138. g_PikaMemInfo.heapUsedMax = 0; \
  139. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain); \
  140. extern unsigned char pikaModules_py_a[]; \
  141. obj_linkLibrary(pikaMain, pikaModules_py_a); \
  142. /* run */ \
  143. pikaVM_runSingleFile(pikaMain, _file_name_); \
  144. /* assert */ \
  145. EXPECT_STREQ(log_buff[0], (_except_output_)); \
  146. /* deinit */ \
  147. obj_deinit(pikaMain); \
  148. EXPECT_EQ(pikaMemNow(), 0); \
  149. }
  150. #define TEST_RUN_SINGLE_FILE_EXCEPT_OUTPUT2(_test_suite_, _test_name_, \
  151. _file_name_, _except_output1_, \
  152. _except_output2_) \
  153. TEST(_test_suite_, _test_name_) { \
  154. g_PikaMemInfo.heapUsedMax = 0; \
  155. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain); \
  156. extern unsigned char pikaModules_py_a[]; \
  157. obj_linkLibrary(pikaMain, pikaModules_py_a); \
  158. /* run */ \
  159. __platform_printf("BEGIN\r\n"); \
  160. pikaVM_runSingleFile(pikaMain, _file_name_); \
  161. /* assert */ \
  162. EXPECT_STREQ(log_buff[0], (_except_output1_)); \
  163. EXPECT_STREQ(log_buff[1], (_except_output2_)); \
  164. EXPECT_STREQ(log_buff[2], "BEGIN\r\n"); \
  165. /* deinit */ \
  166. obj_deinit(pikaMain); \
  167. EXPECT_EQ(pikaMemNow(), 0); \
  168. }
  169. #define TEST_RUN_SINGLE_FILE_EXCEPT_OUTPUT_INDEXED( \
  170. _test_suite_, _test_name_, _file_name_, _index_, _except_output_) \
  171. TEST(_test_suite_, _test_name_) { \
  172. g_PikaMemInfo.heapUsedMax = 0; \
  173. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain); \
  174. extern unsigned char pikaModules_py_a[]; \
  175. obj_linkLibrary(pikaMain, pikaModules_py_a); \
  176. /* run */ \
  177. __platform_printf("BEGIN\r\n"); \
  178. pikaVM_runSingleFile(pikaMain, _file_name_); \
  179. /* assert */ \
  180. EXPECT_STREQ(log_buff[_index_], (_except_output_)); \
  181. /* deinit */ \
  182. obj_deinit(pikaMain); \
  183. EXPECT_EQ(pikaMemNow(), 0); \
  184. }
  185. #define TEST_RUN_LINES(_test_suite_, _test_name_, _lines_) \
  186. TEST(_test_suite_, _test_name_) { \
  187. PikaObj* self = newRootObj("root", New_PikaMain); \
  188. extern unsigned char pikaModules_py_a[]; \
  189. obj_linkLibrary(self, pikaModules_py_a); \
  190. obj_run(self, (_lines_)); /* collect */ /* assert */ \
  191. obj_deinit(self); \
  192. EXPECT_EQ(pikaMemNow(), 0); \
  193. }
  194. #define TEST_RUN_LINES_NO_OUTPUT(_test_suite_, _test_name_, _lines_) \
  195. TEST(_test_suite_, _test_name_) { \
  196. PikaObj* self = newRootObj("root", New_PikaMain); \
  197. extern unsigned char pikaModules_py_a[]; \
  198. obj_linkLibrary(self, pikaModules_py_a); \
  199. pika_platform_printf("BEGIN\r\n"); \
  200. obj_run(self, (_lines_)); /* collect */ /* assert */ \
  201. EXPECT_STREQ(log_buff[0], "BEGIN\r\n"); \
  202. obj_deinit(self); \
  203. EXPECT_EQ(pikaMemNow(), 0); \
  204. }
  205. #define TEST_RUN_LINES_PASS(_test_suite_, _test_name_, _lines_) \
  206. TEST(_test_suite_, _test_name_) { \
  207. PikaObj* self = newRootObj("root", New_PikaMain); \
  208. extern unsigned char pikaModules_py_a[]; \
  209. obj_linkLibrary(self, pikaModules_py_a); \
  210. obj_run(self, (_lines_)); /* collect */ /* assert */ \
  211. EXPECT_STREQ(log_buff[0], "PASS\r\n"); \
  212. obj_deinit(self); \
  213. EXPECT_EQ(pikaMemNow(), 0); \
  214. }
  215. #define TEST_RUN_LINES_EXCEPT_OUTPUT(_test_suite_, _test_name_, _lines_, \
  216. _except_output_) \
  217. TEST(_test_suite_, _test_name_) { \
  218. PikaObj* self = newRootObj("root", New_PikaMain); \
  219. extern unsigned char pikaModules_py_a[]; \
  220. obj_linkLibrary(self, pikaModules_py_a); \
  221. obj_run(self, (_lines_)); /* collect */ /* assert */ \
  222. EXPECT_STREQ(log_buff[0], (_except_output_)); \
  223. obj_deinit(self); \
  224. EXPECT_EQ(pikaMemNow(), 0); \
  225. }
  226. #define TEST_RUN_LINES_EXCEPT_OUTPUT2(_test_suite_, _test_name_, _lines_, \
  227. _except_output1_, _except_output2_) \
  228. TEST(_test_suite_, _test_name_) { \
  229. PikaObj* self = newRootObj("root", New_PikaMain); \
  230. extern unsigned char pikaModules_py_a[]; \
  231. obj_linkLibrary(self, pikaModules_py_a); \
  232. obj_run(self, (_lines_)); /* collect */ /* assert */ \
  233. EXPECT_STREQ(log_buff[0], (_except_output1_)); \
  234. EXPECT_STREQ(log_buff[1], (_except_output2_)); \
  235. obj_deinit(self); \
  236. EXPECT_EQ(pikaMemNow(), 0); \
  237. }
  238. #define TEST_RUN_LINES_EXCEPT_OUTPUT_INDEXED( \
  239. _test_suite_, _test_name_, _lines_, _index_, _except_output_) \
  240. TEST(_test_suite_, _test_name_) { \
  241. PikaObj* self = newRootObj("root", New_PikaMain); \
  242. extern unsigned char pikaModules_py_a[]; \
  243. obj_linkLibrary(self, pikaModules_py_a); \
  244. obj_run(self, (_lines_)); /* collect */ /* assert */ \
  245. EXPECT_STREQ(log_buff[_index_], (_except_output_)); \
  246. obj_deinit(self); \
  247. EXPECT_EQ(pikaMemNow(), 0); \
  248. }
  249. #if USE_GOOGLE_TEST
  250. #include "gtest/gtest.h"
  251. #define TEST_START
  252. #define TEST_END
  253. #else
  254. #include "test_purec.h"
  255. #endif