72 lines
2.0 KiB
C++
72 lines
2.0 KiB
C++
#include "test_assert.h"
|
|
|
|
#include <assert.h>
|
|
|
|
#ifdef _MSC_VER
|
|
# include <crtdbg.h>
|
|
# include <windows.h>
|
|
#endif
|
|
|
|
int testing_fails = 0;
|
|
static TestFailEventListener fail_listener_ = nullptr;
|
|
|
|
void TestFail(const char *expval, const char *val, const char *exp,
|
|
const char *file, int line, const char *func) {
|
|
TEST_OUTPUT_LINE("EXPECTED: \"%s\"", expval);
|
|
TEST_OUTPUT_LINE("VALUE: \"%s\"", val);
|
|
TEST_OUTPUT_LINE("TEST FAILED: %s:%d, %s in %s", file, line, exp,
|
|
func ? func : "");
|
|
testing_fails++;
|
|
|
|
// Notify, emulate 'gtest::OnTestPartResult' event handler.
|
|
if (fail_listener_) (*fail_listener_)(expval, val, exp, file, line, func);
|
|
|
|
assert(0); // ignored in Release if NDEBUG defined
|
|
}
|
|
|
|
void TestEqStr(const char *expval, const char *val, const char *exp,
|
|
const char *file, int line, const char *func) {
|
|
if (strcmp(expval, val) != 0) {
|
|
TestFail(expval, val, exp, file, line, func);
|
|
}
|
|
}
|
|
|
|
#if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING) && defined(_MSC_VER) && \
|
|
defined(_DEBUG)
|
|
# define FLATBUFFERS_MEMORY_LEAK_TRACKING_MSVC
|
|
#endif
|
|
|
|
void InitTestEngine(TestFailEventListener listener) {
|
|
testing_fails = 0;
|
|
// Disable stdout buffering to prevent information lost on assertion or core
|
|
// dump.
|
|
setvbuf(stdout, NULL, _IONBF, 0);
|
|
setvbuf(stderr, NULL, _IONBF, 0);
|
|
|
|
flatbuffers::SetupDefaultCRTReportMode();
|
|
|
|
// clang-format off
|
|
|
|
#if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING_MSVC)
|
|
// For more thorough checking:
|
|
// _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF
|
|
auto flags = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
|
|
_CrtSetDbgFlag(flags | _CRTDBG_ALLOC_MEM_DF);
|
|
#endif
|
|
// clang-format on
|
|
|
|
fail_listener_ = listener;
|
|
}
|
|
|
|
int CloseTestEngine(bool force_report) {
|
|
if (!testing_fails || force_report) {
|
|
#if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING_MSVC)
|
|
auto flags = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
|
|
flags &= ~_CRTDBG_DELAY_FREE_MEM_DF;
|
|
flags |= _CRTDBG_LEAK_CHECK_DF;
|
|
_CrtSetDbgFlag(flags);
|
|
#endif
|
|
}
|
|
return (0 != testing_fails);
|
|
}
|