You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

103 lines
3.2 KiB

#include <gtest/gtest.h>
#include <iostream>
#include <string>
#include <unordered_map>
#include "headless_mode.hpp"
#include "options.h"
#include "utils/paths.h"
namespace {
// Custom listener to track and report skipped tests with reasons
class SkippedTestListener : public testing::EmptyTestEventListener {
std::unordered_map<std::string, int> skipReasons;
int totalSkipped = 0;
void OnTestPartResult(const testing::TestPartResult &test_part_result) override
{
if (test_part_result.skipped()) {
totalSkipped++;
std::string reason = test_part_result.message();
if (reason.empty()) {
reason = "No reason provided";
}
skipReasons[reason]++;
}
}
void OnTestProgramEnd(const testing::UnitTest & /*unit_test*/) override
{
if (totalSkipped > 0) {
std::cout << "\n";
std::cout << "========================================\n";
std::cout << "Test Skip Summary\n";
std::cout << "========================================\n";
std::cout << "Total tests skipped: " << totalSkipped << "\n\n";
// Show skip reasons, with most specific reasons first
bool hasMpqReason = false;
bool hasNoReason = false;
int mpqSkipCount = 0;
int noReasonCount = 0;
for (const auto &[reason, count] : skipReasons) {
if (reason.find("MPQ assets") != std::string::npos) {
hasMpqReason = true;
mpqSkipCount += count;
continue;
}
if (reason == "No reason provided") {
hasNoReason = true;
noReasonCount += count;
continue;
}
std::cout << "" << count << " test" << (count > 1 ? "s" : "") << " skipped: " << reason << "\n";
}
// Combine MPQ-related skips for clearer output
if (hasMpqReason) {
int totalMpqRelated = mpqSkipCount + (hasNoReason ? noReasonCount : 0);
std::cout << "" << totalMpqRelated << " test" << (totalMpqRelated > 1 ? "s" : "")
<< " skipped: MPQ assets (spawn.mpq or DIABDAT.MPQ) not found\n";
if (hasNoReason && noReasonCount > 0) {
std::cout << " (" << noReasonCount << " test" << (noReasonCount > 1 ? "s" : "")
<< " automatically skipped due to test suite setup failure)\n";
}
} else if (hasNoReason) {
// Only "No reason provided" - show it as-is
std::cout << "" << noReasonCount << " test" << (noReasonCount > 1 ? "s" : "")
<< " skipped: " << "No reason provided" << "\n";
}
std::cout << "========================================\n";
}
}
};
} // namespace
int main(int argc, char **argv)
{
// Disable error dialogs.
devilution::HeadlessMode = true;
#if SDL_VERSION_ATLEAST(2, 0, 0)
// Disable hardware cursor while testing.
devilution::GetOptions().Graphics.hardwareCursor.SetValue(false);
#endif
#ifdef __APPLE__
devilution::paths::SetAssetsPath(
devilution::paths::BasePath() + "devilutionx.app/Contents/Resources/");
#endif
testing::InitGoogleTest(&argc, argv);
// Add custom listener to track and report skipped tests
testing::TestEventListeners &listeners = testing::UnitTest::GetInstance()->listeners();
listeners.Append(new SkippedTestListener());
return RUN_ALL_TESTS();
}