Files
email-tracker/external/duckdb/test/unittest.cpp
2025-10-24 19:21:19 -05:00

82 lines
2.6 KiB
C++

#define CATCH_CONFIG_RUNNER
#include "catch.hpp"
#include "duckdb/common/file_system.hpp"
#include "duckdb/common/string_util.hpp"
#include "sqlite/sqllogic_test_logger.hpp"
#include "test_helpers.hpp"
#include "test_config.hpp"
using namespace duckdb;
int main(int argc_in, char *argv[]) {
duckdb::unique_ptr<FileSystem> fs = FileSystem::CreateLocal();
string test_directory = DUCKDB_ROOT_DIRECTORY;
auto &test_config = TestConfiguration::Get();
test_config.Initialize();
idx_t argc = NumericCast<idx_t>(argc_in);
int new_argc = 0;
auto new_argv = duckdb::unique_ptr<char *[]>(new char *[argc]);
for (idx_t i = 0; i < argc; i++) {
string argument(argv[i]);
if (argument == "--test-dir") {
test_directory = string(argv[++i]);
} else if (argument == "--test-temp-dir") {
SetDeleteTestPath(false);
auto test_dir = string(argv[++i]);
if (fs->DirectoryExists(test_dir)) {
fprintf(stderr, "--test-temp-dir cannot point to a directory that already exists (%s)\n",
test_dir.c_str());
return 1;
}
SetTestDirectory(test_dir);
} else if (argument == "--require") {
AddRequire(string(argv[++i]));
} else if (!test_config.ParseArgument(argument, argc, argv, i)) {
new_argv[new_argc] = argv[i];
new_argc++;
}
}
TestChangeDirectory(test_directory);
// delete the testing directory if it exists
auto dir = TestCreatePath("");
try {
TestDeleteDirectory(dir);
// create the empty testing directory
TestCreateDirectory(dir);
} catch (std::exception &ex) {
fprintf(stderr, "Failed to create testing directory \"%s\": %s\n", dir.c_str(), ex.what());
return 1;
}
if (test_config.GetSkipCompiledTests()) {
Catch::getMutableRegistryHub().clearTests();
}
RegisterSqllogictests();
int result = Catch::Session().run(new_argc, new_argv.get());
std::string failures_summary = FailureSummary::GetFailureSummary();
if (!failures_summary.empty()) {
auto description = test_config.GetDescription();
if (!description.empty()) {
std::cerr << "\n====================================================" << std::endl;
std::cerr << "==================== TEST INFO ===================" << std::endl;
std::cerr << "====================================================\n" << std::endl;
std::cerr << description << std::endl;
}
std::cerr << "\n====================================================" << std::endl;
std::cerr << "================ FAILURES SUMMARY ================" << std::endl;
std::cerr << "====================================================\n" << std::endl;
std::cerr << failures_summary;
}
if (DeleteTestPath()) {
TestDeleteDirectory(dir);
}
return result;
}