From ebf64e9a7f1d8e2300193f09a45443a901b1e903 Mon Sep 17 00:00:00 2001 From: Ryan Barlow <7389646+ryanbarlow97@users.noreply.github.com> Date: Wed, 21 Oct 2026 08:29:29 +0000 Subject: [PATCH] fix: clear guild trade after losing a capital --- .../managers/ProvinceManager.java | 6 +-- .../managers/ProvinceEconomyCoverageTest.java | 6 ++- .../ProvinceManagerHubTransportTest.java | 54 +++++++++++++++++++ 3 files changed, 61 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/tfminecraft/simplefactions/managers/ProvinceManager.java b/src/main/java/net/tfminecraft/simplefactions/managers/ProvinceManager.java index 53c5fd19..254b9e5b 100644 --- a/src/main/java/net/tfminecraft/simplefactions/managers/ProvinceManager.java +++ b/src/main/java/net/tfminecraft/simplefactions/managers/ProvinceManager.java @@ -121,7 +121,6 @@ public void recalculate() { TradeGraph.refreshIfLive(this); dropMissingGuilds(); for(Guild g : FactionManager.getAllGuilds()) { - if (!g.hasCapital()) continue; recalculateGuild(g); } for(Guild g : FactionManager.getAllGuilds()) { @@ -151,7 +150,7 @@ public void recalculateQuiet(List guilds, List factions) { TradeGraph.refreshIfLive(this); dropExcept(previewGuilds); for (Guild guild : previewGuilds) { - if (guild != null && guild.hasCapital()) { + if (guild != null) { recalculateGuild(guild); } } @@ -179,7 +178,6 @@ public void recalculateForSingleGuild(Guild g, boolean save) { InstallationAccess.beginRecalculation(); try { installationAccess = new HashMap<>(); - if (!g.hasCapital()) return; TradeGraph.refreshIfLive(this); dropMissingGuilds(); recalculateGuild(g); @@ -210,7 +208,7 @@ private void recalculateProduction(Guild guild) { } private void recalculateGuild(Guild guild) { - // 1) Clear only this guild’s data + // Clear former trade and production even when the guild has lost its capital. clearGuildData(guild.getId()); // 2) Recalculate trade graph diff --git a/src/test/java/net/tfminecraft/simplefactions/managers/ProvinceEconomyCoverageTest.java b/src/test/java/net/tfminecraft/simplefactions/managers/ProvinceEconomyCoverageTest.java index 6200f834..bb457603 100644 --- a/src/test/java/net/tfminecraft/simplefactions/managers/ProvinceEconomyCoverageTest.java +++ b/src/test/java/net/tfminecraft/simplefactions/managers/ProvinceEconomyCoverageTest.java @@ -322,8 +322,12 @@ void disabledIncomeQueriesAndRecalculationRespectWhetherSavingWasRequested() { assertEquals(0, guild.getTradeBreakdown().getIncome()); fixture.provincesEnabled(true); Guild noCapital = fixture.guild(home, "landless", "Bob"); + source.setData(noCapital.getId(), new ProvinceDataEntry(noCapital, 20, 8)); + noCapital.getTradeBreakdown().setIncome(9); manager.recalculateForSingleGuild(noCapital, true); - assertEquals(40, source.getProsperity()); + assertEquals(3.73, source.getProsperity()); + assertFalse(source.getAllData().containsKey(noCapital.getId())); + assertEquals(0, noCapital.getTradeBreakdown().getIncome()); manager.clearGuildData(null); assertEquals(10, source.getStoredGuildTrade(guild)); manager.clearGuildData(guild.getId()); diff --git a/src/test/java/net/tfminecraft/simplefactions/managers/ProvinceManagerHubTransportTest.java b/src/test/java/net/tfminecraft/simplefactions/managers/ProvinceManagerHubTransportTest.java index 782ec2d6..a5e1b42b 100644 --- a/src/test/java/net/tfminecraft/simplefactions/managers/ProvinceManagerHubTransportTest.java +++ b/src/test/java/net/tfminecraft/simplefactions/managers/ProvinceManagerHubTransportTest.java @@ -86,6 +86,60 @@ void tearDown() { Cache.provincesEnabled = provincesWereEnabled; } + @Test + void losingCapitalClearsTradeAndProductionOnSingleGuildRecalculation() { + recalculate(); + assertTrue(trade(1) > 0); + assertTrue(production(1) > 0); + when(guild.hasCapital()).thenReturn(false); + when(guild.getCapital()).thenReturn(-1); + + recalculate(); + + assertEquals(0, trade(1)); + assertEquals(0, production(1)); + assertTrue(provinces.get(1).getAllData().isEmpty()); + } + + @Test + void losingCapitalClearsTradeAndProductionOnQuietRecalculation() { + recalculate(); + assertTrue(trade(1) > 0); + when(guild.hasCapital()).thenReturn(false); + when(guild.getCapital()).thenReturn(-1); + + var breakdown = new net.tfminecraft.simplefactions.guild.income.TradeBreakdown(); + breakdown.setIncome(50); + when(guild.getTradeBreakdown()).thenReturn(breakdown); + provinces.recalculateQuiet(List.of(guild), List.of(guild.getFaction())); + + assertEquals(0, trade(1)); + assertEquals(0, production(1)); + assertEquals(50, breakdown.getIncome()); + } + + @Test + void losingCapitalClearsTradeAndProductionOnFullRecalculation() { + recalculate(); + assertTrue(trade(1) > 0); + when(guild.hasCapital()).thenReturn(false); + when(guild.getCapital()).thenReturn(-1); + var breakdown = new net.tfminecraft.simplefactions.guild.income.TradeBreakdown(); + breakdown.setTradePower(20); + breakdown.setIncome(50); + when(guild.getTradeBreakdown()).thenReturn(breakdown); + try (MockedStatic factions = mockStatic(FactionManager.class)) { + factions.when(() -> FactionManager.getGuildByString("guild")).thenReturn(guild); + factions.when(FactionManager::getAllGuilds).thenReturn(List.of(guild)); + provinces.recalculate(); + } + + assertEquals(0, trade(1)); + assertEquals(0, production(1)); + assertEquals(0, breakdown.getTradePower()); + assertEquals(0, breakdown.getIncome()); + } + @Test void snapshotRecalculationKeepsGraphTrade() { connect(1, 22);