72 lines
3 KiB
C++
72 lines
3 KiB
C++
// TurretTable (positional rows) and IdRegistry (manifests).
|
|
#include "game/data/turrets.h"
|
|
#include "test_main.h"
|
|
|
|
using namespace game::data;
|
|
|
|
TEST(turret_table_rows) {
|
|
auto r = parse_turret_table(
|
|
"// size weapon-size class health track-speed az% inc% \"model\"\n"
|
|
"\n"
|
|
"small\ttiny\tstandard 20 360 1.00 1.00 \"turret_pd.x\"\n"
|
|
"large medium Missile 950 100 1.00 0.25 \"turret_l2missile.x\"\n"
|
|
"large large beam 1500 80 1.00 1.00 \"\"\n"
|
|
"large large spinal 800 // too short\n",
|
|
"_turrets.txt");
|
|
CHECK(r.ok());
|
|
CHECK_EQ(r.value->size(), std::size_t{3});
|
|
CHECK_EQ(r.problems.size(), std::size_t{1});
|
|
CHECK(r.problems[0].kind == Problem::Kind::Unparsed);
|
|
CHECK_EQ(r.problems[0].line, 6);
|
|
const TurretRow& pd = r.value->rows()[0];
|
|
CHECK_EQ(pd.mount_size, "small");
|
|
CHECK_EQ(pd.weapon_size, "tiny");
|
|
CHECK(pd.health && *pd.health == 20);
|
|
CHECK(pd.track_speed && *pd.track_speed == 360);
|
|
CHECK_EQ(pd.model, "turret_pd.x");
|
|
CHECK_EQ(r.value->rows()[2].model, "");
|
|
CHECK(r.value->rows()[1].inclination_scale && *r.value->rows()[1].inclination_scale == 0.25);
|
|
}
|
|
|
|
TEST(turret_table_lookup_is_case_insensitive) {
|
|
auto r = parse_turret_table(
|
|
"small small standard 120 320 1 1 \"a.x\"\n"
|
|
"large medium Missile 950 100 1 0.25 \"b.x\"\n");
|
|
const TurretTable& t = *r.value;
|
|
CHECK(t.find("Small", "SMALL", "Standard") != nullptr);
|
|
CHECK(t.find("large", "medium", "missile") != nullptr);
|
|
CHECK(t.find("large", "large", "missile") == nullptr);
|
|
CHECK(t.has_weapon_pair("medium", "MISSILE"));
|
|
CHECK(!t.has_weapon_pair("tiny", "standard"));
|
|
CHECK(t.has_bank_pair("LARGE", "missile"));
|
|
CHECK(!t.has_bank_pair("medium", "missile"));
|
|
CHECK_EQ(t.rows_for_bank("large", "missile").size(), std::size_t{1});
|
|
}
|
|
|
|
TEST(id_registry_from_manifest) {
|
|
auto r = parse_id_registry(
|
|
"// Only add to this list\n"
|
|
"1 can_am.weapon\n"
|
|
"8 bal_gauss.weapon\n"
|
|
"// DELETED - 36\n"
|
|
"98 DEWar.SHIPSECTION\n"
|
|
"8 dup.weapon\n",
|
|
"_weapons.txt");
|
|
CHECK(r.ok());
|
|
const IdRegistry& reg = *r.value;
|
|
CHECK_EQ(reg.size(), std::size_t{4});
|
|
CHECK_EQ(reg.deleted().size(), std::size_t{1});
|
|
CHECK(reg.is_deleted(36));
|
|
CHECK(!reg.is_deleted(8));
|
|
CHECK(reg.id_of("bal_gauss.weapon") && *reg.id_of("bal_gauss.weapon") == 8);
|
|
CHECK(reg.id_of("BAL_GAUSS") && *reg.id_of("BAL_GAUSS") == 8); // stem, any case
|
|
CHECK(reg.id_of("dewar.shipsection") && *reg.id_of("dewar.shipsection") == 98);
|
|
CHECK(reg.id_of("dewar") && *reg.id_of("dewar") == 98);
|
|
CHECK(!reg.id_of("missing"));
|
|
CHECK(reg.find(98) && reg.find(98)->stem == "DEWar");
|
|
CHECK(reg.find(8) && reg.find(8)->name == "dup.weapon"); // later assignment wins
|
|
CHECK(reg.find(7) == nullptr);
|
|
CHECK_EQ(r.problems.size(), std::size_t{1});
|
|
CHECK(r.problems[0].kind == Problem::Kind::Duplicate);
|
|
CHECK_EQ(r.problems[0].key, "8");
|
|
}
|