diff --git a/pom.xml b/pom.xml index b855faa..8609c02 100644 --- a/pom.xml +++ b/pom.xml @@ -138,6 +138,11 @@ javassist 3.20.0-GA + + org.mockito + mockito-core + 2.7.20 + TBMCPlugins diff --git a/src/main/java/buttondevteam/lib/TBMCCoreAPI.java b/src/main/java/buttondevteam/lib/TBMCCoreAPI.java index 62c0e37..469095e 100644 --- a/src/main/java/buttondevteam/lib/TBMCCoreAPI.java +++ b/src/main/java/buttondevteam/lib/TBMCCoreAPI.java @@ -21,7 +21,7 @@ import buttondevteam.core.MainPlugin; import buttondevteam.lib.player.ChromaGamerBase; import buttondevteam.lib.potato.DebugPotato; -public final class TBMCCoreAPI { +public class TBMCCoreAPI { static List coders = new ArrayList() { private static final long serialVersionUID = -4462159250738367334L; { diff --git a/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java b/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java index aa64747..1282ddb 100644 --- a/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java +++ b/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java @@ -46,7 +46,7 @@ public abstract class ChromaGamerBase implements AutoCloseable { public abstract String getFileName(); /** - * The 'id' must be always set + * Use {@link #data()} or {@link #data(String)} where possible; the 'id' must be always set */ protected YamlConfiguration plugindata; @@ -177,7 +177,7 @@ public abstract class ChromaGamerBase implements AutoCloseable { protected PlayerData data(String sectionname) { if (!getClass().isAnnotationPresent(UserClass.class)) throw new RuntimeException("Class not registered as a user class! Use @UserClass"); - String mname = sectionname + "." + new Exception().getStackTrace()[1].getMethodName(); + String mname = sectionname + "." + new Exception().getStackTrace()[2].getMethodName(); if (!datamap.containsKey(mname)) datamap.put(mname, new PlayerData(mname, plugindata)); return datamap.get(mname); @@ -192,12 +192,45 @@ public abstract class ChromaGamerBase implements AutoCloseable { protected PlayerData data() { if (!getClass().isAnnotationPresent(UserClass.class)) throw new RuntimeException("Class not registered as a user class! Use @UserClass"); - String mname = new Exception().getStackTrace()[2].getMethodName(); + String mname = new Exception().getStackTrace()[1].getMethodName(); if (!datamap.containsKey(mname)) datamap.put(mname, new PlayerData(mname, plugindata)); return datamap.get(mname); } + @SuppressWarnings("rawtypes") + private HashMap dataenummap = new HashMap<>(); + + /** + * Use from a data() method, which is in a method with the name of the key. For example, use flair() for the enclosing method of the outer data() to save to and load from "flair" + * + * @return A data object with methods to get and set + */ + @SuppressWarnings("unchecked") + protected > EnumPlayerData dataEnum(String sectionname, Class cl) { + if (!getClass().isAnnotationPresent(UserClass.class)) + throw new RuntimeException("Class not registered as a user class! Use @UserClass"); + String mname = sectionname + "." + new Exception().getStackTrace()[2].getMethodName(); + if (!dataenummap.containsKey(mname)) + dataenummap.put(mname, new EnumPlayerData(mname, plugindata, cl)); + return dataenummap.get(mname); + } + + /** + * Use from a method with the name of the key. For example, use flair() for the enclosing method to save to and load from "flair" + * + * @return A data object with methods to get and set + */ + @SuppressWarnings("unchecked") + protected > EnumPlayerData dataEnum(Class cl) { + if (!getClass().isAnnotationPresent(UserClass.class)) + throw new RuntimeException("Class not registered as a user class! Use @UserClass"); + String mname = new Exception().getStackTrace()[1].getMethodName(); + if (!dataenummap.containsKey(mname)) + dataenummap.put(mname, new EnumPlayerData(mname, plugindata, cl)); + return dataenummap.get(mname); + } + /** * Get player information. This method calls the {@link TBMCPlayerGetInfoEvent} to get all the player information across the TBMC plugins. * diff --git a/src/main/java/buttondevteam/lib/player/EnumPlayerData.java b/src/main/java/buttondevteam/lib/player/EnumPlayerData.java new file mode 100644 index 0000000..586e845 --- /dev/null +++ b/src/main/java/buttondevteam/lib/player/EnumPlayerData.java @@ -0,0 +1,21 @@ +package buttondevteam.lib.player; + +import org.bukkit.configuration.file.YamlConfiguration; + +public class EnumPlayerData> { + private PlayerData data; + private Class cl; + + public EnumPlayerData(String name, YamlConfiguration yaml, Class cl) { + data = new PlayerData(name, yaml); + this.cl = cl; + } + + public T get() { + return Enum.valueOf(cl, data.get()); + } + + public void set(T value) { + data.set(value.toString()); + } +} diff --git a/src/main/java/buttondevteam/lib/player/PlayerData.java b/src/main/java/buttondevteam/lib/player/PlayerData.java index f729907..fb5326b 100644 --- a/src/main/java/buttondevteam/lib/player/PlayerData.java +++ b/src/main/java/buttondevteam/lib/player/PlayerData.java @@ -16,7 +16,7 @@ public class PlayerData { return (T) yaml.get(name); } - public void set(String value) { + public void set(T value) { yaml.set(name, value); } } diff --git a/src/main/java/buttondevteam/lib/player/TBMCPlayerBase.java b/src/main/java/buttondevteam/lib/player/TBMCPlayerBase.java index 87382a5..3a174c5 100644 --- a/src/main/java/buttondevteam/lib/player/TBMCPlayerBase.java +++ b/src/main/java/buttondevteam/lib/player/TBMCPlayerBase.java @@ -26,7 +26,8 @@ public abstract class TBMCPlayerBase extends ChromaGamerBase { protected TBMCPlayerBase() { if (getClass().isAnnotationPresent(PlayerClass.class)) pluginname = getClass().getAnnotation(PlayerClass.class).pluginname(); - throw new RuntimeException("Class not defined as player class! Use @PlayerClass"); + else + throw new RuntimeException("Class not defined as player class! Use @PlayerClass"); } public UUID getUUID() { @@ -42,7 +43,6 @@ public abstract class TBMCPlayerBase extends ChromaGamerBase { return getUUID().toString(); } - /** * Use from a method with the name of the key. For example, use flair() for the enclosing method to save to and load from "flair" * @@ -52,6 +52,15 @@ public abstract class TBMCPlayerBase extends ChromaGamerBase { return super.data(pluginname); } + /** + * Use from a method with the name of the key. For example, use flair() for the enclosing method to save to and load from "flair" + * + * @return A data object with methods to get and set + */ + protected > EnumPlayerData dataEnum(Class cl) { + return super.dataEnum(pluginname, cl); + } + /** * Get player as a plugin player * diff --git a/src/main/java/buttondevteam/lib/player/UserClass.java b/src/main/java/buttondevteam/lib/player/UserClass.java index 2f389ac..bbe9b59 100644 --- a/src/main/java/buttondevteam/lib/player/UserClass.java +++ b/src/main/java/buttondevteam/lib/player/UserClass.java @@ -1,6 +1,7 @@ package buttondevteam.lib.player; import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @@ -13,6 +14,7 @@ import java.lang.annotation.Target; */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) +@Inherited public @interface UserClass { /** * Indicates which folder should the player files be saved in. diff --git a/src/test/java/buttondevteam/core/PlayerDataTest.java b/src/test/java/buttondevteam/core/PlayerDataTest.java new file mode 100644 index 0000000..4abde02 --- /dev/null +++ b/src/test/java/buttondevteam/core/PlayerDataTest.java @@ -0,0 +1,63 @@ +package buttondevteam.core; + +import java.util.UUID; +import java.util.logging.Logger; + +import org.bukkit.Bukkit; +import org.bukkit.Server; +import org.bukkit.plugin.PluginManager; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +import buttondevteam.core.TestPlayerClass.TestEnum; +import buttondevteam.lib.player.TBMCPlayerBase; +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +public class PlayerDataTest extends TestCase { + public PlayerDataTest() { + super("Player data test"); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() { + return new TestSuite(PlayerDataTest.class); + } + + public void testConfig() { + Bukkit.setServer(Mockito.mock(Server.class, new Answer() { + + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + // System.out.println("Return type: " + invocation.getMethod().getReturnType()); + // System.out.println(String.class.isAssignableFrom(invocation.getMethod().getReturnType())); + if (String.class.isAssignableFrom(invocation.getMethod().getReturnType())) + return ""; + if (Logger.class.isAssignableFrom(invocation.getMethod().getReturnType())) + return Logger.getAnonymousLogger(); + if (PluginManager.class.isAssignableFrom(invocation.getMethod().getReturnType())) + return Mockito.mock(PluginManager.class); + return null; + } + })); + UUID uuid = new UUID(0L, 0L); + try (TestPlayerClass p = TBMCPlayerBase.getPlayer(uuid, TestPlayerClass.class)) { + p.PlayerName().set("Test"); + assertEquals("Test", p.PlayerName().get()); + p.testenum().set(TestEnum.A); // TODO: Fix enum saving + assertEquals(TestEnum.A, p.testenum().get()); + } catch (Exception e) { + e.printStackTrace(); + } + try (TestPlayerClass p = TBMCPlayerBase.getPlayer(uuid, TestPlayerClass.class)) { + assertEquals("Test", p.PlayerName().get()); + assertEquals(TestEnum.A, p.testenum().get()); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/test/java/buttondevteam/core/TestPlayerClass.java b/src/test/java/buttondevteam/core/TestPlayerClass.java new file mode 100644 index 0000000..42010db --- /dev/null +++ b/src/test/java/buttondevteam/core/TestPlayerClass.java @@ -0,0 +1,16 @@ +package buttondevteam.core; + +import buttondevteam.lib.player.EnumPlayerData; +import buttondevteam.lib.player.PlayerClass; +import buttondevteam.lib.player.TBMCPlayerBase; + +@PlayerClass(pluginname = "TestPlugin") +public class TestPlayerClass extends TBMCPlayerBase { + public EnumPlayerData testenum() { + return dataEnum(TestEnum.class); + } + + public enum TestEnum { + A, B + } +}