From badc82a0d2fa3f4e8d52248fdd7203d6feb7917c Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 27 Jan 2024 12:28:04 +0100 Subject: [PATCH 1/2] fix remove_skill removing the wrong skill https://bugs.eressea.de/view.php?id=3000 --- src/kernel/unit.c | 4 +++- src/kernel/unit.test.c | 26 +++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/kernel/unit.c b/src/kernel/unit.c index eca3408aa..d8057c900 100644 --- a/src/kernel/unit.c +++ b/src/kernel/unit.c @@ -938,7 +938,9 @@ void remove_skill(unit * u, enum skill_t sk) { ptrdiff_t len = arrlen(u->skills); if (len == 1) { - arrfree(u->skills); + if (u->skills->id == sk) { + arrfree(u->skills); + } } else if (len > 1) { ptrdiff_t s; diff --git a/src/kernel/unit.test.c b/src/kernel/unit.test.c index 2e7c567c2..96218aff4 100644 --- a/src/kernel/unit.test.c +++ b/src/kernel/unit.test.c @@ -429,6 +429,29 @@ static void test_skills(CuTest *tc) { test_teardown(); } +static void test_remove_skill(CuTest *tc) { + unit *u; + + test_setup(); + u = test_create_unit(test_create_faction(), test_create_plain(0, 0)); + set_level(u, SK_ALCHEMY, 1); + set_level(u, SK_CROSSBOW, 1); + remove_skill(u, SK_ALCHEMY); + CuAssertPtrNotNull(tc, u->skills); + CuAssertIntEquals(tc, 0, get_level(u, SK_ALCHEMY)); + CuAssertIntEquals(tc, 1, get_level(u, SK_CROSSBOW)); + remove_skill(u, SK_ALCHEMY); + CuAssertPtrNotNull(tc, u->skills); + CuAssertIntEquals(tc, 0, get_level(u, SK_ALCHEMY)); + CuAssertIntEquals(tc, 1, get_level(u, SK_CROSSBOW)); + remove_skill(u, SK_CROSSBOW); + CuAssertIntEquals(tc, 0, get_level(u, SK_ALCHEMY)); + CuAssertIntEquals(tc, 0, get_level(u, SK_CROSSBOW)); + CuAssertPtrEquals(tc, NULL, u->skills); + test_teardown(); +} + + static void test_limited_skills(CuTest *tc) { unit *u; @@ -1096,7 +1119,8 @@ CuSuite *get_unit_suite(void) SUITE_ADD_TEST(suite, test_skill_familiar); SUITE_ADD_TEST(suite, test_inside_building); SUITE_ADD_TEST(suite, test_skills); - SUITE_ADD_TEST(suite, test_limited_skills); + SUITE_ADD_TEST(suite, test_skills); + SUITE_ADD_TEST(suite, test_remove_skill); SUITE_ADD_TEST(suite, test_renumber_unit); SUITE_ADD_TEST(suite, test_name_unit); SUITE_ADD_TEST(suite, test_heal_factor); From d0c460069af29c6f428475a9621b41748654c244 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 27 Jan 2024 12:38:29 +0100 Subject: [PATCH 2/2] accidentally disabled a test --- src/kernel/unit.test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kernel/unit.test.c b/src/kernel/unit.test.c index 96218aff4..9b651e022 100644 --- a/src/kernel/unit.test.c +++ b/src/kernel/unit.test.c @@ -1119,7 +1119,7 @@ CuSuite *get_unit_suite(void) SUITE_ADD_TEST(suite, test_skill_familiar); SUITE_ADD_TEST(suite, test_inside_building); SUITE_ADD_TEST(suite, test_skills); - SUITE_ADD_TEST(suite, test_skills); + SUITE_ADD_TEST(suite, test_limited_skills); SUITE_ADD_TEST(suite, test_remove_skill); SUITE_ADD_TEST(suite, test_renumber_unit); SUITE_ADD_TEST(suite, test_name_unit);