From f7b689855982fee18625ec3bdf5bb58b5a1f9aed Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sun, 28 Jan 2018 20:44:57 -0800 Subject: [PATCH] Added protection methods. --- .idea/misc.xml | 13 ++ .idea/modules.xml | 8 + .idea/vcs.xml | 6 + bskyblock.iml | 43 ++++ pom.xml | 13 ++ .../us/tastybento/bskyblock/BSkyBlock.java | 2 +- .../tastybento/bskyblock/api/flags/Flag.java | 1 + .../bskyblock/api/flags/FlagBuilder.java | 2 +- .../bskyblock/api/panels/PanelItem.java | 6 +- .../api/panels/builders/PanelItemBuilder.java | 7 +- .../bskyblock/database/objects/Island.java | 46 ++-- .../database/objects/NameToUUID.java | 68 ------ .../bskyblock/managers/FlagsManager.java | 10 +- .../bskyblock/util/YmlCommentParser.java | 215 ++++++++++++++++++ .../bskyblock/util/YmlConfiguration.java | 44 ++++ src/test/java/bskyblock/TestBSkyBlock.java | 92 ++++++-- 16 files changed, 455 insertions(+), 121 deletions(-) create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 bskyblock.iml delete mode 100644 src/main/java/us/tastybento/bskyblock/database/objects/NameToUUID.java create mode 100644 src/main/java/us/tastybento/bskyblock/util/YmlCommentParser.java create mode 100644 src/main/java/us/tastybento/bskyblock/util/YmlConfiguration.java diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..e8942bd65 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..b7d631524 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..35eb1ddfb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/bskyblock.iml b/bskyblock.iml new file mode 100644 index 000000000..686b4846a --- /dev/null +++ b/bskyblock.iml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index a0a08b04d..799b8bfc2 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,7 @@ 1.8 UTF-8 UTF-8 + 1.7.1 clean package install @@ -75,6 +76,18 @@ 1.12.2-R0.1-SNAPSHOT provided + + org.powermock + powermock-module-junit4 + ${powermock.version} + test + + + org.powermock + powermock-api-mockito + ${powermock.version} + test + diff --git a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java index 760c7cc11..6ff4ce516 100755 --- a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java +++ b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java @@ -104,7 +104,7 @@ public class BSkyBlock extends JavaPlugin { registerListeners(); // Load Flags - flagsManager = new FlagsManager(); + flagsManager = new FlagsManager(plugin); // Load addons addonsManager = new AddonsManager(plugin); diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java index 7061f6ee9..5c6cc8581 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java @@ -6,6 +6,7 @@ import org.bukkit.event.Listener; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.panels.PanelItem; +import us.tastybento.bskyblock.managers.FlagsManager; public class Flag { diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java b/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java index d90a7f781..86cb54448 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java @@ -10,7 +10,7 @@ import us.tastybento.bskyblock.api.panels.builders.PanelItemBuilder; public class FlagBuilder { private String id = ""; - private PanelItem icon = PanelItem.empty(); + private PanelItem icon; private Listener listener; public FlagBuilder id(String id) { diff --git a/src/main/java/us/tastybento/bskyblock/api/panels/PanelItem.java b/src/main/java/us/tastybento/bskyblock/api/panels/PanelItem.java index 29860370b..f31a04ffd 100644 --- a/src/main/java/us/tastybento/bskyblock/api/panels/PanelItem.java +++ b/src/main/java/us/tastybento/bskyblock/api/panels/PanelItem.java @@ -19,13 +19,13 @@ public class PanelItem { } private ItemStack icon; - private Optional clickHandler; + private ClickHandler clickHandler; private List description; private String name; private boolean glow; private ItemMeta meta; - public PanelItem(ItemStack icon, String name, List description, boolean glow, Optional clickHandler) { + public PanelItem(ItemStack icon, String name, List description, boolean glow, ClickHandler clickHandler) { this.icon = icon; // Get the meta meta = icon.getItemMeta(); @@ -70,7 +70,7 @@ public class PanelItem { } public Optional getClickHandler() { - return clickHandler; + return Optional.of(clickHandler); } public boolean isGlow() { diff --git a/src/main/java/us/tastybento/bskyblock/api/panels/builders/PanelItemBuilder.java b/src/main/java/us/tastybento/bskyblock/api/panels/builders/PanelItemBuilder.java index 956d87dd2..b53496cd7 100644 --- a/src/main/java/us/tastybento/bskyblock/api/panels/builders/PanelItemBuilder.java +++ b/src/main/java/us/tastybento/bskyblock/api/panels/builders/PanelItemBuilder.java @@ -5,6 +5,7 @@ import java.util.Collections; import java.util.List; import java.util.Optional; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -16,7 +17,7 @@ public class PanelItemBuilder { private String name = ""; private List description = new ArrayList<>(); private boolean glow = false; - private Optional clickHandler = Optional.empty(); + private PanelItem.ClickHandler clickHandler; public PanelItemBuilder icon(Material icon) { this.icon = new ItemStack(icon); @@ -54,11 +55,13 @@ public class PanelItemBuilder { } public PanelItemBuilder clickHandler(ClickHandler clickHandler) { - this.clickHandler = Optional.of(clickHandler); + this.clickHandler = clickHandler; return this; } public PanelItem build() { + if (icon == null) + Bukkit.getLogger().info("DEBUG: icon is null"); return new PanelItem(icon, name, description, glow, clickHandler); } diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index a24d6bd31..02562f2a7 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -88,7 +88,7 @@ public class Island implements DataObject { private boolean spawn = false; private boolean purgeProtected = false; //// Protection //// - private HashMap flags = new HashMap<>(); + private HashMap flags = new HashMap<>(); private int levelHandicap; @@ -159,23 +159,23 @@ public class Island implements DataObject { } /** - * Get the Island Guard flag status + * Get the Island Guard flag ranking * @param flag - * @return true or false, or false if flag is not in the list + * @return flag rank. Players must have at least this rank to bypass this flag */ - public boolean getFlag(Flag flag){ + public int getFlag(Flag flag){ if(flags.containsKey(flag)) { return flags.get(flag); } else { - flags.put(flag, false); - return false; + flags.put(flag, RanksManager.MEMBER_RANK); + return RanksManager.MEMBER_RANK; } } /** * @return the flags */ - public HashMap getFlags() { + public HashMap getFlags() { return flags; } @@ -375,18 +375,18 @@ public class Island implements DataObject { } /** - * Set the Island Guard flag status + * Set the Island Guard flag rank * @param flag * @param value */ - public void setFlag(Flag flag, boolean value){ + public void setFlag(Flag flag, int value){ flags.put(flag, value); } /** * @param flags the flags to set */ - public void setFlags(HashMap flags) { + public void setFlags(HashMap flags) { this.flags = flags; } @@ -462,6 +462,12 @@ public class Island implements DataObject { */ public void setOwner(UUID owner){ this.owner = owner; + // Defensive code: demote any previous owner + for (Entry en : members.entrySet()) { + if (en.getValue().equals(RanksManager.OWNER_RANK)) { + en.setValue(RanksManager.MEMBER_RANK); + } + } this.members.put(owner, RanksManager.OWNER_RANK); } @@ -516,16 +522,6 @@ public class Island implements DataObject { this.world = world; } - /** - * Toggles the Island Guard flag status if it is in the list - * @param flag - */ - public void toggleFlag(Flag flag){ - if(flags.containsKey(flag)) { - flags.put(flag, !flags.get(flag)); - } - } - /** * @return the levelHandicap */ @@ -649,4 +645,14 @@ public class Island implements DataObject { public void setRanks(HashMap ranks) { this.members = ranks; } + + /** + * Check if a user is allowed to bypass the flag or not + * @param user - user + * @param flag - flag + * @return true if allowed, false if not + */ + public boolean isAllowed(User user, Flag flag) { + return (this.getRank(user) >= this.getFlag(flag)) ? true : false; + } } \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/NameToUUID.java b/src/main/java/us/tastybento/bskyblock/database/objects/NameToUUID.java deleted file mode 100644 index e60923b64..000000000 --- a/src/main/java/us/tastybento/bskyblock/database/objects/NameToUUID.java +++ /dev/null @@ -1,68 +0,0 @@ -/** - * - */ -package us.tastybento.bskyblock.database.objects; - -import java.util.HashMap; -import java.util.UUID; - -import us.tastybento.bskyblock.api.commands.User; - -/** - * A bean to hold name to UUID lookup - * @author tastybento - * - */ -public class NameToUUID implements DataObject { - - public HashMap namesToUUID; - - public NameToUUID() {} - - /** - * @return the namesToUUID - */ - public HashMap getNamesToUUID() { - return namesToUUID; - } - - /** - * @param namesToUUID the namesToUUID to set - */ - public void setNamesToUUID(HashMap namesToUUID) { - this.namesToUUID = namesToUUID; - } - - /* (non-Javadoc) - * @see us.tastybento.bskyblock.database.objects.DataObject#getUniqueId() - */ - @Override - public String getUniqueId() { - return "names-uuid"; - } - - /* (non-Javadoc) - * @see us.tastybento.bskyblock.database.objects.DataObject#setUniqueId(java.lang.String) - */ - @Override - public void setUniqueId(String uniqueId) { - // Do nothing - } - - /** - * Add or update a name - * @param user - */ - public void addName(User user) { - this.namesToUUID.put(user.getName(), user.getUniqueId()); - } - - /** - * Get UUID for name - * @param name - * @return UUID or null if not found - */ - public UUID getUUID(String name) { - return this.namesToUUID.get(name); - } -} diff --git a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java index 1bc1cc914..68c1ddb16 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java @@ -9,7 +9,13 @@ import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.api.panels.PanelItem; -public final class FlagsManager { +public class FlagsManager { + + private BSkyBlock plugin; + + public FlagsManager(BSkyBlock plugin) { + this.plugin = plugin; + } private List flags = new ArrayList<>(); @@ -17,7 +23,7 @@ public final class FlagsManager { //TODO all the security checks flags.add(flag); // If there is a listener, register it into Bukkit. - flag.getListener().ifPresent(l -> Bukkit.getPluginManager().registerEvents(l, BSkyBlock.getInstance())); + flag.getListener().ifPresent(l -> plugin.getServer().getPluginManager().registerEvents(l, plugin)); } public List getFlags() { diff --git a/src/main/java/us/tastybento/bskyblock/util/YmlCommentParser.java b/src/main/java/us/tastybento/bskyblock/util/YmlCommentParser.java new file mode 100644 index 000000000..1f15f0c52 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/util/YmlCommentParser.java @@ -0,0 +1,215 @@ +package us.tastybento.bskyblock.util; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import java.util.ArrayDeque; +import java.util.Collections; +import java.util.Deque; +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * A very simplistic yml parser, that only do the following: + *
    + *
  1. Keep track of indentation-levels and sections.
  2. + *
  3. Handle comments.
  4. + *
+ */ +public class YmlCommentParser { + private static final Logger log = Logger.getLogger(YmlCommentParser.class.getName()); + private static final Pattern SECTION_PATTERN = Pattern.compile("^(?\\s*)(?[^ \\-][^:]*):(?[^#]*)?(?#.*)?"); + private static final Pattern COMMENT_PATTERN = Pattern.compile("^(?\\s*)(?#.*)"); + private Map commentMap = new HashMap<>(); + + public Map getCommentMap() { + return Collections.unmodifiableMap(commentMap); + } + + + public void addComment(String path, String comment) { + commentMap.put(path, comment); + } + + public void addComments(Map comments) { + commentMap.putAll(comments); + } + + private void readLines(BufferedReader rdr) throws IOException { + int indentLevel = 0; + Deque
sections = new ArrayDeque<>(); + StringBuilder comments = new StringBuilder(); + String baseKey = null; + sections.add(new Section(null, 0)); + String line; + int lineNum = 1; + boolean isFirstAfterSection = true; + while ((line = rdr.readLine()) != null) { + Matcher commentM = COMMENT_PATTERN.matcher(line); + Matcher sectionM = SECTION_PATTERN.matcher(line); + if (commentM.matches()) { + comments.append(commentM.group("comment") + "\n"); + } else if (sectionM.matches()) { + String comment = sectionM.group("comment"); + if (comment != null && !comment.trim().isEmpty()) { + comments.append(comment + "\n"); + } + String name = sectionM.group("name").trim(); + String value = sectionM.group("value"); + String indent = sectionM.group("indent"); + if (isFirstAfterSection && indent.length() > indentLevel) { + indentLevel = indent.length(); + sections.peek().setIndentation(indentLevel); + } else if (indent.length() < indentLevel) { + while (indent.length() < indentLevel && !sections.isEmpty()) { + sections.pop(); + baseKey = sections.peek().getPath(); + indentLevel = sections.peek().getIndentation(); + isFirstAfterSection = false; + } + } + String path = getPath(baseKey, name); + if (value != null && !value.trim().isEmpty()) { + // Scalar with value + addComments(path, comments); + if (!isFirstAfterSection && indent.length() > indentLevel) { + log.warning("line " + lineNum + ": mixed indentation, expected " + indentLevel + " but got " + indent.length()); + } + isFirstAfterSection = false; + } else if (indent.length() >= indentLevel) { + indentLevel = indent.length(); + sections.push(createSection(path, indentLevel, comments)); + baseKey = path; + isFirstAfterSection = true; + } + } else if (line.trim().isEmpty()) { + // Currently gathered comments are reset - they are "floating", decoupled from sections. + comments.setLength(0); + comments.trimToSize(); + } + lineNum++; + } + } + + private String getPath(String baseKey, String name) { + return baseKey != null ? baseKey + "." + name : name; + } + + private Section createSection(String path, int indentLevel, StringBuilder comments) { + Section section = new Section(path, indentLevel); + addComments(path, comments); + return section; + } + + private void addComments(String path, StringBuilder comments) { + if (comments.length() > 0) { + commentMap.put(path, comments.toString()); + comments.setLength(0); + comments.trimToSize(); + } + } + + public String getComment(String path) { + return commentMap.get(path); + } + + /** + * Merges the comments into the "pure" yml. + * @param ymlPure A YML data-tree, without comments. + * @return A YML data-tree including comments. + */ + public String mergeComments(String ymlPure) { + StringBuilder sb = new StringBuilder(); + boolean isFirstAfterSection = true; + Deque
sections = new ArrayDeque<>(); + sections.push(new Section(null, 0)); + int indentLevel = 0; + String baseKey = null; + int lineNum = 1; + // First section shares comments with the header - so ignore that one + boolean isHeader = true; + for (String line : ymlPure.split("\n")) { + // Skip header + Matcher commentM = COMMENT_PATTERN.matcher(line); + if (isHeader && (commentM.matches() || line.trim().isEmpty())) { + continue; // Skip header + } + isHeader = false; + Matcher sectionM = SECTION_PATTERN.matcher(line); + if (sectionM.matches()) { + String name = sectionM.group("name").trim(); + String value = sectionM.group("value"); + String indent = sectionM.group("indent"); + if (isFirstAfterSection && indent.length() > indentLevel) { + indentLevel = indent.length(); + sections.peek().setIndentation(indentLevel); + } else if (indent.length() < indentLevel) { + while (indent.length() < indentLevel && !sections.isEmpty()) { + sections.pop(); + baseKey = sections.peek().getPath(); + indentLevel = sections.peek().getIndentation(); + isFirstAfterSection = false; + } + } + String path = getPath(baseKey, name); + String comment = getComment(path); + if (comment != null) { + sb.append((lineNum > 1 ? "\n" : "") + comment + .replaceAll("^#", Matcher.quoteReplacement(indent + "#")) + .replaceAll("\n#", Matcher.quoteReplacement("\n" + indent + "#"))); + } + if (value != null && !value.trim().isEmpty()) { + // Scalar with value + isFirstAfterSection = false; + } else if (indent.length() >= indentLevel) { + indentLevel = indent.length(); + sections.push(new Section(path, indentLevel)); + baseKey = path; + isFirstAfterSection = true; + } + } + lineNum++; + sb.append(line + "\n"); + } + return sb.toString().replaceAll("\r\n", "\n").replaceAll("\n\r", "\n").replaceAll("\n", "\r\n"); + } + + public void load(Reader reader) throws IOException { + readLines(new BufferedReader(reader)); + } + + public void loadFromString(String contents) { + try { + readLines(new BufferedReader(new StringReader(contents))); + } catch (IOException e) { + throw new IllegalStateException("Unable to read from string", e); + } + } + + + private static class Section { + private int indentation; + private final String path; + + private Section(String name, int indentation) { + this.indentation = indentation; + this.path = name; + } + + public int getIndentation() { + return indentation; + } + + public String getPath() { + return path; + } + + public void setIndentation(int indentLevel) { + indentation = indentLevel; + } + } +} \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/util/YmlConfiguration.java b/src/main/java/us/tastybento/bskyblock/util/YmlConfiguration.java new file mode 100644 index 000000000..8ca1b6769 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/util/YmlConfiguration.java @@ -0,0 +1,44 @@ +package us.tastybento.bskyblock.util; + +import java.util.Map; + +import org.bukkit.configuration.InvalidConfigurationException; +import org.bukkit.configuration.file.YamlConfiguration; + +/** + * A YamlConfiguration that supports comments + * + * Note: This includes a VERY SIMPLISTIC Yaml-parser, which sole purpose is to detect and store comments. + */ +public class YmlConfiguration extends YamlConfiguration { + private YmlCommentParser commentParser = new YmlCommentParser(); + + public String getComment(String key) { + String comment = commentParser.getComment(key); + return comment != null ? comment.replaceAll("^# ?", "").replaceAll("\n# ?", "") : null; + } + + public Map getComments() { + return commentParser.getCommentMap(); + } + + public void addComment(String path, String comment) { + commentParser.addComment(path, comment); + } + public void addComments(Map comments) { + commentParser.addComments(comments); + } + + @Override + public void loadFromString(String contents) throws InvalidConfigurationException { + super.loadFromString(contents); + commentParser.loadFromString(contents); + } + + @Override + public String saveToString() { + String ymlPure = super.saveToString(); + return commentParser.mergeComments(ymlPure); + } + +} \ No newline at end of file diff --git a/src/test/java/bskyblock/TestBSkyBlock.java b/src/test/java/bskyblock/TestBSkyBlock.java index d40a2df3b..18836760f 100644 --- a/src/test/java/bskyblock/TestBSkyBlock.java +++ b/src/test/java/bskyblock/TestBSkyBlock.java @@ -1,33 +1,22 @@ package bskyblock; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNotSame; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.mock; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; -import java.util.Map.Entry; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; -import java.util.logging.Logger; - import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.ItemFactory; import org.junit.BeforeClass; import org.junit.Test; +import org.junit.runner.RunWith; import org.mockito.Mockito; - +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; +import org.powermock.modules.junit4.PowerMockRunner; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.Constants; import us.tastybento.bskyblock.api.commands.CompositeCommand; @@ -35,15 +24,30 @@ import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.api.events.IslandBaseEvent; import us.tastybento.bskyblock.api.events.team.TeamEvent; import us.tastybento.bskyblock.database.objects.Island; +import us.tastybento.bskyblock.lists.Flags; +import us.tastybento.bskyblock.managers.FlagsManager; import us.tastybento.bskyblock.managers.RanksManager; import us.tastybento.bskyblock.util.Util; +import java.util.*; +import java.util.Map.Entry; +import java.util.logging.Logger; + +import static org.junit.Assert.*; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.powermock.api.mockito.PowerMockito.mockStatic; + +//@RunWith(PowerMockRunner.class) +//@SuppressStaticInitializationFor("us.tastybento.BSkyBlock") +//@PrepareForTest( { BSkyBlock.class }) public class TestBSkyBlock { private final UUID playerUUID = UUID.randomUUID(); private static CommandSender sender; private static Player player; private static Location location; private static BSkyBlock plugin; + private static FlagsManager flagsManager; @BeforeClass public static void setUp() { @@ -72,7 +76,19 @@ public class TestBSkyBlock { Mockito.when(location.getBlockX()).thenReturn(0); Mockito.when(location.getBlockY()).thenReturn(0); Mockito.when(location.getBlockZ()).thenReturn(0); - + + // This doesn't work! + /* + mockStatic(Bukkit.class); + ItemFactory itemFactory = PowerMockito.mock(ItemFactory.class); + PowerMockito.when(Bukkit.getItemFactory()).thenReturn(itemFactory); + PowerMockito.when(itemFactory.getItemMeta(any())).thenReturn(PowerMockito.mock(ItemMeta.class)); + + mockStatic(BSkyBlock.class); + flagsManager = mock(FlagsManager.class); + PowerMockito.when(BSkyBlock.getInstance()).thenReturn(plugin); + Mockito.when(plugin.getFlagsManager()).thenReturn(flagsManager); + */ } @Test @@ -265,8 +281,7 @@ public class TestBSkyBlock { @Override public boolean execute(User user, List args) { Bukkit.getLogger().info("args are " + args.toString()); - if (args.size() == 3) return true; - return false; + return args.size() == 3 ? true : false; } } @@ -325,8 +340,37 @@ public class TestBSkyBlock { island.removeFromBanList(member1); assertFalse(island.getBanned().contains(member1)); - - //island.isAllowed(visitor, Flags.BREAK_BLOCKS); + // Protection + // Set up protection settings - members can break blocks, visitors and place blocks + // These tests do not work because of static method calls in the code and Bukkit. + /* + island.setFlag(Flags.BREAK_BLOCKS, RanksManager.MEMBER_RANK); + island.setFlag(Flags.PLACE_BLOCKS, RanksManager.VISITOR_RANK); + + // Owner should be able to do anything + assertTrue(island.isAllowed(owner, Flags.PLACE_BLOCKS)); + assertTrue(island.isAllowed(owner, Flags.BREAK_BLOCKS)); + + // Visitor can only place blocks + assertTrue(island.isAllowed(visitor, Flags.PLACE_BLOCKS)); + assertFalse(island.isAllowed(visitor, Flags.BREAK_BLOCKS)); + + // Check if the members have capability + User mem1 = User.getInstance(member1); + User mem2 = User.getInstance(member2); + User mem3 = User.getInstance(member3); + + assertTrue(island.isAllowed(mem1, Flags.PLACE_BLOCKS)); + assertTrue(island.isAllowed(mem1, Flags.BREAK_BLOCKS)); + + assertTrue(island.isAllowed(mem2, Flags.PLACE_BLOCKS)); + assertTrue(island.isAllowed(mem2, Flags.BREAK_BLOCKS)); + + // Member 3 is no longer a member and is a visitor + assertTrue(island.isAllowed(mem3, Flags.PLACE_BLOCKS)); + assertTrue(island.isAllowed(mem3, Flags.BREAK_BLOCKS)); + +*/ /* * * Score approach: