fn: Add some tests for SkinManager

This commit is contained in:
Oliver
2025-04-17 22:42:00 +02:00
parent 6cbf0df897
commit af2e40e00b
7 changed files with 247 additions and 4 deletions

View File

@@ -2,6 +2,8 @@ package de.oliver.fancynpcs.api.skins;
import org.lushplugins.chatcolorhandler.ChatColorHandler;
import java.util.Objects;
public class SkinData {
private String identifier;
@@ -68,6 +70,31 @@ public class SkinData {
this.textureSignature = textureSignature;
}
@Override
public String toString() {
return "SkinData{" +
"identifier='" + identifier + '\'' +
", variant=" + variant +
", textureValue='" + textureValue + '\'' +
", textureSignature='" + textureSignature + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
SkinData skinData = (SkinData) o;
return Objects.equals(identifier, skinData.identifier) &&
variant == skinData.variant &&
Objects.equals(textureValue, skinData.textureValue) &&
Objects.equals(textureSignature, skinData.textureSignature);
}
@Override
public int hashCode() {
return Objects.hash(identifier, variant, textureValue, textureSignature);
}
public enum SkinVariant {
AUTO,
SLIM,

View File

@@ -3,6 +3,8 @@ package de.oliver.fancynpcs.skins;
import de.oliver.fancynpcs.api.skins.SkinData;
import org.mineskin.request.GenerateRequest;
import java.util.Objects;
public class SkinGenerationRequest {
private final String id;
@@ -32,4 +34,27 @@ public class SkinGenerationRequest {
public GenerateRequest getMineskinRequest() {
return mineskinRequest;
}
@Override
public String toString() {
return "SkinGenerationRequest{" +
"id='" + id + '\'' +
", variant=" + variant +
", mineskinRequest=" + mineskinRequest +
'}';
}
@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
SkinGenerationRequest that = (SkinGenerationRequest) o;
return Objects.equals(id, that.id) &&
variant == that.variant &&
Objects.equals(mineskinRequest, that.mineskinRequest);
}
@Override
public int hashCode() {
return Objects.hash(id, variant, mineskinRequest);
}
}

View File

@@ -3,6 +3,7 @@ package de.oliver.fancynpcs.tests;
import de.oliver.fancynpcs.tests.api.ChatColorHandlerTest;
import de.oliver.fancynpcs.tests.api.CreateNpcTest;
import de.oliver.fancynpcs.tests.commands.*;
import de.oliver.fancynpcs.tests.skins.SkinManagerTest;
import de.oliver.plugintests.FPTestClass;
import org.bukkit.entity.Player;
@@ -22,6 +23,9 @@ public class FancyNpcsTests {
addTest(CreateNpcTest.class);
addTest(ChatColorHandlerTest.class);
// skin tests
addTest(SkinManagerTest.class);
// command tests
addTest(CreateCMDTest.class);
addTest(TypeCMDTest.class);

View File

@@ -8,6 +8,8 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class PlaceholderApiEnv extends PlaceholderExpansion {
public static String parsedString = "Grabsky";
public static void registerPlaceholders() {
if (!Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
return;
@@ -34,12 +36,20 @@ public class PlaceholderApiEnv extends PlaceholderExpansion {
@Override
public @Nullable String onPlaceholderRequest(Player player, @NotNull String params) {
return "Grabsky";
if (player == null) {
return null;
}
return parsedString;
}
@Override
public @Nullable String onRequest(OfflinePlayer player, @NotNull String params) {
return "Grabsky";
if (player == null) {
return null;
}
return parsedString;
}
}

View File

@@ -1,5 +1,6 @@
package de.oliver.fancynpcs.tests.api;
import de.oliver.fancynpcs.tests.PlaceholderApiEnv;
import de.oliver.plugintests.annotations.FPTest;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@@ -17,9 +18,9 @@ public class ChatColorHandlerTest {
return;
}
String input = "Player name: %player_name%";
String input = "Player name: %fn-test%";
String got = ChatColorHandler.translate(input, player, ParserTypes.placeholder());
String expected = "Player name: " + player.getName();
String expected = "Player name: " + PlaceholderApiEnv.parsedString;
expect(got).toEqual(expected);
}

View File

@@ -0,0 +1,47 @@
package de.oliver.fancynpcs.tests.skins;
import de.oliver.fancynpcs.skins.SkinGenerationQueue;
import de.oliver.fancynpcs.skins.SkinGenerationRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ScheduledFuture;
public class FakeSkinQueue implements SkinGenerationQueue {
private final List<SkinGenerationRequest> queue;
private boolean running;
public FakeSkinQueue() {
this.running = false;
this.queue = new ArrayList<>();
}
@Override
public void run() {
this.running = true;
}
@Override
public void add(SkinGenerationRequest request) {
this.queue.add(request);
}
@Override
public void clear() {
this.queue.clear();
}
@Override
public ScheduledFuture<?> getScheduler() {
return null;
}
public boolean isRunning() {
return running;
}
public List<SkinGenerationRequest> getQueue() {
return queue;
}
}

View File

@@ -0,0 +1,129 @@
package de.oliver.fancynpcs.tests.skins;
import de.oliver.fancynpcs.api.skins.SkinData;
import de.oliver.fancynpcs.skins.SkinGenerationRequest;
import de.oliver.fancynpcs.skins.SkinManagerImpl;
import de.oliver.fancynpcs.skins.cache.SkinCache;
import de.oliver.fancynpcs.skins.cache.SkinCacheData;
import de.oliver.fancynpcs.skins.cache.SkinCacheFile;
import de.oliver.fancynpcs.skins.cache.SkinCacheMemory;
import de.oliver.plugintests.annotations.FPAfterEach;
import de.oliver.plugintests.annotations.FPBeforeEach;
import de.oliver.plugintests.annotations.FPTest;
import org.bukkit.entity.Player;
import java.util.UUID;
import static de.oliver.plugintests.Expectable.expect;
public class SkinManagerTest {
private SkinManagerImpl manager;
private SkinCache memCache;
private SkinCache fileCache;
private FakeSkinQueue mojangQueue;
private FakeSkinQueue mineSkinQueue;
@FPBeforeEach
public void setUp(Player player) {
memCache = new SkinCacheMemory();
fileCache = new SkinCacheFile();
mojangQueue = new FakeSkinQueue();
mineSkinQueue = new FakeSkinQueue();
manager = new SkinManagerImpl(fileCache, memCache, mojangQueue, mineSkinQueue);
}
@FPAfterEach
public void tearDown(Player player) {
memCache.clear();
fileCache.clear();
}
@FPTest(name = "SkinManagerImpl#cacheSkin")
public void testCacheSkin(Player player) {
SkinData data = new SkinData("TestSkin", SkinData.SkinVariant.SLIM, "TestSignature", "TestTexture");
manager.cacheSkin(data);
SkinCacheData gotFromFile = fileCache.getSkin("TestSkin");
expect(gotFromFile).toBeDefined();
expect(gotFromFile.skinData()).toEqual(data);
SkinCacheData gotFromMem = memCache.getSkin("TestSkin");
expect(gotFromMem).toBeDefined();
expect(gotFromMem.skinData()).toEqual(data);
}
@FPTest(name = "SkinManagerImpl#getByUUID")
public void testGetByUUID(Player player) {
record TestCase(
String name,
UUID uuid,
SkinData.SkinVariant variant,
SkinData cachedFile,
SkinData cachedMem,
SkinData expData,
boolean expQueued,
SkinGenerationRequest mojangRequest
) {}
TestCase[] testCases = {
new TestCase(
"Skin is cached in file",
UUID.fromString("12345678-1234-1234-1234-123456789012"),
SkinData.SkinVariant.SLIM,
new SkinData("12345678-1234-1234-1234-123456789012", SkinData.SkinVariant.SLIM, "TestSignatureFile", "TestTextureFile"),
null,
new SkinData("12345678-1234-1234-1234-123456789012", SkinData.SkinVariant.SLIM, "TestSignatureFile", "TestTextureFile"),
false,
null
),
new TestCase(
"Skin is cached in memory",
UUID.fromString("12345678-1234-1234-1234-123456789012"),
SkinData.SkinVariant.SLIM,
null,
new SkinData("12345678-1234-1234-1234-123456789012", SkinData.SkinVariant.SLIM, "TestSignatureMem", "TestTextureMem"),
new SkinData("12345678-1234-1234-1234-123456789012", SkinData.SkinVariant.SLIM, "TestSignatureMem", "TestTextureMem"),
false,
null
),
new TestCase(
"Skin is not cached",
UUID.fromString("12345678-1234-1234-1234-123456789012"),
SkinData.SkinVariant.SLIM,
null,
null,
new SkinData("12345678-1234-1234-1234-123456789012", SkinData.SkinVariant.SLIM, null, null),
true,
new SkinGenerationRequest("12345678-1234-1234-1234-123456789012", SkinData.SkinVariant.SLIM)
)
};
for (TestCase testCase : testCases) {
setUp(player);
System.out.println("Running test case: " + testCase.name);
if (testCase.cachedFile != null) {
fileCache.addSkin(testCase.cachedFile);
}
if (testCase.cachedMem != null) {
memCache.addSkin(testCase.cachedMem);
}
SkinData got = manager.getByUUID(testCase.uuid, testCase.variant);
expect(got).toEqual(testCase.expData);
if (testCase.expQueued) {
expect(mojangQueue.getQueue().size()).toBe(1);
SkinGenerationRequest queued = mojangQueue.getQueue().getFirst();
expect(queued).toEqual(testCase.mojangRequest);
} else {
expect(mojangQueue.getQueue().isEmpty()).toBe(true);
}
tearDown(player);
}
}
}