// 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"); }