diff --git a/src/gamecode.vcxproj b/src/gamecode.vcxproj
index 17572c776..e9cd8c4be 100644
--- a/src/gamecode.vcxproj
+++ b/src/gamecode.vcxproj
@@ -92,6 +92,7 @@
+
diff --git a/src/gamecode.vcxproj.filters b/src/gamecode.vcxproj.filters
index 9105225f2..176c488c8 100644
--- a/src/gamecode.vcxproj.filters
+++ b/src/gamecode.vcxproj.filters
@@ -68,6 +68,9 @@
Source Files
+
+ Source Files
+
diff --git a/src/gamecode/economy.c b/src/gamecode/economy.c
index 2d0af734c..dcf4bdcc7 100644
--- a/src/gamecode/economy.c
+++ b/src/gamecode/economy.c
@@ -626,17 +626,19 @@ static void friendly_takeover(region * r, faction * f)
}
}
-static void give_control(unit * u, unit * u2)
+void give_control(unit * u, unit * u2)
{
- if (u->building && u->faction != u2->faction && rule_region_owners()) {
- region *r = u->region;
- faction *f = region_get_owner(r);
+ if (u->building) {
+ if (u->faction != u2->faction && rule_region_owners()) {
+ region *r = u->region;
+ faction *f = region_get_owner(r);
- assert(u->building==u2->building);
- if (f == u->faction) {
- building *b = largestbuilding(r, &cmp_current_owner, false);
- if (b == u->building) {
- friendly_takeover(r, u2->faction);
+ assert(u->building==u2->building);
+ if (f == u->faction) {
+ building *b = largestbuilding(r, &cmp_current_owner, false);
+ if (b == u->building) {
+ friendly_takeover(r, u2->faction);
+ }
}
}
building_set_owner(u2);
diff --git a/src/gamecode/economy.h b/src/gamecode/economy.h
index 9d931e433..b5ccac86d 100644
--- a/src/gamecode/economy.h
+++ b/src/gamecode/economy.h
@@ -55,6 +55,7 @@ extern "C" {
extern void split_allocations(struct region *r);
extern int recruit_archetypes(void);
extern int give_control_cmd(struct unit *u, struct order *ord);
+ extern void give_control(struct unit * u, struct unit * u2);
#ifdef __cplusplus
}
diff --git a/src/gamecode/economy_test.c b/src/gamecode/economy_test.c
new file mode 100644
index 000000000..0d44c2dc1
--- /dev/null
+++ b/src/gamecode/economy_test.c
@@ -0,0 +1,60 @@
+#include "platform.h"
+#include "economy.h"
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+
+static void test_give_control_building(CuTest * tc)
+{
+ unit *u1, *u2;
+ building *b;
+ struct faction *f;
+ region *r;
+
+ test_cleanup();
+ test_create_world();
+ f = test_create_faction(0);
+ r = findregion(0, 0);
+ b = test_create_building(r, 0);
+ u1 = test_create_unit(f, r);
+ u_set_building(u1, b);
+ u2 = test_create_unit(f, r);
+ u_set_building(u2, b);
+ CuAssertPtrEquals(tc, u1, building_owner(b));
+ give_control(u1, u2);
+ CuAssertPtrEquals(tc, u2, building_owner(b));
+}
+
+static void test_give_control_ship(CuTest * tc)
+{
+ unit *u1, *u2;
+ ship *sh;
+ struct faction *f;
+ region *r;
+
+ test_cleanup();
+ test_create_world();
+ f = test_create_faction(0);
+ r = findregion(0, 0);
+ sh = test_create_ship(r, 0);
+ u1 = test_create_unit(f, r);
+ u_set_ship(u1, sh);
+ u2 = test_create_unit(f, r);
+ u_set_ship(u2, sh);
+ CuAssertPtrEquals(tc, u1, ship_owner(sh));
+ give_control(u1, u2);
+ CuAssertPtrEquals(tc, u2, ship_owner(sh));
+}
+
+CuSuite *get_economy_suite(void)
+{
+ CuSuite *suite = CuSuiteNew();
+ SUITE_ADD_TEST(suite, test_give_control_building);
+ SUITE_ADD_TEST(suite, test_give_control_ship);
+ return suite;
+}
diff --git a/src/tests.c b/src/tests.c
index 4dcdaa1b3..1f6d4df38 100644
--- a/src/tests.c
+++ b/src/tests.c
@@ -21,6 +21,7 @@
#include
#include
#include
+#include
#include
#include
@@ -67,6 +68,7 @@ int RunAllTests(void)
/* gamecode */
CuSuiteAddSuite(suite, get_market_suite());
CuSuiteAddSuite(suite, get_laws_suite());
+ CuSuiteAddSuite(suite, get_economy_suite());
CuSuiteRun(suite);
CuSuiteSummary(suite, output);
@@ -137,15 +139,15 @@ test_create_terrain(const char * name, unsigned int flags)
building * test_create_building(region * r, const building_type * btype)
{
- building * b = new_building(btype, r, default_locale);
- b->size = btype->maxsize>0?btype->maxsize:1;
+ building * b = new_building(btype?btype:bt_find("castle"), r, default_locale);
+ b->size = b->type->maxsize>0?b->type->maxsize:1;
return b;
}
ship * test_create_ship(region * r, const ship_type * stype)
{
- ship * s = new_ship(stype, r, default_locale);
- s->size = stype->construction?stype->construction->maxsize:1;
+ ship * s = new_ship(stype?stype:st_find("boat"), r, default_locale);
+ s->size = s->type->construction?s->type->construction->maxsize:1;
return s;
}