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:
+ *
+ * - Keep track of indentation-levels and sections.
+ * - Handle comments.
+ *
+ */
+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: