From 4fea66e4488d566b30ec554f2bff45f63791e31e Mon Sep 17 00:00:00 2001 From: Jishuna Date: Fri, 8 Dec 2023 19:29:38 +1100 Subject: [PATCH] #1299: Add new PersistentDataContainer methods and clean up docs --- .../CraftPersistentDataContainer.java | 17 +++++++++++ .../PersistentDataContainerTest.java | 29 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/main/java/org/bukkit/craftbukkit/persistence/CraftPersistentDataContainer.java b/src/main/java/org/bukkit/craftbukkit/persistence/CraftPersistentDataContainer.java index 54edfead0..2c26a1714 100644 --- a/src/main/java/org/bukkit/craftbukkit/persistence/CraftPersistentDataContainer.java +++ b/src/main/java/org/bukkit/craftbukkit/persistence/CraftPersistentDataContainer.java @@ -54,6 +54,11 @@ public class CraftPersistentDataContainer implements PersistentDataContainer { return registry.isInstanceOf(type.getPrimitiveType(), value); } + @Override + public boolean has(NamespacedKey key) { + return this.customDataTags.get(key.toString()) != null; + } + @Override public Z get(NamespacedKey key, PersistentDataType type) { Preconditions.checkArgument(key != null, "The NamespacedKey key cannot be null"); @@ -99,6 +104,18 @@ public class CraftPersistentDataContainer implements PersistentDataContainer { return this.customDataTags.isEmpty(); } + @Override + public void copyTo(PersistentDataContainer other, boolean replace) { + Preconditions.checkArgument(other != null, "The target container cannot be null"); + + CraftPersistentDataContainer target = (CraftPersistentDataContainer) other; + if (replace) { + target.customDataTags.putAll(customDataTags); + } else { + customDataTags.forEach(target.customDataTags::putIfAbsent); + } + } + @Override public PersistentDataAdapterContext getAdapterContext() { return this.adapterContext; diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/PersistentDataContainerTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/PersistentDataContainerTest.java index b45afe700..169578979 100644 --- a/src/test/java/org/bukkit/craftbukkit/inventory/PersistentDataContainerTest.java +++ b/src/test/java/org/bukkit/craftbukkit/inventory/PersistentDataContainerTest.java @@ -50,6 +50,13 @@ public class PersistentDataContainerTest extends AbstractTestingBase { assertThrows(IllegalArgumentException.class, () -> itemMeta.getPersistentDataContainer().has(VALID_KEY, new PrimitiveTagType<>(boolean.class))); } + @Test + public void testHasNoType() { + ItemMeta itemMeta = createNewItemMeta(); + itemMeta.getPersistentDataContainer().set(VALID_KEY, PersistentDataType.INTEGER, 1); // We gotta set this so we at least try to compare it + assertTrue(itemMeta.getPersistentDataContainer().has(VALID_KEY)); + } + /* Getting a tag */ @@ -88,6 +95,28 @@ public class PersistentDataContainerTest extends AbstractTestingBase { return new NamespacedKey("test-plugin", keyName.toLowerCase()); } + @Test + public void testCopyTo() { + PersistentDataContainer container = createComplexItemMeta().getPersistentDataContainer(); + PersistentDataContainer target = container.getAdapterContext().newPersistentDataContainer(); + target.set(VALID_KEY, PersistentDataType.INTEGER, 1); + container.set(VALID_KEY, PersistentDataType.INTEGER, 2); + container.copyTo(target, false); + + assertEquals(1, target.get(VALID_KEY, PersistentDataType.INTEGER)); // Should not be replaced + } + + @Test + public void testCopyToReplace() { + PersistentDataContainer container = createComplexItemMeta().getPersistentDataContainer(); + PersistentDataContainer target = container.getAdapterContext().newPersistentDataContainer(); + target.set(VALID_KEY, PersistentDataType.INTEGER, 1); + container.set(VALID_KEY, PersistentDataType.INTEGER, 2); + container.copyTo(target, true); + + assertEquals(container, target); + } + /* Removing a tag */