diff --git a/src/kernel/unit.c b/src/kernel/unit.c index 6decd4a8b..22f138ead 100644 --- a/src/kernel/unit.c +++ b/src/kernel/unit.c @@ -1850,7 +1850,12 @@ static int nextbuf = 0; char *write_unitname(const unit * u, char *buffer, size_t size) { - slprintf(buffer, size, "%s (%s)", (const char *)u->name, itoa36(u->no)); + if (u->name) { + slprintf(buffer, size, "%s (%s)", u->name, itoa36(u->no)); + } else { + const char * name = rc_name(u->_race, u->number == 1 ? NAME_SINGULAR : NAME_PLURAL); + slprintf(buffer, size, "%s (%s)", locale_string(u->faction->locale, name), itoa36(u->no)); + } buffer[size - 1] = 0; return buffer; } diff --git a/src/kernel/unit.test.c b/src/kernel/unit.test.c index 12a83d3ad..04996aafd 100644 --- a/src/kernel/unit.test.c +++ b/src/kernel/unit.test.c @@ -1,5 +1,7 @@ #include #include +#include +#include #include "alchemy.h" #include "faction.h" #include "unit.h" @@ -10,7 +12,9 @@ #include #include +#include #include +#include #include static void test_remove_empty_units(CuTest *tc) { @@ -123,10 +127,48 @@ static void test_scale_number(CuTest *tc) { test_cleanup(); } +static void test_unit_name(CuTest *tc) { + unit *u; + char name[32]; + + test_cleanup(); + test_create_world(); + u = test_create_unit(test_create_faction(test_create_race("human")), findregion(0, 0)); + unit_setname(u, "Hodor"); + _snprintf(name, sizeof(name), "Hodor (%s)", itoa36(u->no)); + CuAssertStrEquals(tc, name, unitname(u)); + test_cleanup(); +} + +static void test_unit_name_from_race(CuTest *tc) { + unit *u; + char name[32]; + struct locale *lang; + + test_cleanup(); + test_create_world(); + u = test_create_unit(test_create_faction(test_create_race("human")), findregion(0, 0)); + unit_setname(u, NULL); + lang = get_or_create_locale("de"); + locale_setstring(lang, rc_name(u->_race, NAME_SINGULAR), "Mensch"); + locale_setstring(lang, rc_name(u->_race, NAME_PLURAL), "Menschen"); + + _snprintf(name, sizeof(name), "Mensch (%s)", itoa36(u->no)); + CuAssertStrEquals(tc, name, unitname(u)); + + u->number = 2; + _snprintf(name, sizeof(name), "Menschen (%s)", itoa36(u->no)); + CuAssertStrEquals(tc, name, unitname(u)); + + test_cleanup(); +} + CuSuite *get_unit_suite(void) { CuSuite *suite = CuSuiteNew(); SUITE_ADD_TEST(suite, test_scale_number); + SUITE_ADD_TEST(suite, test_unit_name); + SUITE_ADD_TEST(suite, test_unit_name_from_race); SUITE_ADD_TEST(suite, test_remove_empty_units); SUITE_ADD_TEST(suite, test_remove_units_ignores_spells); SUITE_ADD_TEST(suite, test_remove_units_without_faction);