diff --git a/pom.xml b/pom.xml index 1c3c9bb..1b35e9c 100644 --- a/pom.xml +++ b/pom.xml @@ -56,7 +56,7 @@ 5.11.0 v1.21-SNAPSHOT - 3.10.0 + 3.13.0 4.0.10 1.8.0 2.6.2 @@ -66,7 +66,7 @@ -LOCAL - 1.22.1 + 1.23.0 BentoBoxWorld_AOneBlock bentobox-world diff --git a/src/main/java/world/bentobox/aoneblock/listeners/CheckPhase.java b/src/main/java/world/bentobox/aoneblock/listeners/CheckPhase.java index 491ed4d..2ffbe45 100644 --- a/src/main/java/world/bentobox/aoneblock/listeners/CheckPhase.java +++ b/src/main/java/world/bentobox/aoneblock/listeners/CheckPhase.java @@ -9,6 +9,9 @@ import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.title.Title; + import world.bentobox.aoneblock.AOneBlock; import world.bentobox.aoneblock.dataobjects.OneBlockIslands; import world.bentobox.aoneblock.oneblocks.OneBlockPhase; @@ -82,7 +85,7 @@ void setNewPhase(@Nullable Player player, @NonNull Island i, @NonNull OneBlockIs // Set the phase name is.setPhaseName(newPhaseName); if (user.isPlayer() && user.isOnline() && addon.inWorld(user.getWorld())) { - user.getPlayer().sendTitle(newPhaseName, null, -1, -1, -1); + user.getPlayer().showTitle(Title.title(Component.text(newPhaseName), Component.empty())); } // Run phase start commands Util.runCommands(user, diff --git a/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java b/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java index 7f52544..ec20de5 100644 --- a/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java +++ b/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java @@ -790,71 +790,98 @@ public double getPercentageDone(@NonNull OneBlockIslands obi) { } public void getProbs(OneBlockPhase phase) { - // Find the phase after this one Integer blockNum = Integer.valueOf(phase.getBlockNumber()); Integer nextKey = blockProbs.ceilingKey(blockNum + 1); - if (nextKey != null) { - // This is the size of the phase in blocks - int phaseSize = nextKey - blockNum; - int blockTotal = phase.getBlockTotal(); - int likelyChestTotal = 0; - double totalBlocks = 0; - // Now calculate the relative block probability - for (Entry en : phase.getBlocks().entrySet()) { - double chance = (double) en.getValue() / blockTotal; - double likelyNumberGenerated = chance * phaseSize; - totalBlocks += likelyNumberGenerated; - String report = en.getKey() + " likely generated = " + Math.round(likelyNumberGenerated) + " = " - + Math.round(likelyNumberGenerated * 100 / phaseSize) + "%"; - if (likelyNumberGenerated < 1) { - addon.logWarning(report); - } else { - addon.log(report); - } - if (en.getKey().equals(Material.CHEST)) { - likelyChestTotal = (int) Math.round(likelyNumberGenerated); - } - } - addon.log("Total blocks generated = " + totalBlocks); - // Get the specific chest probability - if (likelyChestTotal == 0) { - addon.logWarning("No chests will be generated"); - return; - } - addon.log("**** A total of " + likelyChestTotal + " chests will be generated ****"); - // Now calculate chest chances - double lastChance = 0; - for (Entry en : OneBlockPhase.CHEST_CHANCES.entrySet()) { - // Get the number of chests in this rarity group - int num = phase.getChestsMap().getOrDefault(en.getValue(), Collections.emptyList()).size(); - double likelyNumberGenerated = (en.getKey() - lastChance) * likelyChestTotal; - lastChance = en.getKey(); - String report = num + " " + en.getValue() + " chests in phase. Likely number generated = " - + Math.round(likelyNumberGenerated); - if (num > 0 && likelyNumberGenerated < 1) { - addon.logWarning(report); - } else { - addon.log(report); - } + if (nextKey == null) { + return; + } + int phaseSize = nextKey - blockNum; + int likelyChestTotal = logBlockProbs(phase, phaseSize); + if (likelyChestTotal == 0) { + addon.logWarning("No chests will be generated"); + return; + } + addon.log("**** A total of " + likelyChestTotal + " chests will be generated ****"); + logChestProbs(phase, likelyChestTotal); + logMobProbs(phase, phaseSize); + } + /** + * Logs the probability report for each block type in the phase. + * + * @param phase - the phase to report on + * @param phaseSize - total number of blocks in the phase + * @return the likely number of CHEST blocks that will be generated + */ + private int logBlockProbs(OneBlockPhase phase, int phaseSize) { + int blockTotal = phase.getBlockTotal(); + int likelyChestTotal = 0; + double totalBlocks = 0; + for (Entry en : phase.getBlocks().entrySet()) { + double likelyNumberGenerated = (double) en.getValue() / blockTotal * phaseSize; + totalBlocks += likelyNumberGenerated; + logReport(en.getKey() + " likely generated = " + Math.round(likelyNumberGenerated) + " = " + + Math.round(likelyNumberGenerated * 100 / phaseSize) + "%", likelyNumberGenerated); + if (en.getKey().equals(Material.CHEST)) { + likelyChestTotal = (int) Math.round(likelyNumberGenerated); } - // Mobs - addon.log("-=-=-=-= Mobs -=-=-=-=-"); - double totalMobs = 0; - // Now calculate the relative block probability - for (Entry en : phase.getMobs().entrySet()) { - double chance = (double) en.getValue() / phase.getTotal(); - double likelyNumberGenerated = chance * phaseSize; - totalMobs += likelyNumberGenerated; - String report = en.getKey() + " likely generated = " + Math.round(likelyNumberGenerated) + " = " - + Math.round(likelyNumberGenerated * 100 / phaseSize) + "%"; - if (likelyNumberGenerated < 1) { - addon.logWarning(report); - } else { - addon.log(report); - } + } + addon.log("Total blocks generated = " + totalBlocks); + return likelyChestTotal; + } + + /** + * Logs the probability report for each chest rarity in the phase. + * + * @param phase - the phase to report on + * @param likelyChestTotal - the likely total number of chests generated + */ + private void logChestProbs(OneBlockPhase phase, int likelyChestTotal) { + double lastChance = 0; + for (Entry en : OneBlockPhase.CHEST_CHANCES.entrySet()) { + int num = phase.getChestsMap().getOrDefault(en.getValue(), Collections.emptyList()).size(); + double likelyNumberGenerated = (en.getKey() - lastChance) * likelyChestTotal; + lastChance = en.getKey(); + String report = num + " " + en.getValue() + " chests in phase. Likely number generated = " + + Math.round(likelyNumberGenerated); + if (num > 0 && likelyNumberGenerated < 1) { + addon.logWarning(report); + } else { + addon.log(report); } - addon.log("**** A total of " + Math.round(totalMobs) + " mobs will likely be generated ****"); + } + } + + /** + * Logs the probability report for each mob type in the phase. + * + * @param phase - the phase to report on + * @param phaseSize - total number of blocks in the phase + */ + private void logMobProbs(OneBlockPhase phase, int phaseSize) { + addon.log("-=-=-=-= Mobs -=-=-=-=-"); + double totalMobs = 0; + for (Entry en : phase.getMobs().entrySet()) { + double likelyNumberGenerated = (double) en.getValue() / phase.getTotal() * phaseSize; + totalMobs += likelyNumberGenerated; + logReport(en.getKey() + " likely generated = " + Math.round(likelyNumberGenerated) + " = " + + Math.round(likelyNumberGenerated * 100 / phaseSize) + "%", likelyNumberGenerated); + } + addon.log("**** A total of " + Math.round(totalMobs) + " mobs will likely be generated ****"); + } + + /** + * Logs a report line as a warning if the likely count is below 1, otherwise as + * a normal log entry. + * + * @param report - the message to log + * @param likelyNumberGenerated - the computed likelihood + */ + private void logReport(String report, double likelyNumberGenerated) { + if (likelyNumberGenerated < 1) { + addon.logWarning(report); + } else { + addon.log(report); } } diff --git a/src/main/java/world/bentobox/aoneblock/panels/PhasesPanel.java b/src/main/java/world/bentobox/aoneblock/panels/PhasesPanel.java index b126849..5aff1d6 100644 --- a/src/main/java/world/bentobox/aoneblock/panels/PhasesPanel.java +++ b/src/main/java/world/bentobox/aoneblock/panels/PhasesPanel.java @@ -337,28 +337,53 @@ private PanelItem createPhaseButton(ItemTemplateRecord template, Map.Entry actions = template.actions().stream() + .filter(action -> switch (action.actionType().toUpperCase()) { + case "SELECT" -> canApply; + case "VIEW" -> true; + default -> false; + }) + .toList(); + + builder.clickHandler(buildClickHandler(actions, phase)); + + List tooltips = collectTooltips(actions); + if (!tooltips.isEmpty()) + { + builder.description(""); + builder.description(tooltips); + } + + return builder.build(); + } + + /** + * Applies the icon to the panel item builder from the template or phase data. + */ + private void applyIcon(PanelItemBuilder builder, ItemTemplateRecord template, OneBlockPhase phase) + { if (template.icon() != null) { builder.icon(template.icon().clone()); @@ -367,184 +392,191 @@ private PanelItem createPhaseButton(ItemTemplateRecord template, Map.Entry { switch (requirement.getType()) { - case ECO -> economyText.append(this.user.getTranslationOrNothing(REFERENCE + "economy", - TextVariables.NUMBER, String.valueOf(requirement.getEco()))); - - case BANK -> bankText.append(this.user.getTranslationOrNothing(REFERENCE + "bank", - TextVariables.NUMBER, String.valueOf(requirement.getBank()))); - - case LEVEL -> levelText.append(this.user.getTranslationOrNothing(REFERENCE + "level", - TextVariables.NUMBER, String.valueOf(requirement.getLevel()))); - - case PERMISSION -> permissionText.append(this.user.getTranslationOrNothing(REFERENCE + "permission", - PERMISSION, requirement.getPermission())); - case COOLDOWN -> { - // do nothing - } - default -> throw new IllegalArgumentException("Unexpected value: " + requirement.getType()); - + case ECO -> economyText.append(this.user.getTranslationOrNothing(REFERENCE + "economy", + TextVariables.NUMBER, String.valueOf(requirement.getEco()))); + case BANK -> bankText.append(this.user.getTranslationOrNothing(REFERENCE + "bank", + TextVariables.NUMBER, String.valueOf(requirement.getBank()))); + case LEVEL -> levelText.append(this.user.getTranslationOrNothing(REFERENCE + "level", + TextVariables.NUMBER, String.valueOf(requirement.getLevel()))); + case PERMISSION -> permissionText.append(this.user.getTranslationOrNothing(REFERENCE + "permission", + PERMISSION, requirement.getPermission())); + case COOLDOWN -> { /* do nothing */ } + default -> throw new IllegalArgumentException("Unexpected value: " + requirement.getType()); } }); - // Blocks Text + return new RequirementTexts(bankText.toString(), economyText.toString(), + levelText.toString(), permissionText.toString()); + } + + /** + * Builds the blocks text with word-wrapped newlines inserted. + */ + private String buildBlocksText(OneBlockPhase phase) + { String blocksText = user.getTranslation(REFERENCE + "blocks-prefix") + phase.getBlocks().keySet().stream() .map(m -> getMaterialName(user, m)) .map(string -> user.getTranslation(REFERENCE + "blocks", TextVariables.NAME, string)) .collect(Collectors.joining()); - // Removing the last newline character or comma if it exists blocksText = blocksText.trim(); - if (blocksText.endsWith("\n") || blocksText.endsWith(",")) { + if (blocksText.endsWith("\n") || blocksText.endsWith(",")) + { blocksText = blocksText.substring(0, blocksText.length() - 1); } - // Insert newlines every x characters - int wrapAt = 50; // Set default value - try { - // Attempt to parse the value from getTranslation - wrapAt = Integer.parseInt(user.getTranslation(REFERENCE + "wrap-at")); - - } catch (NumberFormatException e) { - // If parsing fails, keep default value of 40 - addon.logError("Warning: Unable to parse 'wrap-at' value, using default of 50."); - } - - String formattedText = insertNewlines(blocksText, wrapAt); + return insertNewlines(blocksText, parseWrapAt()); + } - if (template.description() != null) + /** + * Parses the wrap-at translation value, defaulting to 50 on parse failure. + */ + private int parseWrapAt() + { + try { - String biomeText = phase.getPhaseBiome() == null ? "" : LangUtilsHook.getBiomeName(phase.getPhaseBiome(), this.user); - - descriptionText = this.user.getTranslationOrNothing(template.description(), - TextVariables.NUMBER, phase.getBlockNumber(), - BIOME, biomeText, - BANK, bankText.toString(), - ECONOMY, economyText.toString(), - LEVEL, levelText.toString(), - PERMISSION, permissionText.toString(), BLOCKS, formattedText); + return Integer.parseInt(user.getTranslation(REFERENCE + "wrap-at")); } - else + catch (NumberFormatException e) { - // Null description, so we make our own - String blockText = this.user.getTranslationOrNothing(REFERENCE + "starting-block", - TextVariables.NUMBER, phase.getBlockNumber()); - String biomeText = phase.getPhaseBiome() == null ? "" - : this.user.getTranslationOrNothing(REFERENCE + "biome", - BIOME, LangUtilsHook.getBiomeName(phase.getPhaseBiome(), this.user)); - - descriptionText = this.user.getTranslationOrNothing(REFERENCE + "description", - "[starting-block]", biomeText, - BIOME, blockText, - BANK, bankText.toString(), - ECONOMY, economyText.toString(), - LEVEL, levelText.toString(), - PERMISSION, permissionText.toString(), BLOCKS, formattedText); + addon.logError("Warning: Unable to parse 'wrap-at' value, using default of 50."); + return 50; } + } - // Strip out or replace formating - descriptionText = descriptionText.replaceAll("(?m)^[ \\t]*\\r?\\n", ""). - replaceAll("(?= this.oneBlockIsland.getLifetime()) { - canApply = false; + return false; } + return !this.phaseRequirementsFail(phase, this.oneBlockIsland); + } - List actions = template.actions().stream(). - filter(action -> switch (action.actionType().toUpperCase()) { - case "SELECT" -> canApply; - case "VIEW" -> true; - default -> false; - }). - toList(); - - builder.glow(this.oneBlockIsland != null && this.oneBlockIsland.getPhaseName().equals(phase.getPhaseName())); - - // Add ClickHandler - builder.clickHandler((panel, user, clickType, i) -> + /** + * Builds the click handler for a phase button. + */ + private PanelItem.ClickHandler buildClickHandler(List actions, + OneBlockPhase phase) + { + return (panel, user, clickType, i) -> { - actions.forEach(action -> { - if (clickType == action.clickType() || action.clickType() == ClickType.UNKNOWN) + actions.forEach(action -> + { + if ((clickType == action.clickType() || action.clickType() == ClickType.UNKNOWN) + && "SELECT".equalsIgnoreCase(action.actionType())) { - if ("SELECT".equalsIgnoreCase(action.actionType())) - { - this.runCommandCall(this.addon.getSettings().getSetCountCommand().split(" ")[0], phase); - } - else - { - // TODO: implement view phase panel and command. - //this.runCommandCall("view", phase); - } + this.runCommandCall(this.addon.getSettings().getSetCountCommand().split(" ")[0], phase); } }); - - // Always return true. return true; - }); - - // Collect tooltips. - List tooltips = actions.stream(). - filter(action -> action.tooltip() != null). - map(action -> this.user.getTranslation(this.world, action.tooltip())). - filter(text -> !text.isBlank()). - collect(Collectors.toCollection(() -> new ArrayList<>(actions.size()))); - - // Add tooltips. - if (!tooltips.isEmpty()) - { - // Empty line and tooltips. - builder.description(""); - builder.description(tooltips); - } + }; + } - return builder.build(); + /** + * Collects non-blank tooltip strings from a list of action records. + */ + private List collectTooltips(List actions) + { + return actions.stream() + .filter(action -> action.tooltip() != null) + .map(action -> this.user.getTranslation(this.world, action.tooltip())) + .filter(text -> !text.isBlank()) + .collect(Collectors.toCollection(() -> new ArrayList<>(actions.size()))); } private String getMaterialName(User user, Material m) { diff --git a/src/main/resources/addon.yml b/src/main/resources/addon.yml index 7eeb0e7..9dc91ba 100755 --- a/src/main/resources/addon.yml +++ b/src/main/resources/addon.yml @@ -1,7 +1,7 @@ name: AOneBlock main: world.bentobox.aoneblock.AOneBlock version: ${version}${build.number} -api-version: 2.7.1 +api-version: 3.13.0 metrics: true icon: "STONE" repository: "BentoBoxWorld/AOneBlock" diff --git a/src/test/java/world/bentobox/aoneblock/TestWorldSettings.java b/src/test/java/world/bentobox/aoneblock/TestWorldSettings.java index b6b3a1a..e0db2b9 100644 --- a/src/test/java/world/bentobox/aoneblock/TestWorldSettings.java +++ b/src/test/java/world/bentobox/aoneblock/TestWorldSettings.java @@ -48,7 +48,7 @@ public Difficulty getDifficulty() { @Override public void setDifficulty(Difficulty difficulty) { - + // Do nothing } diff --git a/src/test/java/world/bentobox/aoneblock/listeners/BlockListenerTest2.java b/src/test/java/world/bentobox/aoneblock/listeners/BlockListenerTest2.java index fc2a52b..87c8329 100644 --- a/src/test/java/world/bentobox/aoneblock/listeners/BlockListenerTest2.java +++ b/src/test/java/world/bentobox/aoneblock/listeners/BlockListenerTest2.java @@ -1,5 +1,6 @@ package world.bentobox.aoneblock.listeners; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; @@ -81,7 +82,7 @@ * * @author tastybento */ -public class BlockListenerTest2 extends CommonTestSetup { +class BlockListenerTest2 extends CommonTestSetup { // Class under test private BlockListener bl; @@ -291,7 +292,7 @@ void testOnPlayerInteractNullBlock() { PlayerInteractEvent e = makeInteractEvent(Action.RIGHT_CLICK_BLOCK, null, EquipmentSlot.HAND); // Should not throw NPE - bl.onPlayerInteract(e); + assertDoesNotThrow(() -> bl.onPlayerInteract(e)); } /** @@ -819,7 +820,7 @@ void testOnDeletedIslandInWorld() { mock(world.bentobox.bentobox.api.events.island.IslandDeleteEvent.class); when(e.getIsland()).thenReturn(toDelete); - bl.onDeletedIsland(e); + assertDoesNotThrow(() -> bl.onDeletedIsland(e)); // Confirm the method completes without exception (cache and DB deletion happened) } @@ -840,7 +841,7 @@ void testOnDeletedIslandNotInWorld() { mock(world.bentobox.bentobox.api.events.island.IslandDeleteEvent.class); when(e.getIsland()).thenReturn(toDelete); - bl.onDeletedIsland(e); + assertDoesNotThrow(() -> bl.onDeletedIsland(e)); // No exception; nothing to verify beyond the early return } diff --git a/src/test/java/world/bentobox/aoneblock/listeners/CheckPhaseTest.java b/src/test/java/world/bentobox/aoneblock/listeners/CheckPhaseTest.java index e4ae83e..71720df 100644 --- a/src/test/java/world/bentobox/aoneblock/listeners/CheckPhaseTest.java +++ b/src/test/java/world/bentobox/aoneblock/listeners/CheckPhaseTest.java @@ -22,6 +22,8 @@ import org.junit.jupiter.api.Test; import org.mockito.Mock; +import net.kyori.adventure.title.Title; + import world.bentobox.aoneblock.AOneBlock; import world.bentobox.aoneblock.CommonTestSetup; import world.bentobox.aoneblock.dataobjects.OneBlockIslands; @@ -151,7 +153,7 @@ void testSetNewPhase() { // Verify phase name change assertEquals("Next Phase", is.getPhaseName()); // Verify title shown - verify(mockPlayer).sendTitle("Next Phase", null, -1, -1, -1); + verify(mockPlayer).showTitle(any(Title.class)); } @@ -184,7 +186,7 @@ void testSetNewPhaseSecondTime() { // Verify phase name change assertEquals("Next Phase", is.getPhaseName()); // Verify title shown - verify(mockPlayer).sendTitle("Next Phase", null, -1, -1, -1); + verify(mockPlayer).showTitle(any(Title.class)); } @@ -217,7 +219,7 @@ void testSetNewPhaseNullPlayer() { // Verify phase name change assertEquals("Next Phase", is.getPhaseName()); // Verify title shown - verify(mockPlayer).sendTitle("Next Phase", null, -1, -1, -1); + verify(mockPlayer).showTitle(any(Title.class)); } @@ -250,7 +252,7 @@ void testCheckPhaseNPCPlayer() { // Verify phase name change assertEquals("Next Phase", is.getPhaseName()); // Verify title shown - verify(mockPlayer).sendTitle("Next Phase", null, -1, -1, -1); + verify(mockPlayer).showTitle(any(Title.class)); } diff --git a/src/test/java/world/bentobox/aoneblock/listeners/InfoListenerTest.java b/src/test/java/world/bentobox/aoneblock/listeners/InfoListenerTest.java index 7a6dde6..dc78679 100644 --- a/src/test/java/world/bentobox/aoneblock/listeners/InfoListenerTest.java +++ b/src/test/java/world/bentobox/aoneblock/listeners/InfoListenerTest.java @@ -1,25 +1,22 @@ package world.bentobox.aoneblock.listeners; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.mockito.Mockito.atLeast; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import java.util.List; import java.util.UUID; import org.bukkit.entity.Player; -import org.bukkit.entity.Player.Spigot; import org.eclipse.jdt.annotation.NonNull; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; import org.mockito.Mock; -import net.md_5.bungee.api.chat.TextComponent; import world.bentobox.aoneblock.AOneBlock; import world.bentobox.aoneblock.CommonTestSetup; import world.bentobox.aoneblock.dataobjects.OneBlockIslands; @@ -41,8 +38,6 @@ public class InfoListenerTest extends CommonTestSetup { private InfoListener il; @Mock private @NonNull OneBlockIslands is; - @Mock - private Spigot spigot; private static final UUID ID = UUID.randomUUID(); @@ -110,17 +105,9 @@ void testInfoListener() { void testOnInfo() { IslandInfoEvent e = new IslandInfoEvent(island, ID, false, location, addon); il.onInfo(e); - checkSpigotMessage("aoneblock.commands.info.count"); + verify(lm).get(any(User.class), eq("aoneblock.commands.info.count")); } - /** - * Check that spigot sent the message - * @param message - message to check - */ - public void checkSpigotMessage(String expectedMessage) { - checkSpigotMessage(expectedMessage, 1); - } - /** * Test method for {@link world.bentobox.aoneblock.listeners.InfoListener#onInfo(world.bentobox.bentobox.api.events.island.IslandInfoEvent)}. */ @@ -128,27 +115,7 @@ public void checkSpigotMessage(String expectedMessage) { void testOnInfoOtherAddon() { IslandInfoEvent e = new IslandInfoEvent(island, ID, false, location, mock(Addon.class)); il.onInfo(e); - checkSpigotMessage("aoneblock.commands.info.count", 0); - } - - public void checkSpigotMessage(String expectedMessage, int expectedOccurrences) { - // Capture the argument passed to spigot().sendMessage(...) if messages are sent - ArgumentCaptor captor = ArgumentCaptor.forClass(TextComponent.class); - - // Verify that sendMessage() was called at least 0 times (capture any sent messages) - verify(spigot, atLeast(0)).sendMessage(captor.capture()); - - // Get all captured TextComponents - List capturedMessages = captor.getAllValues(); - - // Count the number of occurrences of the expectedMessage in the captured messages - long actualOccurrences = capturedMessages.stream().map(component -> component.toLegacyText()) // Convert each TextComponent to plain text - .filter(messageText -> messageText.contains(expectedMessage)) // Check if the message contains the expected text - .count(); // Count how many times the expected message appears - - // Assert that the number of occurrences matches the expectedOccurrences - assertEquals(expectedOccurrences, - actualOccurrences, "Expected message occurrence mismatch: " + expectedMessage); + verify(lm, never()).get(any(User.class), eq("aoneblock.commands.info.count")); } } diff --git a/src/test/java/world/bentobox/aoneblock/listeners/StartSafetyListenerTest.java b/src/test/java/world/bentobox/aoneblock/listeners/StartSafetyListenerTest.java index d03c683..18b0d55 100644 --- a/src/test/java/world/bentobox/aoneblock/listeners/StartSafetyListenerTest.java +++ b/src/test/java/world/bentobox/aoneblock/listeners/StartSafetyListenerTest.java @@ -164,7 +164,7 @@ public Difficulty getDifficulty() { @Override public void setDifficulty(Difficulty difficulty) { - + // Do nothing } @Override @@ -432,7 +432,7 @@ public long getResetEpoch() { @Override public void setResetEpoch(long timestamp) { - + // Do nothing } @Override