diff --git a/build-appveyor.ps1 b/build-appveyor.ps1 index dbf184d1..9e2dcdb9 100644 --- a/build-appveyor.ps1 +++ b/build-appveyor.ps1 @@ -46,6 +46,13 @@ if ( $? -eq $false ) { throw "testqbsp failed" } +# run hidden tests (releaseonly) +.\qbsp\Release\testqbsp.exe [.] + +if ( $? -eq $false ) { + throw "testqbsp [.] failed" +} + .\vis\Release\testvis.exe --allow-running-no-tests if ( $? -eq $false ) { diff --git a/build-linux-64.sh b/build-linux-64.sh index 922b00cb..dd0eab08 100755 --- a/build-linux-64.sh +++ b/build-linux-64.sh @@ -40,6 +40,7 @@ cpack || exit 1 ./common/testcommon || exit 1 ./light/testlight || exit 1 ./qbsp/testqbsp || exit 1 +./qbsp/testqbsp [.] || exit 1 # run hidden tests (releaseonly) ./vis/testvis --allow-running-no-tests || exit 1 # check rpath diff --git a/build-osx.sh b/build-osx.sh index 69bebc0a..3cd474bb 100755 --- a/build-osx.sh +++ b/build-osx.sh @@ -54,4 +54,5 @@ otool -L ./bsputil/bsputil ./common/testcommon || exit 1 ./light/testlight || exit 1 ./qbsp/testqbsp || exit 1 +./qbsp/testqbsp [.] || exit 1 # run hidden tests (releaseonly) ./vis/testvis --allow-running-no-tests || exit 1 diff --git a/qbsp/test_qbsp.cc b/qbsp/test_qbsp.cc index cee750f8..5e729b45 100644 --- a/qbsp/test_qbsp.cc +++ b/qbsp/test_qbsp.cc @@ -58,7 +58,7 @@ static std::tuple> LoadTestmapRe } auto testmap_path = std::filesystem::path(testmaps_dir) / name; - auto map_in_game_path = fs::path(destdir) / name; + auto map_in_game_path = fs::path(destdir) / name.filename(); fs::copy(testmap_path, map_in_game_path, fs::copy_options::overwrite_existing); std::string map_string = map_in_game_path.generic_string(); @@ -169,7 +169,7 @@ static std::tuple> LoadTestmap(c auto bsp_path = map_path; bsp_path.replace_extension(".bsp"); - std::vector args{"", "-nopercent"}; + std::vector args{""}; // first arg is the exe path, which we're ignoring in this case for (auto &arg : extra_args) { args.push_back(arg); } @@ -192,7 +192,7 @@ static std::tuple> LoadTestmap(c // copy .bsp to game's basedir/maps directory, for easy in-game testing if (strlen(destdir) > 0) { - auto dest = fs::path(destdir) / name; + auto dest = fs::path(destdir) / name.filename(); dest.replace_extension(".bsp"); fs::copy(options.bsp_path, dest, fs::copy_options::overwrite_existing); } @@ -239,6 +239,30 @@ static std::tuple> LoadTestmapQ1 #endif } +static void CheckFilled(const mbsp_t &bsp, int hullnum) +{ + int32_t contents = BSP_FindContentsAtPoint(&bsp, hullnum, &bsp.dmodels[0], qvec3d{8192, 8192, 8192}); + + if (bsp.loadversion->game->id == GAME_QUAKE_II) { + CHECK(contents == Q2_CONTENTS_SOLID); + } else { + CHECK(contents == CONTENTS_SOLID); + } +} + + +static void CheckFilled(const mbsp_t &bsp) +{ + if (bsp.loadversion->game->id == GAME_QUAKE_II) { + CheckFilled(bsp, 0); + } else { + auto hullsizes = bsp.loadversion->game->get_hull_sizes(); + for (int i = 0; i < hullsizes.size(); ++i) { + CheckFilled(bsp, i); + } + } +} + static mbsp_t LoadBsp(const std::filesystem::path &path_in) { std::filesystem::path path = path_in; @@ -1275,12 +1299,14 @@ TEST_CASE("nodraw_detail_light", "[testmaps_q2]") { CHECK(texinfo->flags.native == (Q2_SURF_LIGHT | Q2_SURF_NODRAW)); } -TEST_CASE("base1", "[testmaps_q2]") +TEST_CASE("base1", "[testmaps_q2][.releaseonly][!mayfail]") { -#if 0 const auto [bsp, bspx, prt] = LoadTestmapQ2("base1.map"); CHECK(GAME_QUAKE_II == bsp.loadversion->game->id); + CHECK(prt); + CheckFilled(bsp); + // bspinfo output from a compile done with // https://github.com/qbism/q2tools-220 at 46fd97bbe1b3657ca9e93227f89aaf0fbd3677c9. @@ -1304,7 +1330,29 @@ TEST_CASE("base1", "[testmaps_q2]") // lightdata 0 // visdata 0 // entdata 53623 -#endif +} + +TEST_CASE("quake maps", "[testmaps_q1][.releaseonly][!mayfail]") +{ + std::vector quake_maps{"DM1.map"}; + // fixme-brushbsp: enable the rest of these +/* + "DM2.map", "DM3.map", "DM4.map", "DM5.map", "DM6.map", "DM7.map", + "E1M1.map", "E1M2.map", "E1M3.map", "E1M4.map", "E1M5.map", "E1M6.map", "E1M7.map", "E1M8.map", "E2M1.map", + "E2M2.map", "E2M3.map", "E2M4.map", "E2M5.map", "E2M6.map", "E2M7.map", "E3M1.map", "E3M2.map", "E3M3.map", + "E3M4.map", "E3M5.map", "E3M6.map", "E3M7.map", "E4M1.map", "E4M2.map", "E4M3.map", "E4M4.map", "E4M5.map", + "E4M6.map", "E4M7.map", "E4M8.map", "END.map"}; +*/ + + for (const auto& map : quake_maps) { + DYNAMIC_SECTION("testing " << map) { + const auto [bsp, bspx, prt] = LoadTestmapQ1("quake_map_source/" + map); + + CHECK(GAME_QUAKE == bsp.loadversion->game->id); + CHECK(prt); + CheckFilled(bsp); + } + } } TEST_CASE("base1leak", "[testmaps_q2]")