Add Custom Anvil Recipe API test

This commit is contained in:
alexcrea 2024-11-15 14:46:33 +01:00
parent 8af77d31c3
commit 2e7a9a8bd1
No known key found for this signature in database
GPG key ID: 43FD265DB0DBF91F
8 changed files with 282 additions and 17 deletions

View file

@ -78,6 +78,7 @@ public class CustomAnvilRecipeApi {
return true; return true;
} }
// TODO remove by name and/or by builder (as name is keept) (and maybe create a get by name)
/** /**
* Remove a custom anvil recipe. * Remove a custom anvil recipe.
* *
@ -86,7 +87,8 @@ public class CustomAnvilRecipeApi {
*/ */
public static boolean removeRecipe(@NotNull AnvilCustomRecipe recipe){ public static boolean removeRecipe(@NotNull AnvilCustomRecipe recipe){
// Remove from registry // Remove from registry
ConfigHolder.CUSTOM_RECIPE_HOLDER.getRecipeManager().cleanRemove(recipe); boolean result = ConfigHolder.CUSTOM_RECIPE_HOLDER.getRecipeManager().cleanRemove(recipe);
if(!result) return false;
// Delete and save to file // Delete and save to file
ConfigHolder.CUSTOM_RECIPE_HOLDER.delete(recipe.getName()); ConfigHolder.CUSTOM_RECIPE_HOLDER.delete(recipe.getName());

View file

@ -11,13 +11,11 @@ import io.delilaheve.util.ItemUtil.setEnchantmentsUnsafe
import io.delilaheve.util.ItemUtil.unitRepair import io.delilaheve.util.ItemUtil.unitRepair
import org.bukkit.ChatColor import org.bukkit.ChatColor
import org.bukkit.entity.HumanEntity import org.bukkit.entity.HumanEntity
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority import org.bukkit.event.EventPriority
import org.bukkit.event.Listener import org.bukkit.event.Listener
import org.bukkit.event.inventory.PrepareAnvilEvent import org.bukkit.event.inventory.PrepareAnvilEvent
import org.bukkit.inventory.AnvilInventory import org.bukkit.inventory.AnvilInventory
import org.bukkit.inventory.InventoryView
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import xyz.alexcrea.cuanvil.dependency.DependencyManager import xyz.alexcrea.cuanvil.dependency.DependencyManager
import xyz.alexcrea.cuanvil.util.AnvilColorUtil import xyz.alexcrea.cuanvil.util.AnvilColorUtil

View file

@ -9,17 +9,17 @@ class CustomAnvilRecipeManager {
lateinit var recipeList: ArrayList<AnvilCustomRecipe> lateinit var recipeList: ArrayList<AnvilCustomRecipe>
lateinit var recipeByMat: LinkedHashMap<Material, ArrayList<AnvilCustomRecipe>> lateinit var recipeByMat: HashMap<Material, ArrayList<AnvilCustomRecipe>>
fun prepareRecipes(config: FileConfiguration) { fun prepareRecipes(config: FileConfiguration) {
recipeList = ArrayList() recipeList = ArrayList()
recipeByMat = LinkedHashMap() recipeByMat = HashMap()
// read all configs // read all configs
val keys = config.getKeys(false) val keys = config.getKeys(false)
for (key in keys) { for (key in keys) {
val recipe = AnvilCustomRecipe.getFromConfig(key) val recipe = AnvilCustomRecipe.getFromConfig(key)
if(recipe == null){ if (recipe == null) {
CustomAnvil.log("Can't load recipe $key") CustomAnvil.log("Can't load recipe $key")
continue continue
} }
@ -30,34 +30,34 @@ class CustomAnvilRecipeManager {
} }
fun cleanAddNew(recipe: AnvilCustomRecipe){ fun cleanAddNew(recipe: AnvilCustomRecipe) {
recipeList.add(recipe) recipeList.add(recipe)
val leftItem = recipe.leftItem val leftItem = recipe.leftItem
if(leftItem != null){ if (leftItem != null) {
addToMatMap(recipe, leftItem) addToMatMap(recipe, leftItem)
} }
} }
fun cleanSetLeftItem(recipe: AnvilCustomRecipe, leftItem: ItemStack?){ fun cleanSetLeftItem(recipe: AnvilCustomRecipe, leftItem: ItemStack?) {
// Remove left item mat if exist // Remove left item mat if exist
val oldLeftItem = recipe.leftItem val oldLeftItem = recipe.leftItem
if(oldLeftItem != null){ if (oldLeftItem != null) {
val oldMat = oldLeftItem.type val oldMat = oldLeftItem.type
val test = recipeByMat[oldMat] val test = recipeByMat[oldMat]
test!!.remove(recipe) test!!.remove(recipe)
} }
if(leftItem != null){ if (leftItem != null) {
addToMatMap(recipe, leftItem) addToMatMap(recipe, leftItem)
} }
recipe.leftItem = leftItem recipe.leftItem = leftItem
} }
private fun addToMatMap(recipe: AnvilCustomRecipe, leftItem: ItemStack){ private fun addToMatMap(recipe: AnvilCustomRecipe, leftItem: ItemStack) {
var recipeList = recipeByMat[leftItem.type] var recipeList = recipeByMat[leftItem.type]
if(recipeList == null){ if (recipeList == null) {
recipeList = ArrayList() recipeList = ArrayList()
recipeByMat[leftItem.type] = recipeList recipeByMat[leftItem.type] = recipeList
} }
@ -65,11 +65,14 @@ class CustomAnvilRecipeManager {
} }
fun cleanRemove(recipe: AnvilCustomRecipe) { fun cleanRemove(recipe: AnvilCustomRecipe): Boolean {
recipeList.remove(recipe) val exist = recipeList.remove(recipe)
if (exist) {
cleanSetLeftItem(recipe, null) cleanSetLeftItem(recipe, null)
}
return exist;
} }
} }

View file

@ -0,0 +1,85 @@
package xyz.alexcrea.cuanvil.api;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import xyz.alexcrea.cuanvil.tests.SharedOnlyMockBukkit;
import static org.junit.jupiter.api.Assertions.*;
public class AnvilRecipeBuilderTest extends SharedOnlyMockBukkit {
private AnvilRecipeBuilder builder;
@BeforeEach
public void setup() {
builder = new AnvilRecipeBuilder("test");
}
@Test
void createBuilder_NoLeftItem(){
builder.setResultItem(new ItemStack(Material.STICK));
assertNull(builder.build());
}
@Test
void createBuilder_NoResultItem(){
builder.setLeftItem(new ItemStack(Material.STICK));
assertNull(builder.build());
}
@Test
void createBuilder_minimalist(){
builder.setLeftItem(new ItemStack(Material.STICK))
.setResultItem(new ItemStack(Material.STICK));
assertNotNull(builder.build());
}
@Test
void setLeftItem(){
assertNull(builder.getLeftItem());
builder.setLeftItem(new ItemStack(Material.STICK));
assertNotNull(builder.getLeftItem());
}
@Test
void setRightItem(){
assertNull(builder.getRightItem());
builder.setRightItem(new ItemStack(Material.STICK));
assertNotNull(builder.getRightItem());
}
@Test
void setResultItem(){
assertNull(builder.getResultItem());
builder.setResultItem(new ItemStack(Material.STICK));
assertNotNull(builder.getResultItem());
}
@Test
void setXpCostPerCraft(){
assertEquals(1, builder.getXpCostPerCraft());
builder.setXpCostPerCraft(2);
assertEquals(2, builder.getXpCostPerCraft());
}
@Test
void setExactCount(){
assertTrue(builder.isExactCount());
builder.setExactCount(false);
assertFalse(builder.isExactCount());
}
@Test
void setName(){
assertEquals("test", builder.getName());
builder.setName("other");
assertEquals("other", builder.getName());
}
}

View file

@ -58,8 +58,9 @@ public class ConflictApiTests extends ConfigResetCustomAnvilTest {
AnvilFuseTestData legalResultData = new AnvilFuseTestData( AnvilFuseTestData legalResultData = new AnvilFuseTestData(
sharpness1, arthropods1, sharpness1, arthropods1,
illegalResult illegalResult,
// TODO add expected price // TODO add expected price
null
); );
CAEnchantment sharpness = EnchantmentApi.getByKey(Enchantment.SHARPNESS.getKey()); CAEnchantment sharpness = EnchantmentApi.getByKey(Enchantment.SHARPNESS.getKey());

View file

@ -0,0 +1,151 @@
package xyz.alexcrea.cuanvil.api;
import org.bukkit.Material;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.AnvilInventory;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.Nullable;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockbukkit.mockbukkit.entity.PlayerMock;
import org.mockbukkit.mockbukkit.inventory.ItemStackMock;
import xyz.alexcrea.cuanvil.config.ConfigHolder;
import xyz.alexcrea.cuanvil.recipe.AnvilCustomRecipe;
import xyz.alexcrea.cuanvil.tests.ConfigResetCustomAnvilTest;
import xyz.alexcrea.cuanvil.util.AnvilFuseTestData;
import xyz.alexcrea.cuanvil.util.AnvilFuseTestUtil;
import static org.junit.jupiter.api.Assertions.*;
public class CustomAnvilRecipeApiTests extends ConfigResetCustomAnvilTest {
private AnvilInventory anvil;
private PlayerMock player;
@Override
@BeforeEach
public void setUp() {
super.setUp();
// Mock used player & open anvil
player = server.addPlayer();
Inventory anvil = server.createInventory(player, InventoryType.ANVIL);
this.anvil = (AnvilInventory) anvil;
player.openInventory(anvil);
ConfigHolder.DEFAULT_CONFIG.getConfig().set("debug_log", true);
ConfigHolder.DEFAULT_CONFIG.getConfig().set("debug_log_verbose", true);
}
@Test
public void testBasicRecipe() {
String recipeName = "stick_recipe";
ItemStack stick = new ItemStackMock(Material.STICK);
AnvilFuseTestData nullResultData = new AnvilFuseTestData(
stick, stick,
null
);
AnvilFuseTestData legalResultData = new AnvilFuseTestData(
stick, stick,
null, stick, null,
// TODO add expected price
null,
null, null
);
// Testing default conflict (no recipe exist)
AnvilFuseTestUtil.executeAnvilTest(anvil, player, nullResultData);
// Add and test recipe
AnvilRecipeBuilder builder = new AnvilRecipeBuilder(recipeName);
builder.setExactCount(true).setLeftItem(stick).setResultItem(stick).setXpCostPerCraft(2);
assertTrue(builder.registerIfAbsent());
AnvilFuseTestUtil.executeAnvilTest(anvil, player, legalResultData);
AnvilCustomRecipe recipe = getByName(recipeName);
assertNotNull(recipe);
// Remove recipe
assertTrue(CustomAnvilRecipeApi.removeRecipe(recipe));
assertFalse(CustomAnvilRecipeApi.removeRecipe(recipe));
AnvilFuseTestUtil.executeAnvilTest(anvil, player, nullResultData);
recipe = getByName(recipeName);
assertNull(recipe);
// Try to add deleted recipe with no override (should not add)
assertFalse(CustomAnvilRecipeApi.addRecipe(builder, false));
AnvilFuseTestUtil.executeAnvilTest(anvil, player, nullResultData);
recipe = getByName(recipeName);
assertNull(recipe);
// Try to add deleted recipe with override (should add)
assertTrue(CustomAnvilRecipeApi.addRecipe(builder, true));
AnvilFuseTestUtil.executeAnvilTest(anvil, player, legalResultData);
recipe = getByName(recipeName);
assertNotNull(recipe);
}
@Test
public void testUnitRecipe() {
String recipeName = "stick_recipe";
ItemStack stick = new ItemStackMock(Material.STICK);
ItemStack stick2 = new ItemStackMock(Material.STICK, 2);
ItemStack stick5 = new ItemStackMock(Material.STICK, 5);
ItemStack stick10 = new ItemStackMock(Material.STICK, 10);
AnvilFuseTestData nullResultData = new AnvilFuseTestData(
stick, stick,
null
);
AnvilFuseTestData legalResultData1 = new AnvilFuseTestData(
stick, stick,
null, stick2, null,
// TODO add expected price
null,
null, null
);
AnvilFuseTestData legalResultData2 = new AnvilFuseTestData(
stick5, stick,
null, stick10, null,
// TODO add expected price
null,
null, null
);
AnvilFuseTestUtil.executeAnvilTest(anvil, player, nullResultData);
AnvilRecipeBuilder builder = new AnvilRecipeBuilder(recipeName);
builder.setExactCount(false)
.setLeftItem(stick)
.setResultItem(stick2)
.setXpCostPerCraft(2);
assertTrue(builder.registerIfAbsent());
// Now working test
AnvilFuseTestUtil.executeAnvilTest(anvil, player, legalResultData1);
AnvilFuseTestUtil.executeAnvilTest(anvil, player, legalResultData2);
}
@Nullable
public static AnvilCustomRecipe getByName(String name){
for (AnvilCustomRecipe registeredRecipe : CustomAnvilRecipeApi.getRegisteredRecipes()) {
if(registeredRecipe.getName().contentEquals(name)){
return registeredRecipe;
}
}
return null;
}
}

View file

@ -0,0 +1,24 @@
package xyz.alexcrea.cuanvil.tests;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.mockbukkit.mockbukkit.MockBukkit;
import org.mockbukkit.mockbukkit.ServerMock;
public class SharedOnlyMockBukkit {
protected static ServerMock server;
@BeforeAll
public static void setUp() {
// Start the mock server
server = MockBukkit.mock();
}
@AfterAll
public static void tearDown() {
// Stop the mock server
MockBukkit.unmock();
}
}

View file

@ -132,6 +132,7 @@ public class AnvilFuseTestUtil {
@Nullable ItemStack toPlace, @Nullable ItemStack toPlace,
@Nullable ItemStack expectedResult){ @Nullable ItemStack expectedResult){
anvil.setItem(slot, toPlace); anvil.setItem(slot, toPlace);
anvil.setItem(2, null);
AnvilFuseTestUtil.imitateAnvilUpdate(player, anvil); AnvilFuseTestUtil.imitateAnvilUpdate(player, anvil);
ItemStack result = anvil.getItem(2); ItemStack result = anvil.getItem(2);