From 779f4eef783f7b8b4cd83d1ea0ce22a010a7e4f0 Mon Sep 17 00:00:00 2001 From: JustinasLa Date: Mon, 28 Sep 2026 02:27:21 +0200 Subject: [PATCH] Give favoured and repressed guilds their own base effects The scope switch in LawHandler.getLawModifiers had no breaks, so a domestic guild fell through to the vassal cases. Favoured guilds got favoured_vassals (+15% trade) instead of favoured_guilds (+20%), and repressed guilds got repressed_vassals (-10%) instead of repressed_guilds (-15%). - Break after the DOMESTIC_GUILDS case - VASSALS and VASSAL_GUILDS share one case - Add FavourRepressBaseEffectTest for all four base effects Co-Authored-By: Claude Opus 5.5 (1M context) --- .../objects/handler/LawHandler.java | 4 +- .../laws/FavourRepressBaseEffectTest.java | 99 +++++++++++++++++++ 2 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 src/test/java/net/tfminecraft/simplefactions/laws/FavourRepressBaseEffectTest.java diff --git a/src/main/java/net/tfminecraft/simplefactions/objects/handler/LawHandler.java b/src/main/java/net/tfminecraft/simplefactions/objects/handler/LawHandler.java index 97801f5e..f755b8ad 100644 --- a/src/main/java/net/tfminecraft/simplefactions/objects/handler/LawHandler.java +++ b/src/main/java/net/tfminecraft/simplefactions/objects/handler/LawHandler.java @@ -106,12 +106,12 @@ public List getLawModifiers(String id, Scope scope, Region regi case DOMESTIC_GUILDS: if(guild.isFavoured()) secondary = Scope.FAVOURED_GUILDS; else if(guild.isRepressed()) secondary = Scope.REPRESSED_GUILDS; + break; case VASSALS: - if(guild.isFavoured()) secondary = Scope.FAVOURED_VASSALS; - else if(guild.isRepressed()) secondary = Scope.REPRESSED_VASSALS; case VASSAL_GUILDS: if(guild.isFavoured()) secondary = Scope.FAVOURED_VASSALS; else if(guild.isRepressed()) secondary = Scope.REPRESSED_VASSALS; + break; default: break; } diff --git a/src/test/java/net/tfminecraft/simplefactions/laws/FavourRepressBaseEffectTest.java b/src/test/java/net/tfminecraft/simplefactions/laws/FavourRepressBaseEffectTest.java new file mode 100644 index 00000000..dc8b7f0b --- /dev/null +++ b/src/test/java/net/tfminecraft/simplefactions/laws/FavourRepressBaseEffectTest.java @@ -0,0 +1,99 @@ +package net.tfminecraft.simplefactions.laws; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.when; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.bukkit.configuration.file.YamlConfiguration; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; + +import net.tfminecraft.simplefactions.Cache; +import net.tfminecraft.simplefactions.enums.FactionModifiers; +import net.tfminecraft.simplefactions.enums.Region; +import net.tfminecraft.simplefactions.enums.Scope; +import net.tfminecraft.simplefactions.guild.Guild; +import net.tfminecraft.simplefactions.managers.FactionManager; +import net.tfminecraft.simplefactions.objects.Faction; +import net.tfminecraft.simplefactions.objects.FactionModifier; +import net.tfminecraft.simplefactions.objects.handler.LawHandler; + +/** Favoured and repressed guilds get their own scope's base effect, not the vassal one. */ +class FavourRepressBaseEffectTest { + + private Map savedBaseEffects; + + @BeforeEach + void setUp() { + savedBaseEffects = Cache.baseEffects; + Cache.baseEffects = new HashMap<>(); + Cache.baseEffects.put(Scope.FAVOURED_GUILDS, tradePower(Scope.FAVOURED_GUILDS, 20)); + Cache.baseEffects.put(Scope.REPRESSED_GUILDS, tradePower(Scope.REPRESSED_GUILDS, -15)); + Cache.baseEffects.put(Scope.FAVOURED_VASSALS, tradePower(Scope.FAVOURED_VASSALS, 15)); + Cache.baseEffects.put(Scope.REPRESSED_VASSALS, tradePower(Scope.REPRESSED_VASSALS, -10)); + } + + @AfterEach + void restore() { + Cache.baseEffects = savedBaseEffects; + } + + @Test + void favouredDomesticGuild_getsFavouredGuildsEffect() { + assertEquals(20.0, tradePowerFor(guild(true, false), Scope.DOMESTIC_GUILDS)); + } + + @Test + void repressedDomesticGuild_getsRepressedGuildsEffect() { + assertEquals(-15.0, tradePowerFor(guild(false, true), Scope.DOMESTIC_GUILDS)); + } + + @Test + void favouredVassal_getsFavouredVassalsEffect() { + assertEquals(15.0, tradePowerFor(guild(true, false), Scope.VASSALS)); + assertEquals(15.0, tradePowerFor(guild(true, false), Scope.VASSAL_GUILDS)); + } + + @Test + void repressedVassal_getsRepressedVassalsEffect() { + assertEquals(-10.0, tradePowerFor(guild(false, true), Scope.VASSALS)); + assertEquals(-10.0, tradePowerFor(guild(false, true), Scope.VASSAL_GUILDS)); + } + + @Test + void ordinaryGuild_getsNoBaseEffect() { + assertEquals(0.0, tradePowerFor(guild(false, false), Scope.DOMESTIC_GUILDS)); + } + + private static double tradePowerFor(Guild guild, Scope scope) { + try (MockedStatic factions = mockStatic(FactionManager.class)) { + factions.when(() -> FactionManager.getGuildByString("g")).thenReturn(guild); + LawHandler handler = new LawHandler(mock(Faction.class), List.of()); + double total = 0.0; + for (FactionModifier m : handler.getLawModifiers("g", scope, Region.OUR_TERRITORY)) { + if (m.getType() == FactionModifiers.TRADE_POWER) total += m.getAmount(); + } + return total; + } + } + + private static Guild guild(boolean favoured, boolean repressed) { + Guild guild = mock(Guild.class); + when(guild.isFavoured()).thenReturn(favoured); + when(guild.isRepressed()).thenReturn(repressed); + return guild; + } + + private static LawEffect tradePower(Scope scope, double amount) { + LawEffect effect = new LawEffect(scope, new YamlConfiguration()); + effect.addModifier(Region.OUR_TERRITORY, new FactionModifier(FactionModifiers.TRADE_POWER, amount)); + return effect; + } +}