diff --git a/src/main/java/org/glavo/nbt/tag/ParentTag.java b/src/main/java/org/glavo/nbt/tag/ParentTag.java index 9abc5b1..ccfad9d 100644 --- a/src/main/java/org/glavo/nbt/tag/ParentTag.java +++ b/src/main/java/org/glavo/nbt/tag/ParentTag.java @@ -95,7 +95,8 @@ final void ensureTagsCapacityForAdd() { int arrayEnd = Math.min(size, tags.length); if (index < arrayEnd - 1) { - System.arraycopy(tags, index + 1, tags, index, size - index); + System.arraycopy(tags, index + 1, tags, index, size - index - 1); + tags[arrayEnd - 1] = null; } else if (oldTag != null) { tags[index] = null; } @@ -179,7 +180,7 @@ final void moveTagToLast(T tag) { /// If the `tag` is already a child of another tag, removes it from old parent and adds it to this tag. @Contract(value = "_ -> this", mutates = "this,param1") public abstract ParentTag addTag(@Flow(targetIsContainer = true) - T tag) throws IllegalArgumentException; + T tag) throws IllegalArgumentException; /// Adds all `tags` to this tag. /// diff --git a/src/test/java/org/glavo/nbt/tag/ListTagTest.java b/src/test/java/org/glavo/nbt/tag/ListTagTest.java index 79ddb02..00038c4 100644 --- a/src/test/java/org/glavo/nbt/tag/ListTagTest.java +++ b/src/test/java/org/glavo/nbt/tag/ListTagTest.java @@ -15,6 +15,7 @@ */ package org.glavo.nbt.tag; +import org.glavo.nbt.internal.ArrayAccessor; import org.junit.jupiter.api.Test; import java.util.function.Supplier; @@ -238,4 +239,49 @@ void testCloneEqualsAndIndependentChildren() { assertEquals("changed", cloneFirst.get()); assertContentNotEquals(tag, clone); } + + @Test + void testRemoveAt() { + ListTag list = new ListTag<>(); + for (int i = 0; i < 9; i++) { + list.addTag(new IntTag(i)); + } + assertEquals(new IntTag(6), list.removeTagAt(6)); + assertEquals(8, list.size()); + assertArrayEquals(new IntTag[]{ + new IntTag(0), new IntTag(1), new IntTag(2), + new IntTag(3), new IntTag(4), new IntTag(5), + new IntTag(7), new IntTag(8), null, + null, null, null}, list.tags); + } + + @Test + void testRemoveAtCapacity() { + ListTag list = new ListTag<>(); + for (int i = 0; i < ArrayAccessor.DEFAULT_CAPACITY; i++) { + list.addTag(new IntTag(i)); + } + assertEquals(new IntTag(6), list.removeTagAt(6)); + assertEquals(ArrayAccessor.DEFAULT_CAPACITY - 1, list.size()); + assertArrayEquals(new IntTag[]{ + new IntTag(0), new IntTag(1), new IntTag(2), + new IntTag(3), new IntTag(4), new IntTag(5), + new IntTag(7), new IntTag(8), new IntTag(9), + new IntTag(10), new IntTag(11), null}, list.tags); + } + + @Test + void testRemoveAtEnd() { + ListTag list = new ListTag<>(); + for (int i = 0; i < ArrayAccessor.DEFAULT_CAPACITY; i++) { + list.addTag(new IntTag(i)); + } + assertEquals(new IntTag(11), list.removeTagAt(11)); + assertEquals(ArrayAccessor.DEFAULT_CAPACITY - 1, list.size()); + assertArrayEquals(new IntTag[]{ + new IntTag(0), new IntTag(1), new IntTag(2), + new IntTag(3), new IntTag(4), new IntTag(5), + new IntTag(6), new IntTag(7), new IntTag(8), + new IntTag(9), new IntTag(10), null}, list.tags); + } }