assertion-macros.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. //
  2. // assertion-macros.h
  3. //
  4. // Copyright (c) 2014 Stephen Mathieson
  5. // MIT licensed
  6. //
  7. #ifndef ASSERTION_MACROS_H
  8. #define ASSERTION_MACROS_H 1
  9. #define ASSERTIONS_VERSION "0.2.0"
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. static int __assert_bail = 0;
  14. static int __assert_failures = 0;
  15. /*
  16. * Bail at first failing assertion
  17. */
  18. #define assert_bail() __assert_bail = !__assert_bail;
  19. /*
  20. * Get the number of failed assertions
  21. */
  22. #define assert_failures() __assert_failures
  23. /*
  24. * Reset the number of failed assertions
  25. */
  26. #define assert_reset() ({ \
  27. __assert_failures = 0; \
  28. })
  29. // don't clobber assert
  30. #ifndef assert
  31. # define assert assert_ok
  32. #endif
  33. /*
  34. * Assert that `expr` evaluates to something truthy
  35. */
  36. #define assert_ok(expr) ({ \
  37. if (!(expr)) {\
  38. __assert_failures++; \
  39. fprintf(stderr, \
  40. "Assertion error: %s (%s:%d)\n", \
  41. #expr, __FILE__, __LINE__); \
  42. if (__assert_bail) abort(); \
  43. } \
  44. })
  45. /*
  46. * Assert that `expr` is NULL
  47. */
  48. #define assert_null(expr) ({ \
  49. if ((expr) != NULL) {\
  50. __assert_failures++; \
  51. fprintf(stderr, \
  52. "Assertion error: %s is NULL (%s:%d)\n", \
  53. #expr, __FILE__, __LINE__); \
  54. if (__assert_bail) abort(); \
  55. } \
  56. })
  57. /*
  58. * Assert that `expr` is not NULL
  59. */
  60. #define assert_not_null(expr) ({ \
  61. if ((expr) == NULL) {\
  62. __assert_failures++; \
  63. fprintf(stderr, \
  64. "Assertion error: %s is not NULL (%s:%d)\n", \
  65. #expr, __FILE__, __LINE__); \
  66. if (__assert_bail) abort(); \
  67. } \
  68. })
  69. /*
  70. * Assert that `a` is equal to `b`
  71. */
  72. #define assert_equal(a, b) ({ \
  73. if (a != b) {\
  74. __assert_failures++; \
  75. fprintf(stderr, \
  76. "Assertion error: %d == %d (%s:%d)\n", \
  77. a, b, __FILE__, __LINE__); \
  78. if (__assert_bail) abort(); \
  79. } \
  80. })
  81. /*
  82. * Assert that `a` is not equal to `b`
  83. */
  84. #define assert_not_equal(a, b) ({ \
  85. if (a == b) {\
  86. __assert_failures++; \
  87. fprintf(stderr, \
  88. "Assertion error: %d != %d (%s:%d)\n", \
  89. a, b, __FILE__, __LINE__); \
  90. if (__assert_bail) abort(); \
  91. } \
  92. })
  93. /*
  94. * Assert that `a` is equal to `b`
  95. */
  96. #define assert_str_equal(a, b) ({ \
  97. if (0 != strcmp(a, b)) {\
  98. __assert_failures++; \
  99. fprintf(stderr, \
  100. "Assertion error: \"%s\" == \"%s\" (%s:%d)\n", \
  101. a, b, __FILE__, __LINE__); \
  102. if (__assert_bail) abort(); \
  103. } \
  104. })
  105. /*
  106. * Assert that `a` is not equal to `b`
  107. */
  108. #define assert_str_not_equal(a, b) ({ \
  109. if (0 == strcmp(a, b)) {\
  110. __assert_failures++; \
  111. fprintf(stderr, \
  112. "Assertion error: \"%s\" != \"%s\" (%s:%d)\n", \
  113. a, b, __FILE__, __LINE__); \
  114. if (__assert_bail) abort(); \
  115. } \
  116. })
  117. #endif