diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/TagUtil.java b/protocol/src/main/java/net/md_5/bungee/protocol/TagUtil.java index 4be18dfa..9235a3db 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/TagUtil.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/TagUtil.java @@ -82,13 +82,27 @@ public final class TagUtil { List jsonArray = ( (JsonArray) json ).asList(); - if ( jsonArray.isEmpty() ) + Integer listType = null; + + for ( JsonElement jsonEl : jsonArray ) + { + int type = fromJson( jsonEl ).tagType(); + if ( listType == null ) + { + listType = type; + } else if ( listType != type ) + { + listType = Tag.TAG_COMPOUND; + break; + } + } + + if ( listType == null ) { return new ListTag( Tag.TAG_END, Collections.emptyList() ); } SpecificTag listTag; - int listType = fromJson( jsonArray.get( 0 ) ).tagType(); switch ( listType ) { case Tag.TAG_BYTE: @@ -124,7 +138,7 @@ public final class TagUtil for ( JsonElement jsonEl : jsonArray ) { SpecificTag subTag = fromJson( jsonEl ); - if ( !( subTag instanceof CompoundTag ) ) + if ( listType == Tag.TAG_COMPOUND && !( subTag instanceof CompoundTag ) ) { CompoundTag wrapper = new CompoundTag(); wrapper.add( "", subTag ); diff --git a/protocol/src/test/java/net/md_5/bungee/protocol/TagUtilTest.java b/protocol/src/test/java/net/md_5/bungee/protocol/TagUtilTest.java index f0beb33c..f6a8bd31 100644 --- a/protocol/src/test/java/net/md_5/bungee/protocol/TagUtilTest.java +++ b/protocol/src/test/java/net/md_5/bungee/protocol/TagUtilTest.java @@ -2,9 +2,20 @@ package net.md_5.bungee.protocol; import static org.junit.jupiter.api.Assertions.*; import com.google.gson.Gson; +import com.google.gson.JsonArray; import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; import org.junit.jupiter.api.Test; +import se.llbit.nbt.ByteArrayTag; +import se.llbit.nbt.CompoundTag; +import se.llbit.nbt.IntArrayTag; +import se.llbit.nbt.IntTag; +import se.llbit.nbt.ListTag; +import se.llbit.nbt.LongArrayTag; import se.llbit.nbt.SpecificTag; +import se.llbit.nbt.StringTag; +import se.llbit.nbt.Tag; public class TagUtilTest { @@ -26,4 +37,190 @@ public class TagUtilTest { testDissembleReassemble( "{\"text\":\"\",\"extra\":[\"hello\",{\"text\":\"there\",\"color\":\"#ff0000\"},{\"text\":\"friend\",\"font\":\"minecraft:default\"}]}" ); } + + public void testCreateMixedList(JsonArray array) + { + SpecificTag tag = TagUtil.fromJson( array ); + assertInstanceOf( ListTag.class, tag ); + ListTag list = (ListTag) tag; + assertEquals( SpecificTag.TAG_COMPOUND, list.getType() ); + assertEquals( array.size(), list.size() ); + + for ( int i = 0; i < list.size(); i++ ) + { + assertTrue( i < array.size() ); + + Tag element = list.get( i ); + assertInstanceOf( CompoundTag.class, element ); + CompoundTag compound = (CompoundTag) element; + + JsonElement expected = array.get( i ); + + if ( expected instanceof JsonObject ) + { + assertEquals( TagUtil.fromJson( expected ), compound ); + } else + { + assertEquals( 1, compound.size() ); + Tag value = compound.get( "" ); + + if ( expected instanceof JsonPrimitive ) + { + JsonPrimitive primitive = (JsonPrimitive) expected; + + if ( primitive.isNumber() ) + { + Number number = primitive.getAsNumber(); + + if ( number instanceof Integer ) + { + assertInstanceOf( IntTag.class, value ); + + IntTag integer = (IntTag) value; + assertEquals( array.get( i ).getAsInt(), integer.getData() ); + } + + } else if ( primitive.isString() ) + { + assertInstanceOf( StringTag.class, value ); + + StringTag string = (StringTag) value; + assertEquals( array.get( i ).getAsString(), string.getData() ); + } + } + } + } + } + + @Test + public void testMixedListWithInt() + { + JsonArray array = new JsonArray(); + array.add( 1 ); + array.add( "a" ); + + testCreateMixedList( array ); + } + + @Test + public void testMixedListWithString() + { + JsonArray array = new JsonArray(); + array.add( "a" ); + array.add( 1L ); + + testCreateMixedList( array ); + } + + @Test + public void testMixedListWithObject() + { + JsonObject compound = new JsonObject(); + compound.addProperty( "a", "b" ); + + JsonArray array = new JsonArray(); + array.add( compound ); + array.add( 1L ); + + testCreateMixedList( array ); + } + + @Test + public void testCreateEmptyList() + { + JsonArray array = new JsonArray(); + SpecificTag tag = TagUtil.fromJson( array ); + assertInstanceOf( ListTag.class, tag ); + ListTag list = (ListTag) tag; + assertEquals( 0, list.size() ); + assertEquals( Tag.TAG_END, list.getType() ); + } + + @Test + public void testCreateByteArray() + { + JsonArray array = new JsonArray(); + array.add( ( (byte) 1 ) ); + array.add( ( (byte) 2 ) ); + + SpecificTag tag = TagUtil.fromJson( array ); + assertInstanceOf( ByteArrayTag.class, tag ); + ByteArrayTag byteArray = (ByteArrayTag) tag; + assertEquals( 2, byteArray.getData().length ); + + for ( int i = 0; i < byteArray.getData().length; i++ ) + { + assertTrue( i < array.size() ); + + byte item = byteArray.getData()[i]; + assertEquals( array.get( i ).getAsByte(), item ); + } + } + + @Test + public void testCreateIntArray() + { + JsonArray array = new JsonArray(); + array.add( 1 ); + array.add( 2 ); + + SpecificTag tag = TagUtil.fromJson( array ); + assertInstanceOf( IntArrayTag.class, tag ); + IntArrayTag intArray = (IntArrayTag) tag; + assertEquals( 2, intArray.getData().length ); + + for ( int i = 0; i < intArray.getData().length; i++ ) + { + assertTrue( i < array.size() ); + + int item = intArray.getData()[i]; + assertEquals( array.get( i ).getAsInt(), item ); + } + } + + @Test + public void testCreateLongArray() + { + JsonArray array = new JsonArray(); + array.add( 1L ); + array.add( 2L ); + + SpecificTag tag = TagUtil.fromJson( array ); + assertInstanceOf( LongArrayTag.class, tag ); + LongArrayTag intArray = (LongArrayTag) tag; + assertEquals( 2, intArray.getData().length ); + + for ( int i = 0; i < intArray.getData().length; i++ ) + { + assertTrue( i < array.size() ); + + long item = intArray.getData()[i]; + assertEquals( array.get( i ).getAsLong(), item ); + } + } + + @Test + public void testCreateStringList() + { + JsonArray array = new JsonArray(); + array.add( "a" ); + array.add( "b" ); + + SpecificTag tag = TagUtil.fromJson( array ); + assertInstanceOf( ListTag.class, tag ); + ListTag list = (ListTag) tag; + assertEquals( SpecificTag.TAG_STRING, list.getType() ); + assertEquals( 2, list.size() ); + + for ( int i = 0; i < list.size(); i++ ) + { + assertTrue( i < array.size() ); + + Tag item = list.get( i ); + assertInstanceOf( StringTag.class, item ); + + StringTag string = (StringTag) item; + assertEquals( array.get( i ).getAsString(), string.getData() ); + } + } }