test.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. #include "pocketpy_c.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. //tests the c bindings for pocketpy
  5. void check_impl(pkpy_vm* vm, bool result, int lineno) {
  6. if (!result) {
  7. printf("ERROR: failed where it should have succeed at line %i\n", lineno);
  8. char* message;
  9. if (!pkpy_clear_error(vm, &message)) {
  10. printf("clear error reported everything was fine\n");
  11. exit(1);
  12. }
  13. printf("%s\n", message);
  14. exit(1);
  15. }
  16. }
  17. void fail_impl(pkpy_vm* vm, bool result, int lineno) {
  18. if (result) {
  19. printf("ERROR: succeeded where it should have failed line %i\n", lineno);
  20. exit(1);
  21. } else {
  22. char* message;
  23. if (pkpy_clear_error(vm, &message)) {
  24. printf("actually errored!\n");
  25. exit(1);
  26. }
  27. }
  28. }
  29. void error_impl(pkpy_vm* vm, bool result, int lineno) {
  30. if (result) {
  31. printf("ERROR: succeeded where it should have failed line %i\n", lineno);
  32. exit(1);
  33. } else {
  34. char* message;
  35. if (!pkpy_clear_error(vm, &message))
  36. printf("clear error reported everything was fine\n");
  37. else {
  38. printf("successfully errored with this message: \n");
  39. printf("%s\n", message);
  40. }
  41. }
  42. }
  43. #define check(r) check_impl(vm, (r), __LINE__)
  44. #define fail(r) fail_impl(vm, (r), __LINE__)
  45. #define error(r) error_impl(vm, (r), __LINE__)
  46. int test_binding(pkpy_vm* vm) {
  47. pkpy_push_int(vm, 12);
  48. return 1;
  49. }
  50. int test_multiple_return(pkpy_vm* vm) {
  51. pkpy_push_int(vm, 12);
  52. pkpy_push_int(vm, 13);
  53. return 2;
  54. }
  55. int test_return_none(pkpy_vm* vm) {
  56. return 0;
  57. }
  58. int test_error_propagate(pkpy_vm* vm) {
  59. pkpy_get_global(vm, "does not exist");
  60. return 1;
  61. }
  62. pkpy_vm* vm;
  63. void cleanup(void) {
  64. pkpy_vm_destroy(vm);
  65. }
  66. int main(int argc, char** argv) {
  67. vm = pkpy_vm_create(true, true);
  68. atexit(cleanup);
  69. //test run
  70. check(pkpy_vm_run(vm, "print('hello world!')"));
  71. error(pkpy_get_global(vm, "nonexistatn"));
  72. printf("\ntesting int methods\n");
  73. int r_int;
  74. check(pkpy_push_int(vm, 11));
  75. check(pkpy_set_global(vm, "eleven"));
  76. check(pkpy_vm_run(vm, "print(eleven)"));
  77. check(pkpy_get_global(vm, "eleven"));
  78. check(pkpy_is_int(vm, -1));
  79. check(pkpy_to_int(vm, -1, &r_int));
  80. printf("%i\n", r_int);
  81. fail(pkpy_is_float(vm, -1));
  82. fail(pkpy_is_bool(vm, -1));
  83. fail(pkpy_is_string(vm, -1));
  84. fail(pkpy_is_none(vm, -1));
  85. printf("\ntesting float methods\n");
  86. double r_float;
  87. check(pkpy_push_float(vm, 11.11));
  88. check(pkpy_set_global(vm, "elevenf"));
  89. check(pkpy_vm_run(vm, "print(elevenf)"));
  90. check(pkpy_get_global(vm, "elevenf"));
  91. check(pkpy_is_float(vm, -1));
  92. check(pkpy_to_float(vm, -1, &r_float));
  93. printf("%f\n", r_float);
  94. fail(pkpy_is_int(vm, -1));
  95. fail(pkpy_is_bool(vm, -1));
  96. fail(pkpy_is_string(vm, -1));
  97. fail(pkpy_is_none(vm, -1));
  98. printf("\ntesting bool methods\n");
  99. bool r_bool;
  100. check(pkpy_push_bool(vm, false));
  101. check(pkpy_set_global(vm, "false_test"));
  102. check(pkpy_vm_run(vm, "print(false_test)"));
  103. check(pkpy_get_global(vm, "false_test"));
  104. check(pkpy_is_bool(vm, -1));
  105. check(pkpy_to_bool(vm, -1, &r_bool));
  106. printf("%i\n", r_bool);
  107. fail(pkpy_is_int(vm, -1));
  108. fail(pkpy_is_float(vm, -1));
  109. fail(pkpy_is_string(vm, -1));
  110. fail(pkpy_is_none(vm, -1));
  111. printf("\ntesting string methods\n");
  112. char* r_string;
  113. check(pkpy_push_string(vm, "hello!"));
  114. check(pkpy_set_global(vm, "hello1"));
  115. check(pkpy_vm_run(vm, "print(hello1)"));
  116. check(pkpy_push_stringn(vm, "hello!", 5));
  117. check(pkpy_is_string(vm, -1));
  118. check(pkpy_to_string(vm, -1, &r_string));
  119. printf("%s\n", r_string);
  120. fail(pkpy_is_int(vm, -1));
  121. fail(pkpy_is_float(vm, -1));
  122. fail(pkpy_is_bool(vm, -1));
  123. fail(pkpy_is_none(vm, -1));
  124. printf("\ntesting None methods\n");
  125. check(pkpy_push_none(vm));
  126. check(pkpy_set_global(vm, "none"));
  127. check(pkpy_vm_run(vm, "print(none)"));
  128. check(pkpy_get_global(vm, "none"));
  129. check(pkpy_is_none(vm, -1));
  130. fail(pkpy_is_int(vm, -1));
  131. fail(pkpy_is_float(vm, -1));
  132. fail(pkpy_is_bool(vm, -1));
  133. fail(pkpy_is_string(vm, -1));
  134. printf("\ntesting sizing and indexing\n");
  135. int stack_size = pkpy_stack_size(vm);
  136. printf("stack size %i\n", stack_size);
  137. check(pkpy_check_stack(vm, 10));
  138. check(pkpy_check_stack(vm, 27));
  139. fail(pkpy_check_stack(vm, 28));
  140. check(pkpy_is_int(vm, 0));
  141. check(pkpy_is_float(vm, 1));
  142. check(pkpy_is_bool(vm, 2));
  143. check(pkpy_is_string(vm, 3));
  144. check(pkpy_is_none(vm, 4));
  145. check(pkpy_is_int(vm, -5));
  146. check(pkpy_is_float(vm, -4));
  147. check(pkpy_is_bool(vm, -3));
  148. check(pkpy_is_string(vm, -2));
  149. check(pkpy_is_none(vm, -1));
  150. printf("\ntesting error catching\n");
  151. error(pkpy_vm_run(vm, "let's make sure syntax errors get caught"));
  152. check(pkpy_stack_size(vm) == 0); //stack should be cleared after error is resolved
  153. printf("\ntesting calls\n");
  154. check(pkpy_vm_run(vm, "def x(x, y) : return x - y"));
  155. check(pkpy_vm_run(vm, "def vararg_x(*x) : return sum(x)"));
  156. check(pkpy_vm_run(vm, "def keyword_x(x=1, y=1) : return x+y"));
  157. check(pkpy_vm_run(vm, "def retmany_x() : return 1, 2, 3"));
  158. check(pkpy_get_global(vm, "x"));
  159. check(pkpy_push_int(vm, 2));
  160. check(pkpy_push_int(vm, 3));
  161. check(pkpy_call(vm, 2));
  162. check(pkpy_to_int(vm, -1, &r_int));
  163. printf("x : %i\n", r_int);
  164. check(pkpy_get_global(vm, "vararg_x"));
  165. check(pkpy_push_int(vm, 1));
  166. check(pkpy_push_int(vm, 2));
  167. check(pkpy_push_int(vm, 3));
  168. check(pkpy_push_int(vm, 4));
  169. check(pkpy_push_int(vm, 5));
  170. check(pkpy_push_int(vm, 6));
  171. check(pkpy_call(vm, 6));
  172. check(pkpy_to_int(vm, -1, &r_int));
  173. printf("vararg_x : %i\n", r_int);
  174. check(pkpy_get_global(vm, "keyword_x"));
  175. check(pkpy_push_int(vm, 3));
  176. check(pkpy_call(vm, 1));
  177. check(pkpy_to_int(vm, -1, &r_int));
  178. printf("keyword_x : %i\n", r_int);
  179. check(pkpy_get_global(vm, "keyword_x"));
  180. check(pkpy_call(vm, 0));
  181. check(pkpy_to_int(vm, -1, &r_int));
  182. printf("keyword_x : %i\n", r_int);
  183. check(pkpy_stack_size(vm) == 4);
  184. check(pkpy_get_global(vm, "retmany_x"));
  185. check(pkpy_call(vm, 0));
  186. check(pkpy_stack_size(vm) == 7);
  187. check(pkpy_to_int(vm, -3, &r_int));
  188. printf("retmany_x : %i\n", r_int);
  189. check(pkpy_to_int(vm, -2, &r_int));
  190. printf("retmany_x : %i\n", r_int);
  191. check(pkpy_to_int(vm, -1, &r_int));
  192. printf("retmany_x : %i\n", r_int);
  193. check(pkpy_get_global(vm, "x"));
  194. error(pkpy_call(vm, 0));
  195. check(pkpy_vm_run(vm, "l = []"));
  196. check(pkpy_get_global(vm, "l"));
  197. check(pkpy_push_string(vm, "hello"));
  198. check(pkpy_call_method(vm, "append", 1));
  199. check(pkpy_vm_run(vm, "print(l)"));
  200. printf("\ntesting pushing functions\n");
  201. check(pkpy_push_function(vm, test_binding));
  202. check(pkpy_set_global(vm, "test_binding"));
  203. check(pkpy_vm_run(vm, "print(test_binding())"));
  204. check(pkpy_push_function(vm, test_multiple_return));
  205. check(pkpy_set_global(vm, "test_multiple_return"));
  206. //uncomment if _exec changes
  207. //check(pkpy_vm_run(vm, "test_multiple_return()"));
  208. //check(pkpy_stack_size(vm) == 2);
  209. check(pkpy_push_function(vm, test_error_propagate));
  210. check(pkpy_set_global(vm, "test_error_propagate"));
  211. error(pkpy_vm_run(vm, "test_error_propagate()"));
  212. check(pkpy_get_global(vm, "test_multiple_return"));
  213. check(pkpy_call(vm, 0));
  214. check(pkpy_stack_size(vm) == 2);
  215. check(pkpy_pop(vm, 2));
  216. check(pkpy_stack_size(vm) == 0);
  217. return 0;
  218. }