assert.h 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #pragma once
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #define ASSERT(expression) ASSERT_MSG(expression, "%s", "")
  6. #define ASSERT_OK(r) ASSERT_MSG(r >= 0, "%s", reproc_strerror(r))
  7. #define ASSERT_EQ_MEM(left, right, size) \
  8. ASSERT_MSG(memcmp(left, right, size) == 0, "\"%.*s\" == \"%.*s\"", \
  9. (int) size, left, (int) size, right)
  10. #define ASSERT_EQ_STR(left, right) \
  11. ASSERT_MSG(strcmp(left, right) == 0, "%s == %s", left, right)
  12. #define ASSERT_GE_SIZE(left, right) \
  13. ASSERT_MSG(left >= right, "%zu >= %zu", left, right)
  14. #define ASSERT_EQ_SIZE(left, right) \
  15. ASSERT_MSG(left == right, "%zu == %zu", left, right)
  16. #define ASSERT_EQ_INT(left, right) \
  17. ASSERT_MSG(left == right, "%i == %i", left, right)
  18. #ifdef _WIN32
  19. #define ABORT() exit(EXIT_FAILURE)
  20. #else
  21. // Use `abort` so we get a coredump.
  22. #define ABORT() abort()
  23. #endif
  24. #define ASSERT_MSG(expression, format, ...) \
  25. do { \
  26. if (!(expression)) { \
  27. fprintf(stderr, "%s:%u: Assertion '%s' (" format ") failed", __FILE__, \
  28. __LINE__, #expression, __VA_ARGS__); \
  29. \
  30. fflush(stderr); \
  31. \
  32. ABORT(); \
  33. } \
  34. } while (0)