Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 
 

260 lignes
8.7 KiB

  1. #define console_normal "\x1B[0m"
  2. #define console_red "\x1B[31m"
  3. #define console_green "\x1B[32m"
  4. #define epsilon 2.2204460492503131E-16
  5. #define testresult int
  6. #define pass 1
  7. #define fail 0
  8. #define print_assert_equal_fail(variable, value, type, format) \
  9. printf("\n\tAssertion failed for '" #variable "'" \
  10. "\n\t in %s:%d" \
  11. "\n\texpected: " format \
  12. "\n\tgot: " format "\n", \
  13. __FILE__, __LINE__, (type)value, (type)variable)
  14. #define print_assert_not_equal_fail(variable, value, type, format) \
  15. printf("\n\tAssertion failed for '" #variable "'" \
  16. "\n\t in %s:%d" \
  17. "\n\texpected not: " format \
  18. "\n\tgot anyways: " format "\n", \
  19. __FILE__, __LINE__, (type)value, (type)variable)
  20. #define assert_no_error(error) \
  21. if (error) { \
  22. print_assert_not_equal_fail(error, 0, int, "%d"); \
  23. printf("\t%s%s%s\n", console_red, error->message,console_normal); \
  24. return fail; \
  25. } \
  26. #define assert_equal_int(variable, value) \
  27. if (variable != value) { \
  28. print_assert_equal_fail(variable, value, int, "%d"); \
  29. return fail; \
  30. }
  31. #define assert_not_equal_int(variable, value) \
  32. if (variable == value) { \
  33. print_assert_not_equal_fail(variable, value, int, "%d"); \
  34. return fail; \
  35. }
  36. #define assert_equal_double(variable, value) \
  37. if (fabs((double)variable - (double)value) > epsilon) { \
  38. print_assert_equal_fail(variable, value, double, "%f"); \
  39. return fail; \
  40. }
  41. #define assert_not_equal_double(variable, value) \
  42. if (fabs((double)variable - (double)value) <= epsilon) { \
  43. print_assert_not_equal_fail(variable, value, double, "%f"); \
  44. return fail; \
  45. }
  46. #define assert_null(variable) \
  47. assert_equal_int(variable, NULL)
  48. #define assert_not_null(variable) \
  49. assert_not_equal_int(variable, NULL)
  50. #define invoke_test(name) \
  51. printf("" #name ":"); \
  52. for(int i = 0; i < 45 - strlen(#name); ++i) \
  53. printf(" "); \
  54. if (name() == pass) \
  55. printf("%spassed%s\n", console_green, console_normal); \
  56. else { \
  57. printf("%sfailed%s\n", console_red, console_normal); \
  58. if(error) { \
  59. log_error("Error while running test" #name); \
  60. free(error); \
  61. error = NULL; \
  62. } \
  63. } \
  64. testresult test_built_in_add() {
  65. Ast_Node* plus = create_ast_node_symbol("+");
  66. Ast_Node* ten = create_ast_node_number(10);
  67. Ast_Node* four = create_ast_node_number(4);
  68. Ast_Node* nil = create_ast_node_nil();
  69. Ast_Node* form = create_ast_node_pair(
  70. plus,
  71. create_ast_node_pair(
  72. ten,
  73. create_ast_node_pair(
  74. four,
  75. nil)));
  76. Ast_Node* result = eval_expr(form, new(Environment));
  77. assert_no_error(error);
  78. assert_not_null(result);
  79. assert_equal_int(result->type, Ast_Node_Type_Number);
  80. assert_equal_double(result->value.number->value, 14);
  81. return pass;
  82. }
  83. testresult test_built_in_substract() {
  84. Ast_Node* minus = create_ast_node_symbol("-");
  85. Ast_Node* ten = create_ast_node_number(10);
  86. Ast_Node* four = create_ast_node_number(4);
  87. Ast_Node* nil = create_ast_node_nil();
  88. Ast_Node* form = create_ast_node_pair(
  89. minus,
  90. create_ast_node_pair(
  91. ten,
  92. create_ast_node_pair(
  93. four,
  94. nil)));
  95. Ast_Node* result = eval_expr(form, new(Environment));
  96. assert_no_error(error);
  97. assert_not_null(result);
  98. assert_equal_int(result->type, Ast_Node_Type_Number);
  99. assert_equal_double(result->value.number->value, 6);
  100. return pass;
  101. }
  102. testresult test_built_in_multiply() {
  103. Ast_Node* times = create_ast_node_symbol("*");
  104. Ast_Node* ten = create_ast_node_number(10);
  105. Ast_Node* four = create_ast_node_number(4);
  106. Ast_Node* nil = create_ast_node_nil();
  107. Ast_Node* form = create_ast_node_pair(
  108. times,
  109. create_ast_node_pair(
  110. ten,
  111. create_ast_node_pair(
  112. four,
  113. nil)));
  114. Ast_Node* result = eval_expr(form, new(Environment));
  115. assert_no_error(error);
  116. assert_not_null(result);
  117. assert_equal_int(result->type, Ast_Node_Type_Number);
  118. assert_equal_double(result->value.number->value, 40);
  119. return pass;
  120. }
  121. testresult test_built_in_divide() {
  122. Ast_Node* over = create_ast_node_symbol("/");
  123. Ast_Node* ten = create_ast_node_number(20);
  124. Ast_Node* four = create_ast_node_number(4);
  125. Ast_Node* nil = create_ast_node_nil();
  126. Ast_Node* form = create_ast_node_pair(
  127. over,
  128. create_ast_node_pair(
  129. ten,
  130. create_ast_node_pair(
  131. four,
  132. nil)));
  133. Ast_Node* result = eval_expr(form, new(Environment));
  134. assert_null(error);
  135. assert_not_null(result);
  136. assert_equal_int(result->type, Ast_Node_Type_Number);
  137. assert_equal_double(result->value.number->value, 5);
  138. return pass;
  139. }
  140. testresult test_built_in_if() {
  141. Ast_Node* _if = create_ast_node_symbol("if");
  142. Ast_Node* cond = create_ast_node_number(1);
  143. Ast_Node* four = create_ast_node_number(4);
  144. Ast_Node* five = create_ast_node_number(5);
  145. Ast_Node* nil = create_ast_node_nil();
  146. Ast_Node* form = create_ast_node_pair(
  147. _if,
  148. create_ast_node_pair(
  149. cond,
  150. create_ast_node_pair(
  151. four,
  152. create_ast_node_pair(
  153. five,
  154. nil))));
  155. Ast_Node* result;
  156. // test *then* case
  157. result = eval_expr(form, new(Environment));
  158. assert_no_error(error);
  159. assert_not_null(result);
  160. assert_equal_int(result->type, Ast_Node_Type_Number);
  161. assert_equal_double(result->value.number->value, 4);
  162. // test *else* case
  163. cond->value.number->value = 0;
  164. result = eval_expr(form, new(Environment));
  165. assert_null(error);
  166. assert_not_null(result);
  167. assert_equal_int(result->type, Ast_Node_Type_Number);
  168. assert_equal_double(result->value.number->value, 5);
  169. return pass;
  170. }
  171. testresult test_built_in_and() {
  172. Ast_Node* _and = create_ast_node_symbol("and");
  173. Ast_Node* cond1 = create_ast_node_number(1);
  174. Ast_Node* cond2 = create_ast_node_string("asd");
  175. Ast_Node* cond3 = create_ast_node_number(4);
  176. Ast_Node* nil = create_ast_node_nil();
  177. Ast_Node* form = create_ast_node_pair(
  178. _and,
  179. create_ast_node_pair(
  180. cond1,
  181. create_ast_node_pair(
  182. cond2,
  183. create_ast_node_pair(
  184. cond3,
  185. nil))));
  186. Ast_Node* result;
  187. // a true case
  188. result = eval_expr(form, new(Environment));
  189. assert_no_error(error);
  190. assert_not_null(result);
  191. assert_equal_int(result->type, Ast_Node_Type_Number);
  192. assert_equal_double(result->value.number->value, 1);
  193. // a false case
  194. cond1->value.number->value = 0;
  195. result = eval_expr(form, new(Environment));
  196. assert_no_error(error);
  197. assert_not_null(result);
  198. assert_equal_int(result->type, Ast_Node_Type_Number);
  199. assert_equal_double(result->value.number->value, 0);
  200. return pass;
  201. }
  202. void run_all_tests() {
  203. log_level = Log_Level_None;
  204. invoke_test(test_built_in_add);
  205. invoke_test(test_built_in_substract);
  206. invoke_test(test_built_in_multiply);
  207. invoke_test(test_built_in_divide);
  208. invoke_test(test_built_in_if);
  209. invoke_test(test_built_in_and);
  210. }