#include #include #include #include #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 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(); }