Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 
 

259 wiersze
8.8 KiB

  1. #define epsilon 2.2204460492503131E-16
  2. #define testresult int
  3. #define pass 1
  4. #define fail 0
  5. #define print_assert_equal_fail(variable, value, type, format) \
  6. printf("\nAssertion failed for '" #variable "'" \
  7. "\n\t in %s:%d" \
  8. "\n\texpected: " format \
  9. "\n\tgot: " format "\n", \
  10. __FILE__, __LINE__, (type)value, (type)variable)
  11. #define print_assert_not_equal_fail(variable, value, type, format) \
  12. printf("\nAssertion failed for '" #variable "'" \
  13. "\n\t in %s:%d" \
  14. "\n\texpected not: " format \
  15. "\n\tgot anyways: " format "\n", \
  16. __FILE__, __LINE__, (type)value, (type)variable)
  17. #define assert_no_error(error) \
  18. if (error) { \
  19. printf("\nExpected no error to occur," \
  20. " but an error occured anyways:\n"); \
  21. log_error(); \
  22. return fail; \
  23. } \
  24. #define assert_equal_int(variable, value) \
  25. if (variable != value) { \
  26. print_assert_equal_fail(variable, value, int, "%d"); \
  27. return fail; \
  28. }
  29. #define assert_not_equal_int(variable, value) \
  30. if (variable == value) { \
  31. print_assert_not_equal_fail(variable, value, int, "%d"); \
  32. return fail; \
  33. }
  34. #define assert_equal_double(variable, value) \
  35. if (fabs((double)variable - (double)value) > epsilon) { \
  36. print_assert_equal_fail(variable, value, double, "%f"); \
  37. return fail; \
  38. }
  39. #define assert_not_equal_double(variable, value) \
  40. if (fabs((double)variable - (double)value) <= epsilon) { \
  41. print_assert_not_equal_fail(variable, value, double, "%f"); \
  42. return fail; \
  43. }
  44. #define assert_null(variable) \
  45. assert_equal_int(variable, NULL)
  46. #define assert_not_null(variable) \
  47. assert_not_equal_int(variable, NULL)
  48. #define invoke_test(name) \
  49. printf("" #name ":"); \
  50. if (name() == pass) { \
  51. for(int i = strlen(#name); i < 70; ++i) \
  52. printf((i%3==1)? "." : " "); \
  53. printf("%spassed%s\n", console_green, console_normal); \
  54. } \
  55. else { \
  56. for(int i = -1; i < 70; ++i) \
  57. printf((i%3==1)? "." : " "); \
  58. printf("%sfailed%s\n", console_red, console_normal); \
  59. if(error) { \
  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. }