From b56ad64dd9fe1881fc004f2b34920e56b45bed90 Mon Sep 17 00:00:00 2001 From: Querz Date: Mon, 30 Sep 2019 17:15:24 +0200 Subject: [PATCH] throw exception when tryng to add tag of different type to non-empty untyped listtag --- src/main/java/net/querz/nbt/ListTag.java | 8 +++++++- src/test/java/net/querz/nbt/ListTagTest.java | 12 ++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/querz/nbt/ListTag.java b/src/main/java/net/querz/nbt/ListTag.java index dd54744c..321c53f4 100644 --- a/src/main/java/net/querz/nbt/ListTag.java +++ b/src/main/java/net/querz/nbt/ListTag.java @@ -115,10 +115,16 @@ public void add(T t) { public void add(int index, T t) { Objects.requireNonNull(t); - getValue().add(index, t); if (typeClass == null || typeClass == EndTag.class) { typeClass = t.getClass(); + } else if (typeClass != t.getClass()) { + throw new ClassCastException( + String.format("cannot add %s to ListTag<%s>", + t.getClass().getSimpleName(), + typeClass.getSimpleName())); } + getValue().add(index, t); + } public void addAll(Collection t) { diff --git a/src/test/java/net/querz/nbt/ListTagTest.java b/src/test/java/net/querz/nbt/ListTagTest.java index 40602c13..243db1c1 100644 --- a/src/test/java/net/querz/nbt/ListTagTest.java +++ b/src/test/java/net/querz/nbt/ListTagTest.java @@ -203,6 +203,18 @@ public void testCasting() { assertEquals(lb, lg); //only allow casting once from untyped list to typed list assertThrowsRuntimeException(lg::asShortTagList, ClassCastException.class); + + //adding generic Tags to an empty list + @SuppressWarnings("unchecked") + ListTag> u = (ListTag>) TagFactory.fromID(9); + assertEquals(EndTag.class, u.getTypeClass()); + assertThrowsNoRuntimeException(() -> u.add(new StringTag())); + assertEquals(StringTag.class, u.getTypeClass()); + assertThrowsRuntimeException(() -> u.add(new ByteTag()), ClassCastException.class); + assertThrowsNoRuntimeException(() -> u.add(new StringTag())); + assertEquals(2, u.size()); + + } public void testCompareTo() {