>, MaxDepthIO {
+
+ public static final byte ID = 9;
private Class> typeClass = null;
- private ListTag() {
- super(createEmptyValue(3));
+ private ListTag(int initialCapacity) {
+ super(createEmptyValue(initialCapacity));
+ }
+
+ @Override
+ public byte getID() {
+ return ID;
+ }
+
+ /**
+ * Creates a non-type-safe ListTag. Its element type will be set after the first
+ * element was added.
+ *
+ * This is an internal helper method for cases where the element type is not known
+ * at construction time. Use {@link #ListTag(Class)} when the type is known.
+ *
+ * @return A new non-type-safe ListTag
+ */
+ public static ListTag> createUnchecked(Class> typeClass) {
+ return createUnchecked(typeClass, 3);
}
-
+
/**
- * Creates a non-type-safe ListTag. Its element type will be set after the first
+ *
Creates a non-type-safe ListTag. Its element type will be set after the first
* element was added.
- *
- * This is an internal helper method for cases where the element type is not known
+ *
+ *
This is an internal helper method for cases where the element type is not known
* at construction time. Use {@link #ListTag(Class)} when the type is known.
- *
+ *
* @return A new non-type-safe ListTag
*/
- protected static ListTag> createUnchecked() {
- return new ListTag<>();
+ public static ListTag> createUnchecked(Class> typeClass, int initialCapacity) {
+ ListTag> list = new ListTag<>(initialCapacity);
+ list.typeClass = typeClass;
+ return list;
}
/**
* Creates an empty mutable list to be used as empty value of ListTags.
*
- * @param Type of the list elements
+ * @param Type of the list elements
* @param initialCapacity The initial capacity of the returned List
* @return An instance of {@link java.util.List} with an initial capacity of 3
- * */
+ */
private static List createEmptyValue(int initialCapacity) {
return new ArrayList<>(initialCapacity);
}
@@ -53,10 +73,20 @@ private static List createEmptyValue(int initialCapacity) {
/**
* @param typeClass The exact class of the elements
* @throws IllegalArgumentException When {@code typeClass} is {@link EndTag}{@code .class}
- * @throws NullPointerException When {@code typeClass} is {@code null}
+ * @throws NullPointerException When {@code typeClass} is {@code null}
*/
public ListTag(Class super T> typeClass) throws IllegalArgumentException, NullPointerException {
- super(createEmptyValue(3));
+ this(typeClass, 3);
+ }
+
+ /**
+ * @param typeClass The exact class of the elements
+ * @param initialCapacity Initial capacity of list
+ * @throws IllegalArgumentException When {@code typeClass} is {@link EndTag}{@code .class}
+ * @throws NullPointerException When {@code typeClass} is {@code null}
+ */
+ public ListTag(Class super T> typeClass, int initialCapacity) throws IllegalArgumentException, NullPointerException {
+ super(createEmptyValue(initialCapacity));
if (typeClass == EndTag.class) {
throw new IllegalArgumentException("cannot create ListTag with EndTag elements");
}
@@ -107,15 +137,16 @@ public T set(int index, T t) {
/**
* Adds a Tag to this ListTag after the last index.
+ *
* @param t The element to be added.
- * */
+ */
public void add(T t) {
add(size(), t);
}
public void add(int index, T t) {
Objects.requireNonNull(t);
- if (typeClass == null || typeClass == EndTag.class) {
+ if (getTypeClass() == EndTag.class) {
typeClass = t.getClass();
} else if (typeClass != t.getClass()) {
throw new ClassCastException(
@@ -124,7 +155,6 @@ public void add(int index, T t) {
typeClass.getSimpleName()));
}
getValue().add(index, t);
-
}
public void addAll(Collection t) {
@@ -196,7 +226,6 @@ public int indexOf(T t) {
@SuppressWarnings("unchecked")
public > ListTag asTypedList(Class type) {
checkTypeClass(type);
- typeClass = type;
return (ListTag) this;
}
@@ -251,36 +280,6 @@ public ListTag asCompoundTagList() {
return asTypedList(CompoundTag.class);
}
- @Override
- public void serializeValue(DataOutputStream dos, int maxDepth) throws IOException {
- dos.writeByte(TagFactory.idFromClass(getTypeClass()));
- dos.writeInt(size());
- if (size() != 0) {
- for (T t : getValue()) {
- t.serializeValue(dos, decrementMaxDepth(maxDepth));
- }
- }
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public void deserializeValue(DataInputStream dis, int maxDepth) throws IOException {
- int typeID = dis.readByte();
- if (typeID != 0) {
- typeClass = TagFactory.classFromID(typeID);
- }
- int size = dis.readInt();
- size = size < 0 ? 0 : size;
- setValue(createEmptyValue(size));
- if (size != 0) {
- for (int i = 0; i < size; i++) {
- Tag> tag = TagFactory.fromID(typeID);
- tag.deserializeValue(dis, decrementMaxDepth(maxDepth));
- add((T) tag);
- }
- }
- }
-
@Override
public String valueToString(int maxDepth) {
StringBuilder sb = new StringBuilder("{\"type\":\"").append(getTypeClass().getSimpleName()).append("\",\"list\":[");
@@ -291,22 +290,13 @@ public String valueToString(int maxDepth) {
return sb.toString();
}
- @Override
- public String valueToTagString(int maxDepth) {
- StringBuilder sb = new StringBuilder("[");
- for (int i = 0; i < size(); i++) {
- sb.append(i > 0 ? "," : "").append(get(i).valueToTagString(decrementMaxDepth(maxDepth)));
- }
- sb.append("]");
- return sb.toString();
- }
-
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
}
- if (!super.equals(other) || size() != ((ListTag>) other).size() || getTypeClass() != ((ListTag>) other).getTypeClass()) {
+ if (!super.equals(other) || size() != ((ListTag>) other).size() || getTypeClass() != ((ListTag>) other)
+ .getTypeClass()) {
return false;
}
for (int i = 0; i < size(); i++) {
@@ -330,7 +320,7 @@ public int compareTo(ListTag o) {
@SuppressWarnings("unchecked")
@Override
public ListTag clone() {
- ListTag copy = new ListTag<>();
+ ListTag copy = new ListTag<>(this.size());
// assure type safety for clone
copy.typeClass = typeClass;
for (T t : getValue()) {
@@ -339,9 +329,10 @@ public ListTag clone() {
return copy;
}
+ //TODO: make private
@SuppressWarnings("unchecked")
- private void addUnchecked(Tag> tag) {
- if (typeClass != null && typeClass != tag.getClass()) {
+ public void addUnchecked(Tag> tag) {
+ if (getTypeClass() != EndTag.class && typeClass != tag.getClass()) {
throw new IllegalArgumentException(String.format(
"cannot add %s to ListTag<%s>",
tag.getClass().getSimpleName(), typeClass.getSimpleName()));
@@ -350,7 +341,7 @@ private void addUnchecked(Tag> tag) {
}
private void checkTypeClass(Class> clazz) {
- if (typeClass != null && typeClass != clazz) {
+ if (getTypeClass() != EndTag.class && typeClass != clazz) {
throw new ClassCastException(String.format(
"cannot cast ListTag<%s> to ListTag<%s>",
typeClass.getSimpleName(), clazz.getSimpleName()));
diff --git a/src/main/java/net/querz/nbt/LongArrayTag.java b/src/main/java/net/querz/nbt/tag/LongArrayTag.java
similarity index 54%
rename from src/main/java/net/querz/nbt/LongArrayTag.java
rename to src/main/java/net/querz/nbt/tag/LongArrayTag.java
index ec5452d7..e0528dd1 100644
--- a/src/main/java/net/querz/nbt/LongArrayTag.java
+++ b/src/main/java/net/querz/nbt/tag/LongArrayTag.java
@@ -1,12 +1,10 @@
-package net.querz.nbt;
+package net.querz.nbt.tag;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
import java.util.Arrays;
public class LongArrayTag extends ArrayTag implements Comparable {
+ public static final byte ID = 12;
public static final long[] ZERO_VALUE = new long[0];
public LongArrayTag() {
@@ -18,25 +16,8 @@ public LongArrayTag(long[] value) {
}
@Override
- public void serializeValue(DataOutputStream dos, int maxDepth) throws IOException {
- dos.writeInt(length());
- for (long i : getValue()) {
- dos.writeLong(i);
- }
- }
-
- @Override
- public void deserializeValue(DataInputStream dis, int maxDepth) throws IOException {
- int length = dis.readInt();
- setValue(new long[length]);
- for (int i = 0; i < length; i++) {
- getValue()[i] = dis.readLong();
- }
- }
-
- @Override
- public String valueToTagString(int maxDepth) {
- return arrayToString("L", "l");
+ public byte getID() {
+ return ID;
}
@Override
diff --git a/src/main/java/net/querz/nbt/LongTag.java b/src/main/java/net/querz/nbt/tag/LongTag.java
similarity index 57%
rename from src/main/java/net/querz/nbt/LongTag.java
rename to src/main/java/net/querz/nbt/tag/LongTag.java
index 38a7e9f2..8f40a325 100644
--- a/src/main/java/net/querz/nbt/LongTag.java
+++ b/src/main/java/net/querz/nbt/tag/LongTag.java
@@ -1,11 +1,8 @@
-package net.querz.nbt;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
+package net.querz.nbt.tag;
public class LongTag extends NumberTag implements Comparable {
+ public static final byte ID = 4;
public static final long ZERO_VALUE = 0L;
public LongTag() {
@@ -16,23 +13,13 @@ public LongTag(long value) {
super(value);
}
- public void setValue(long value) {
- super.setValue(value);
- }
-
@Override
- public void serializeValue(DataOutputStream dos, int maxDepth) throws IOException {
- dos.writeLong(getValue());
+ public byte getID() {
+ return ID;
}
- @Override
- public void deserializeValue(DataInputStream dis, int maxDepth) throws IOException {
- setValue(dis.readLong());
- }
-
- @Override
- public String valueToTagString(int maxDepth) {
- return getValue() + "l";
+ public void setValue(long value) {
+ super.setValue(value);
}
@Override
diff --git a/src/main/java/net/querz/nbt/NonNullEntrySet.java b/src/main/java/net/querz/nbt/tag/NonNullEntrySet.java
similarity index 98%
rename from src/main/java/net/querz/nbt/NonNullEntrySet.java
rename to src/main/java/net/querz/nbt/tag/NonNullEntrySet.java
index 32d8614a..e157ba26 100644
--- a/src/main/java/net/querz/nbt/NonNullEntrySet.java
+++ b/src/main/java/net/querz/nbt/tag/NonNullEntrySet.java
@@ -1,4 +1,4 @@
-package net.querz.nbt;
+package net.querz.nbt.tag;
import java.util.Collection;
import java.util.Iterator;
diff --git a/src/main/java/net/querz/nbt/NumberTag.java b/src/main/java/net/querz/nbt/tag/NumberTag.java
similarity index 95%
rename from src/main/java/net/querz/nbt/NumberTag.java
rename to src/main/java/net/querz/nbt/tag/NumberTag.java
index d2fd9ec6..48faa024 100644
--- a/src/main/java/net/querz/nbt/NumberTag.java
+++ b/src/main/java/net/querz/nbt/tag/NumberTag.java
@@ -1,4 +1,4 @@
-package net.querz.nbt;
+package net.querz.nbt.tag;
public abstract class NumberTag> extends Tag {
diff --git a/src/main/java/net/querz/nbt/ShortTag.java b/src/main/java/net/querz/nbt/tag/ShortTag.java
similarity index 57%
rename from src/main/java/net/querz/nbt/ShortTag.java
rename to src/main/java/net/querz/nbt/tag/ShortTag.java
index 3534b217..5f434c37 100644
--- a/src/main/java/net/querz/nbt/ShortTag.java
+++ b/src/main/java/net/querz/nbt/tag/ShortTag.java
@@ -1,11 +1,8 @@
-package net.querz.nbt;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
+package net.querz.nbt.tag;
public class ShortTag extends NumberTag implements Comparable {
+ public static final byte ID = 2;
public static final short ZERO_VALUE = 0;
public ShortTag() {
@@ -16,23 +13,13 @@ public ShortTag(short value) {
super(value);
}
- public void setValue(short value) {
- super.setValue(value);
- }
-
@Override
- public void serializeValue(DataOutputStream dos, int maxDepth) throws IOException {
- dos.writeShort(getValue());
+ public byte getID() {
+ return ID;
}
- @Override
- public void deserializeValue(DataInputStream dis, int maxDepth) throws IOException {
- setValue(dis.readShort());
- }
-
- @Override
- public String valueToTagString(int maxDepth) {
- return getValue() + "s";
+ public void setValue(short value) {
+ super.setValue(value);
}
@Override
diff --git a/src/main/java/net/querz/nbt/StringTag.java b/src/main/java/net/querz/nbt/tag/StringTag.java
similarity index 63%
rename from src/main/java/net/querz/nbt/StringTag.java
rename to src/main/java/net/querz/nbt/tag/StringTag.java
index 8350f518..0d30c4b6 100644
--- a/src/main/java/net/querz/nbt/StringTag.java
+++ b/src/main/java/net/querz/nbt/tag/StringTag.java
@@ -1,11 +1,8 @@
-package net.querz.nbt;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
+package net.querz.nbt.tag;
public class StringTag extends Tag implements Comparable {
+ public static final byte ID = 8;
public static final String ZERO_VALUE = "";
public StringTag() {
@@ -16,6 +13,11 @@ public StringTag(String value) {
super(value);
}
+ @Override
+ public byte getID() {
+ return ID;
+ }
+
@Override
public String getValue() {
return super.getValue();
@@ -26,26 +28,11 @@ public void setValue(String value) {
super.setValue(value);
}
- @Override
- public void serializeValue(DataOutputStream dos, int maxDepth) throws IOException {
- dos.writeUTF(getValue());
- }
-
- @Override
- public void deserializeValue(DataInputStream dis, int maxDepth) throws IOException {
- setValue(dis.readUTF());
- }
-
@Override
public String valueToString(int maxDepth) {
return escapeString(getValue(), false);
}
- @Override
- public String valueToTagString(int maxDepth) {
- return escapeString(getValue(), true);
- }
-
@Override
public boolean equals(Object other) {
return super.equals(other) && getValue().equals(((StringTag) other).getValue());
diff --git a/src/main/java/net/querz/nbt/Tag.java b/src/main/java/net/querz/nbt/tag/Tag.java
similarity index 55%
rename from src/main/java/net/querz/nbt/Tag.java
rename to src/main/java/net/querz/nbt/tag/Tag.java
index 2a92c042..dd1c8d55 100644
--- a/src/main/java/net/querz/nbt/Tag.java
+++ b/src/main/java/net/querz/nbt/tag/Tag.java
@@ -1,8 +1,6 @@
-package net.querz.nbt;
+package net.querz.nbt.tag;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
+import net.querz.io.MaxDepthReachedException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@@ -20,7 +18,7 @@
*
* These methods have a parameter for the maximum nesting depth they are allowed to traverse. A
* value of {@code 0} means that only the object itself, but no nested objects may be processed.
- * If an instance is nested further than allowed, a {@link MaxDepthReachedException} will be thrown.
+ * If an instance is nested further than allowed, a {@link MaxDepthReachedException} will be thrown.
* Providing a negative maximum nesting depth will cause an {@code IllegalArgumentException}
* to be thrown.
*
@@ -69,9 +67,7 @@ public Tag(T value) {
/**
* @return This Tag's ID, usually used for serialization and deserialization.
* */
- public byte getID() {
- return TagFactory.idFromClass(getClass());
- }
+ public abstract byte getID();
/**
* @return The value of this Tag.
@@ -99,74 +95,6 @@ protected T checkValue(T value) {
return Objects.requireNonNull(value);
}
- /**
- * Calls {@link Tag#serialize(DataOutputStream, String, int)} with an empty name.
- * @see Tag#serialize(DataOutputStream, String, int)
- * @param dos The DataOutputStream to write to
- * @param maxDepth The maximum nesting depth
- * @throws IOException If something went wrong during serialization.
- * @throws NullPointerException If {@code dos} is {@code null}.
- * @throws MaxDepthReachedException If the maximum nesting depth is exceeded.
- * */
- public final void serialize(DataOutputStream dos, int maxDepth) throws IOException {
- serialize(dos, "", maxDepth);
- }
-
- /**
- * Serializes this Tag starting at the gives depth.
- * @param dos The DataOutputStream to write to.
- * @param name The name of this Tag, if this is the root Tag.
- * @param maxDepth The maximum nesting depth
- * @throws IOException If something went wrong during serialization.
- * @throws NullPointerException If {@code dos} or {@code name} is {@code null}.
- * @throws MaxDepthReachedException If the maximum nesting depth is exceeded.
- * */
- public final void serialize(DataOutputStream dos, String name, int maxDepth) throws IOException {
- dos.writeByte(getID());
- if (getID() != 0) {
- dos.writeUTF(name);
- }
- serializeValue(dos, maxDepth);
- }
-
- /**
- * Deserializes this Tag starting at the given depth.
- * The name of the root Tag is ignored.
- * @param dis The DataInputStream to read from.
- * @param maxDepth The maximum nesting depth.
- * @throws IOException If something went wrong during deserialization.
- * @throws NullPointerException If {@code dis} is {@code null}.
- * @throws MaxDepthReachedException If the maximum nesting depth is exceeded.
- * @return The deserialized NBT structure.
- * */
- public static Tag> deserialize(DataInputStream dis, int maxDepth) throws IOException {
- int id = dis.readByte() & 0xFF;
- Tag> tag = TagFactory.fromID(id);
- if (id != 0) {
- dis.readUTF();
- tag.deserializeValue(dis, maxDepth);
- }
- return tag;
- }
-
- /**
- * Serializes only the value of this Tag.
- * @param dos The DataOutputStream to write to.
- * @param maxDepth The maximum nesting depth.
- * @throws IOException If something went wrong during serialization.
- * @throws MaxDepthReachedException If the maximum nesting depth is exceeded.
- * */
- public abstract void serializeValue(DataOutputStream dos, int maxDepth) throws IOException;
-
- /**
- * Deserializes only the value of this Tag.
- * @param dis The DataInputStream to read from.
- * @param maxDepth The maximum nesting depth.
- * @throws IOException If something went wrong during deserialization.
- * @throws MaxDepthReachedException If the maximum nesting depth is exceeded
- * */
- public abstract void deserializeValue(DataInputStream dis, int maxDepth) throws IOException;
-
/**
* Calls {@link Tag#toString(int)} with an initial depth of {@code 0}.
* @see Tag#toString(int)
@@ -189,39 +117,21 @@ public String toString(int maxDepth) {
}
/**
- * Returns a JSON representation of the value of this Tag.
- * @param maxDepth The maximum nesting depth.
+ * Calls {@link Tag#valueToString(int)} with {@link Tag#DEFAULT_MAX_DEPTH}.
* @return The string representation of the value of this Tag.
* @throws MaxDepthReachedException If the maximum nesting depth is exceeded.
* */
- public abstract String valueToString(int maxDepth);
-
- /**
- * Calls {@link Tag#toTagString(int)} with {@link #DEFAULT_MAX_DEPTH}.
- * @see Tag#toTagString(int)
- * @return The JSON-like string representation of this Tag.
- * */
- public final String toTagString() {
- return toTagString(DEFAULT_MAX_DEPTH);
- }
-
- /**
- * Returns a JSON-like representation of the value of this Tag, usually used for Minecraft commands.
- * @param maxDepth The maximum nesting depth.
- * @return The JSON-like string representation of this Tag.
- * @throws MaxDepthReachedException If the maximum nesting depth is exceeded.
- * */
- public String toTagString(int maxDepth) {
- return valueToTagString(maxDepth);
+ public String valueToString() {
+ return valueToString(DEFAULT_MAX_DEPTH);
}
/**
- * Returns a JSON-like representation of the value of this Tag.
+ * Returns a JSON representation of the value of this Tag.
* @param maxDepth The maximum nesting depth.
- * @return The JSON-like string representation of the value of this Tag.
+ * @return The string representation of the value of this Tag.
* @throws MaxDepthReachedException If the maximum nesting depth is exceeded.
* */
- public abstract String valueToTagString(int maxDepth);
+ public abstract String valueToString(int maxDepth);
/**
* Returns whether this Tag and some other Tag are equal.
@@ -253,25 +163,6 @@ public int hashCode() {
@SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
public abstract Tag clone();
- /**
- * Decrements {@code maxDepth} by {@code 1}. This method has to be used when a tag is
- * (de-)serialized and contains nested tags. Their respective methods are then called
- * with {@code decrementMaxDepth(maxDepth)} as maximum nesting depth.
- *
- * @param maxDepth The value to decrement.
- * @return The decremented value.
- * @throws MaxDepthReachedException If {@code maxDepth == 0}.
- * @throws IllegalArgumentException If {@code maxDepth < 0}.
- * */
- protected int decrementMaxDepth(int maxDepth) {
- if (maxDepth < 0) {
- throw new IllegalArgumentException("negative maximum depth is not allowed");
- } else if (maxDepth == 0) {
- throw new MaxDepthReachedException("reached maximum depth of NBT structure");
- }
- return --maxDepth;
- }
-
/**
* Escapes a string to fit into a JSON-like string representation for Minecraft
* or to create the JSON string representation of a Tag returned from {@link Tag#toString()}
diff --git a/src/test/java/net/querz/nbt/ExceptionRunnable.java b/src/test/java/net/querz/ExceptionRunnable.java
similarity index 82%
rename from src/test/java/net/querz/nbt/ExceptionRunnable.java
rename to src/test/java/net/querz/ExceptionRunnable.java
index 1c1292ce..ebf57da8 100644
--- a/src/test/java/net/querz/nbt/ExceptionRunnable.java
+++ b/src/test/java/net/querz/ExceptionRunnable.java
@@ -1,4 +1,4 @@
-package net.querz.nbt;
+package net.querz;
@FunctionalInterface
public interface ExceptionRunnable {
diff --git a/src/test/java/net/querz/nbt/ExceptionSupplier.java b/src/test/java/net/querz/ExceptionSupplier.java
similarity index 82%
rename from src/test/java/net/querz/nbt/ExceptionSupplier.java
rename to src/test/java/net/querz/ExceptionSupplier.java
index ba87ef04..98de04ed 100644
--- a/src/test/java/net/querz/nbt/ExceptionSupplier.java
+++ b/src/test/java/net/querz/ExceptionSupplier.java
@@ -1,4 +1,4 @@
-package net.querz.nbt;
+package net.querz;
@FunctionalInterface
public interface ExceptionSupplier {
diff --git a/src/test/java/net/querz/nbt/NBTTestCase.java b/src/test/java/net/querz/NBTTestCase.java
similarity index 95%
rename from src/test/java/net/querz/nbt/NBTTestCase.java
rename to src/test/java/net/querz/NBTTestCase.java
index 52d00aa5..7d412a59 100644
--- a/src/test/java/net/querz/nbt/NBTTestCase.java
+++ b/src/test/java/net/querz/NBTTestCase.java
@@ -1,6 +1,11 @@
-package net.querz.nbt;
+package net.querz;
import junit.framework.TestCase;
+import net.querz.nbt.io.NBTDeserializer;
+import net.querz.nbt.io.NBTSerializer;
+import net.querz.nbt.io.NamedTag;
+import net.querz.nbt.tag.Tag;
+
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@@ -24,17 +29,13 @@ public abstract class NBTTestCase extends TestCase {
@Override
public void tearDown() throws Exception {
super.tearDown();
- TagFactory.unregisterCustomTag(90);
- TagFactory.unregisterCustomTag(100);
- TagFactory.unregisterCustomTag(110);
- TagFactory.unregisterCustomTag(120);
-// cleanupTmpDir();
+ cleanupTmpDir();
}
protected byte[] serialize(Tag> tag) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (DataOutputStream dos = new DataOutputStream(baos)) {
- tag.serialize(dos, Tag.DEFAULT_MAX_DEPTH);
+ new NBTSerializer(false).toStream(new NamedTag(null, tag), dos);
} catch (IOException ex) {
ex.printStackTrace();
fail(ex.getMessage());
@@ -44,7 +45,7 @@ protected byte[] serialize(Tag> tag) {
protected Tag> deserialize(byte[] data) {
try (DataInputStream dis = new DataInputStream(new ByteArrayInputStream(data))) {
- return Tag.deserialize(dis, Tag.DEFAULT_MAX_DEPTH);
+ return new NBTDeserializer(false).fromStream(dis).getTag();
} catch (IOException ex) {
ex.printStackTrace();
fail(ex.getMessage());
@@ -60,7 +61,7 @@ protected File getResourceFile(String name) {
protected Tag> deserializeFromFile(String f) {
try (DataInputStream dis = new DataInputStream(new FileInputStream(getResourceFile(f)))) {
- return Tag.deserialize(dis, Tag.DEFAULT_MAX_DEPTH);
+ return new NBTDeserializer(false).fromStream(dis).getTag();
} catch (IOException ex) {
ex.printStackTrace();
fail(ex.getMessage());
@@ -251,6 +252,7 @@ protected void cleanupTmpDir() {
file.delete();
}
}
+ tmpDir.delete();
}
protected String calculateFileMD5(File file) {
diff --git a/src/test/java/net/querz/nbt/mca/CompressionTypeTest.java b/src/test/java/net/querz/mca/CompressionTypeTest.java
similarity index 94%
rename from src/test/java/net/querz/nbt/mca/CompressionTypeTest.java
rename to src/test/java/net/querz/mca/CompressionTypeTest.java
index 24298df7..65f87125 100644
--- a/src/test/java/net/querz/nbt/mca/CompressionTypeTest.java
+++ b/src/test/java/net/querz/mca/CompressionTypeTest.java
@@ -1,4 +1,4 @@
-package net.querz.nbt.mca;
+package net.querz.mca;
public class CompressionTypeTest extends MCATestCase {
diff --git a/src/test/java/net/querz/nbt/mca/MCAFileTest.java b/src/test/java/net/querz/mca/MCAFileTest.java
similarity index 72%
rename from src/test/java/net/querz/nbt/mca/MCAFileTest.java
rename to src/test/java/net/querz/mca/MCAFileTest.java
index 6fe66c51..dc9c130d 100644
--- a/src/test/java/net/querz/nbt/mca/MCAFileTest.java
+++ b/src/test/java/net/querz/mca/MCAFileTest.java
@@ -1,7 +1,9 @@
-package net.querz.nbt.mca;
+package net.querz.mca;
-import net.querz.nbt.CompoundTag;
-import net.querz.nbt.ListTag;
+import net.querz.nbt.tag.CompoundTag;
+import net.querz.nbt.tag.EndTag;
+import net.querz.nbt.tag.ListTag;
+import static net.querz.mca.LoadFlags.*;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
@@ -28,14 +30,14 @@ public void testGetChunkIndex() {
}
public void testChangeData() {
- MCAFile mcaFile = assertThrowsNoException(() -> MCAUtil.readMCAFile(copyResourceToTmp("r.2.2.mca")));
+ MCAFile mcaFile = assertThrowsNoException(() -> MCAUtil.read(copyResourceToTmp("r.2.2.mca")));
assertNotNull(mcaFile);
mcaFile.setChunk(0, null);
File tmpFile = getNewTmpFile("r.2.2.mca");
- Integer x = assertThrowsNoException(() -> MCAUtil.writeMCAFile(mcaFile, tmpFile, true));
+ Integer x = assertThrowsNoException(() -> MCAUtil.write(mcaFile, tmpFile, true));
assertNotNull(x);
assertEquals(2, x.intValue());
- MCAFile again = assertThrowsNoException(() -> MCAUtil.readMCAFile(tmpFile));
+ MCAFile again = assertThrowsNoException(() -> MCAUtil.read(tmpFile));
assertNotNull(again);
for (int i = 0; i < 1024; i++) {
if (i != 512 && i != 1023) {
@@ -47,11 +49,11 @@ public void testChangeData() {
}
public void testChangeLastUpdate() {
- MCAFile from = assertThrowsNoException(() -> MCAUtil.readMCAFile(copyResourceToTmp("r.2.2.mca")));
+ MCAFile from = assertThrowsNoException(() -> MCAUtil.read(copyResourceToTmp("r.2.2.mca")));
assertNotNull(from);
File tmpFile = getNewTmpFile("r.2.2.mca");
- assertThrowsNoException(() -> MCAUtil.writeMCAFile(from, tmpFile, true));
- MCAFile to = assertThrowsNoException(() -> MCAUtil.readMCAFile(tmpFile));
+ assertThrowsNoException(() -> MCAUtil.write(from, tmpFile, true));
+ MCAFile to = assertThrowsNoException(() -> MCAUtil.read(tmpFile));
assertNotNull(to);
assertFalse(from.getChunk(0).getLastMCAUpdate() == to.getChunk(0).getLastMCAUpdate());
assertFalse(from.getChunk(512).getLastMCAUpdate() == to.getChunk(512).getLastMCAUpdate());
@@ -61,7 +63,7 @@ public void testChangeLastUpdate() {
}
public void testGetters() {
- MCAFile f = assertThrowsNoException(() -> MCAUtil.readMCAFile(copyResourceToTmp("r.2.2.mca")));
+ MCAFile f = assertThrowsNoException(() -> MCAUtil.read(copyResourceToTmp("r.2.2.mca")));
assertNotNull(f);
assertThrowsRuntimeException(() -> f.getChunk(-1), IndexOutOfBoundsException.class);
@@ -89,7 +91,7 @@ public void testGetters() {
assertNotNull(f.getChunk(0).getBiomes());
assertNull(f.getChunk(0).getHeightMaps());
assertNull(f.getChunk(0).getCarvingMasks());
- assertEquals(new ListTag<>(CompoundTag.class), f.getChunk(0).getEntities());
+ assertEquals(ListTag.createUnchecked(null), f.getChunk(0).getEntities());
assertNull(f.getChunk(0).getTileEntities());
assertNull(f.getChunk(0).getTileTicks());
assertNull(f.getChunk(0).getLiquidTicks());
@@ -180,30 +182,30 @@ public void testSetters() {
}
public void testGetBiomeAt() {
- MCAFile f = assertThrowsNoException(() -> MCAUtil.readMCAFile(copyResourceToTmp("r.2.2.mca")));
+ MCAFile f = assertThrowsNoException(() -> MCAUtil.read(copyResourceToTmp("r.2.2.mca")));
assertEquals(21, f.getBiomeAt(1024, 1024));
assertEquals(-1, f.getBiomeAt(1040, 1024));
- f.setChunk(0, 1, Chunk.newChunk());
+ f.setChunk(0, 1, Chunk.newChunk(2201));
assertEquals(-1, f.getBiomeAt(1024, 1040));
}
public void testSetBiomeAt() {
- MCAFile f = assertThrowsNoException(() -> MCAUtil.readMCAFile(copyResourceToTmp("r.2.2.mca")));
+ MCAFile f = assertThrowsNoException(() -> MCAUtil.read(copyResourceToTmp("r.2.2.mca")), true);
f.setBiomeAt(1024, 1024, 20);
assertEquals(20, f.getChunk(64, 64).updateHandle(64, 64).getCompoundTag("Level").getIntArray("Biomes")[0]);
f.setBiomeAt(1039, 1039, 47);
assertEquals(47, f.getChunk(64, 64).updateHandle(64, 64).getCompoundTag("Level").getIntArray("Biomes")[255]);
f.setBiomeAt(1040, 1024, 20);
int[] biomes = f.getChunk(65, 64).updateHandle(65, 64).getCompoundTag("Level").getIntArray("Biomes");
- assertEquals(256, biomes.length);
- for (int i = 0; i < 256; i++) {
- assertTrue(i == 0 ? biomes[i] == 20 : biomes[i] == -1);
+ assertEquals(1024, biomes.length);
+ for (int i = 0; i < 1024; i++) {
+ assertTrue(i % 16 == 0 ? biomes[i] == 20 : biomes[i] == -1);
}
}
public void testCleanupPaletteAndBlockStates() {
- MCAFile f = assertThrowsNoException(() -> MCAUtil.readMCAFile(copyResourceToTmp("r.2.2.mca")));
+ MCAFile f = assertThrowsNoException(() -> MCAUtil.read(copyResourceToTmp("r.2.2.mca")));
assertThrowsNoRuntimeException(f::cleanupPalettesAndBlockStates);
Chunk c = f.getChunk(0, 0);
Section s = c.getSection(0);
@@ -233,7 +235,7 @@ public void testCleanupPaletteAndBlockStates() {
}
public void testSetBlockDataAt() {
- MCAFile f = assertThrowsNoException(() -> MCAUtil.readMCAFile(copyResourceToTmp("r.2.2.mca")));
+ MCAFile f = assertThrowsNoException(() -> MCAUtil.read(copyResourceToTmp("r.2.2.mca")));
Section section = f.getChunk(0, 0).getSection(0);
assertEquals(10, section.getPalette().size());
assertEquals(0b0001000100010001000100010001000100010001000100010001000100010001L, section.getBlockStates()[0]);
@@ -298,8 +300,27 @@ public void testSetBlockDataAt() {
assertEquals(256, sss.get(0).getLongArray("BlockStates").length);
}
+ public void testSetBlockDataAt2527() {
+ //test "line break" for DataVersion 2527
+ MCAFile f = assertThrowsNoException(() -> MCAUtil.read(copyResourceToTmp("r.2.2.mca")));
+ Chunk p = f.getChunk(0, 0);
+ p.setDataVersion(3000);
+ Section section = f.getChunk(0, 0).getSection(0);
+ assertEquals(10, section.getPalette().size());
+ assertEquals(0b0001000100010001000100010001000100010001000100010001000100010001L, section.getBlockStates()[0]);
+ f.setBlockStateAt(0, 0, 0, block("minecraft:custom"), false);
+ assertEquals(11, section.getPalette().size());
+ assertEquals(0b0001000100010001000100010001000100010001000100010001000100011010L, section.getBlockStates()[0]);
+ int y = 1;
+ for (int i = 12; i <= 17; i++) {
+ f.setBlockStateAt(0, y++, 0, block("minecraft:" + i), false);
+ }
+ assertEquals(17, section.getPalette().size());
+ assertEquals(342, section.getBlockStates().length);
+ }
+
public void testGetBlockDataAt() {
- MCAFile f = assertThrowsNoException(() -> MCAUtil.readMCAFile(copyResourceToTmp("r.2.2.mca")));
+ MCAFile f = assertThrowsNoException(() -> MCAUtil.read(copyResourceToTmp("r.2.2.mca")));
assertEquals(block("minecraft:bedrock"), f.getBlockStateAt(0, 0, 0));
assertNull(f.getBlockStateAt(16, 0, 0));
assertEquals(block("minecraft:dirt"), f.getBlockStateAt(0, 62, 0));
@@ -308,12 +329,12 @@ public void testGetBlockDataAt() {
}
public void testGetChunkStatus() {
- MCAFile f = assertThrowsNoException(() -> MCAUtil.readMCAFile(copyResourceToTmp("r.2.2.mca")));
+ MCAFile f = assertThrowsNoException(() -> MCAUtil.read(copyResourceToTmp("r.2.2.mca")));
assertEquals("mobs_spawned", f.getChunk(0, 0).getStatus());
}
public void testSetChunkStatus() {
- MCAFile f = assertThrowsNoException(() -> MCAUtil.readMCAFile(copyResourceToTmp("r.2.2.mca")));
+ MCAFile f = assertThrowsNoException(() -> MCAUtil.read(copyResourceToTmp("r.2.2.mca")));
assertThrowsNoRuntimeException(() -> f.getChunk(0, 0).setStatus("base"));
assertEquals("base", f.getChunk(0, 0).updateHandle(64, 64).getCompoundTag("Level").getString("Status"));
assertNull(f.getChunk(1, 0));
@@ -342,4 +363,92 @@ public void testChunkInvalidDataTag() {
}
}, IOException.class);
}
+
+ private void assertLoadFLag(Object field, long flags, long wantedFlag) {
+ if((flags & wantedFlag) != 0) {
+ assertNotNull(String.format("Should not be null. Flags=%08x, Wanted flag=%08x", flags, wantedFlag), field);
+ } else {
+ assertNull(String.format("Should be null. Flags=%08x, Wanted flag=%08x", flags, wantedFlag), field);
+ }
+ }
+
+ private void assertPartialChunk(Chunk c, long loadFlags) {
+ assertLoadFLag(c.getBiomes(), loadFlags, BIOMES);
+ assertLoadFLag(c.getHeightMaps(), loadFlags, HEIGHTMAPS);
+ assertLoadFLag(c.getEntities(), loadFlags, ENTITIES);
+ assertLoadFLag(c.getCarvingMasks(), loadFlags, CARVING_MASKS);
+ assertLoadFLag(c.getLights(), loadFlags, LIGHTS);
+ assertLoadFLag(c.getPostProcessing(), loadFlags, POST_PROCESSING);
+ assertLoadFLag(c.getLiquidTicks(), loadFlags, LIQUID_TICKS);
+ assertLoadFLag(c.getLiquidsToBeTicked(), loadFlags, LIQUIDS_TO_BE_TICKED);
+ assertLoadFLag(c.getTileTicks(), loadFlags, TILE_TICKS);
+ assertLoadFLag(c.getTileEntities(), loadFlags, TILE_ENTITIES);
+ assertLoadFLag(c.getToBeTicked(), loadFlags, TO_BE_TICKED);
+ assertLoadFLag(c.getSection(0), loadFlags, BLOCK_LIGHTS|BLOCK_STATES|SKY_LIGHT);
+ if ((loadFlags & (BLOCK_LIGHTS|BLOCK_STATES|SKY_LIGHT)) != 0) {
+ Section s = c.getSection(0);
+ assertNotNull(String.format("Section is null. Flags=%08x", loadFlags), s);
+ assertLoadFLag(s.getBlockStates(), loadFlags, BLOCK_STATES);
+ assertLoadFLag(s.getBlockLight(), loadFlags, BLOCK_LIGHTS);
+ assertLoadFLag(s.getSkyLight(), loadFlags, SKY_LIGHT);
+ }
+ }
+
+ public void testPartialLoad() {
+ long[] flags = new long[] {
+ BIOMES,
+ HEIGHTMAPS,
+ ENTITIES,
+ CARVING_MASKS,
+ LIGHTS,
+ POST_PROCESSING,
+ LIQUID_TICKS,
+ LIQUIDS_TO_BE_TICKED,
+ TILE_TICKS,
+ TILE_ENTITIES,
+ TO_BE_TICKED,
+ BLOCK_STATES,
+ BLOCK_LIGHTS,
+ SKY_LIGHT
+ };
+
+ MCAFile f = assertThrowsNoException(() -> MCAUtil.read(copyResourceToTmp("r.2.2.mca")));
+ Chunk c = f.getChunk(0);
+ c.setCarvingMasks(getSomeCompoundTag());
+ c.setEntities(getSomeCompoundTagList());
+ c.setLights(getSomeListTagList());
+ c.setTileEntities(getSomeCompoundTagList());
+ c.setTileTicks(getSomeCompoundTagList());
+ c.setLiquidTicks(getSomeCompoundTagList());
+ c.setToBeTicked(getSomeListTagList());
+ c.setLiquidsToBeTicked(getSomeListTagList());
+ c.setHeightMaps(getSomeCompoundTag());
+ c.setPostProcessing(getSomeListTagList());
+ c.getSection(0).setBlockLight(new byte[2048]);
+ File tmp = this.getNewTmpFile("r.2.2.mca");
+ assertThrowsNoException(() -> MCAUtil.write(f, tmp));
+
+ for (long flag : flags) {
+ MCAFile mcaFile = assertThrowsNoException(() -> MCAUtil.read(tmp, flag));
+ c = mcaFile.getChunk(0, 0);
+ assertPartialChunk(c, flag);
+ assertThrowsException(() -> MCAUtil.write(mcaFile, getNewTmpFile("r.12.34.mca")), UnsupportedOperationException.class);
+ }
+ }
+
+ public void test1_15GetBiomeAt() throws IOException {
+ MCAFile f = assertThrowsNoException(() -> MCAUtil.read(copyResourceToTmp("r.0.0.mca")));
+ assertEquals(162, f.getBiomeAt(31, 0, 63));
+ assertEquals(4, f.getBiomeAt(16, 0, 48));
+ assertEquals(4, f.getBiomeAt(16, 0, 63));
+ assertEquals(162, f.getBiomeAt(31, 0, 48));
+ assertEquals(162, f.getBiomeAt(31, 100, 63));
+ assertEquals(4, f.getBiomeAt(16, 100, 48));
+ assertEquals(4, f.getBiomeAt(16, 100, 63));
+ assertEquals(162, f.getBiomeAt(31, 100, 48));
+ assertEquals(162, f.getBiomeAt(31, 106, 63));
+ assertEquals(4, f.getBiomeAt(16, 106, 48));
+ assertEquals(4, f.getBiomeAt(16, 106, 63));
+ assertEquals(162, f.getBiomeAt(31, 106, 48));
+ }
}
diff --git a/src/test/java/net/querz/nbt/mca/MCATestCase.java b/src/test/java/net/querz/mca/MCATestCase.java
similarity index 91%
rename from src/test/java/net/querz/nbt/mca/MCATestCase.java
rename to src/test/java/net/querz/mca/MCATestCase.java
index e2843b78..1c87e4c7 100644
--- a/src/test/java/net/querz/nbt/mca/MCATestCase.java
+++ b/src/test/java/net/querz/mca/MCATestCase.java
@@ -1,8 +1,8 @@
-package net.querz.nbt.mca;
+package net.querz.mca;
-import net.querz.nbt.CompoundTag;
-import net.querz.nbt.ListTag;
-import net.querz.nbt.NBTTestCase;
+import net.querz.nbt.tag.CompoundTag;
+import net.querz.nbt.tag.ListTag;
+import net.querz.NBTTestCase;
public abstract class MCATestCase extends NBTTestCase {
diff --git a/src/test/java/net/querz/nbt/mca/MCAUtilTest.java b/src/test/java/net/querz/mca/MCAUtilTest.java
similarity index 84%
rename from src/test/java/net/querz/nbt/mca/MCAUtilTest.java
rename to src/test/java/net/querz/mca/MCAUtilTest.java
index c4982d10..a63dde4e 100644
--- a/src/test/java/net/querz/nbt/mca/MCAUtilTest.java
+++ b/src/test/java/net/querz/mca/MCAUtilTest.java
@@ -1,4 +1,4 @@
-package net.querz.nbt.mca;
+package net.querz.mca;
import java.io.File;
@@ -75,17 +75,17 @@ public void testCreateNameFromLocation() {
}
public void testMakeMyCoverageGreatAgain() {
- assertThrowsException(() -> MCAUtil.readMCAFile((String) null), NullPointerException.class);
- assertThrowsException(() -> MCAUtil.writeMCAFile(null, (String) null), NullPointerException.class);
- assertThrowsException(() -> MCAUtil.writeMCAFile(null, (File) null), NullPointerException.class);
- assertThrowsException(() -> MCAUtil.writeMCAFile(null, (String) null, false), NullPointerException.class);
- assertThrowsException(() -> MCAUtil.readMCAFile("r.a.b.mca"), IllegalArgumentException.class);
+ assertThrowsException(() -> MCAUtil.read((String) null), NullPointerException.class);
+ assertThrowsException(() -> MCAUtil.write(null, (String) null), NullPointerException.class);
+ assertThrowsException(() -> MCAUtil.write(null, (File) null), NullPointerException.class);
+ assertThrowsException(() -> MCAUtil.write(null, (String) null, false), NullPointerException.class);
+ assertThrowsException(() -> MCAUtil.read("r.a.b.mca"), IllegalArgumentException.class);
assertThrowsNoException(() -> new MCAFile(0, 0).serialize(null)); // empty MCAFile will not even attempt to write to file
// test overwriting file
MCAFile m = new MCAFile(0, 0);
m.setChunk(0, Chunk.newChunk());
- assertThrowsNoException(() -> MCAUtil.writeMCAFile(m, getTmpFile("r.0.0.mca"), false), true);
- assertThrowsNoException(() -> MCAUtil.writeMCAFile(m, getTmpFile("r.0.0.mca"), false), true);
+ assertThrowsNoException(() -> MCAUtil.write(m, getTmpFile("r.0.0.mca"), false), true);
+ assertThrowsNoException(() -> MCAUtil.write(m, getTmpFile("r.0.0.mca"), false), true);
}
}
diff --git a/src/test/java/net/querz/nbt/TagFactoryTest.java b/src/test/java/net/querz/nbt/TagFactoryTest.java
deleted file mode 100644
index 0fa7aa6e..00000000
--- a/src/test/java/net/querz/nbt/TagFactoryTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package net.querz.nbt;
-
-import net.querz.nbt.custom.CharTag;
-
-public class TagFactoryTest extends NBTTestCase {
-
- public void testFromID() {
- assertEquals(EndTag.class, TagFactory.fromID(0).getClass());
- assertEquals(ByteTag.class, TagFactory.fromID(1).getClass());
- assertEquals(ShortTag.class, TagFactory.fromID(2).getClass());
- assertEquals(IntTag.class, TagFactory.fromID(3).getClass());
- assertEquals(LongTag.class, TagFactory.fromID(4).getClass());
- assertEquals(FloatTag.class, TagFactory.fromID(5).getClass());
- assertEquals(DoubleTag.class, TagFactory.fromID(6).getClass());
- assertEquals(ByteArrayTag.class, TagFactory.fromID(7).getClass());
- assertEquals(StringTag.class, TagFactory.fromID(8).getClass());
- assertEquals(ListTag.class, TagFactory.fromID(9).getClass());
- assertEquals(CompoundTag.class, TagFactory.fromID(10).getClass());
- assertEquals(IntArrayTag.class, TagFactory.fromID(11).getClass());
- assertEquals(LongArrayTag.class, TagFactory.fromID(12).getClass());
- assertThrowsRuntimeException(() -> TagFactory.fromID(-1), IllegalArgumentException.class);
- }
-
- public void testClassFromID() {
- assertThrowsNoRuntimeException(() -> TagFactory.classFromID(1));
- assertThrowsRuntimeException(() -> TagFactory.classFromID(20), IllegalArgumentException.class);
- }
-
- public void testIDFromClass() {
- assertThrowsNoRuntimeException(() -> TagFactory.idFromClass(ByteTag.class));
- assertThrowsRuntimeException(() -> TagFactory.idFromClass(CharTag.class), IllegalArgumentException.class);
- }
-
- public void testRegisterCustomTag() {
- assertThrowsRuntimeException(() -> TagFactory.registerCustomTag(-1, CharTag::new, CharTag.class), IllegalArgumentException.class);
- assertThrowsRuntimeException(() -> TagFactory.registerCustomTag(12, CharTag::new, CharTag.class), IllegalArgumentException.class);
- assertThrowsRuntimeException(() -> TagFactory.registerCustomTag(128, CharTag::new, CharTag.class), IllegalArgumentException.class);
- CharTag.register();
- assertThrowsRuntimeException(CharTag::register, IllegalArgumentException.class);
- }
-
- public void testUnregisterCustomTag() {
- CharTag.register();
- assertThrowsNoRuntimeException(() -> TagFactory.unregisterCustomTag(new CharTag().getID()));
- }
-}
diff --git a/src/test/java/net/querz/nbt/TagTest.java b/src/test/java/net/querz/nbt/TagTest.java
deleted file mode 100644
index 02937fb3..00000000
--- a/src/test/java/net/querz/nbt/TagTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package net.querz.nbt;
-
-import java.io.ByteArrayInputStream;
-import java.io.DataInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.PushbackInputStream;
-import java.util.LinkedHashMap;
-import java.util.zip.GZIPInputStream;
-
-public class TagTest extends NBTTestCase {
-
- public void testWriteReadTag() {
- CompoundTag t = new CompoundTag();
- invokeSetValue(t, new LinkedHashMap<>());
- t.putByte("byte", Byte.MAX_VALUE);
- t.putShort("short", Short.MAX_VALUE);
- File file = getNewTmpFile("compressed.dat");
- try {
- NBTUtil.writeTag(t, "name", file, true);
- } catch (IOException ex) {
- fail(ex.getMessage());
- }
-
- assertEquals("E8F7B55F81FADB8A5657461D9188DE73", calculateFileMD5(file));
-
- try {
- CompoundTag tt = (CompoundTag) NBTUtil.readTag(file);
- assertEquals(t, tt);
- } catch (IOException ex) {
- fail(ex.getMessage());
- }
- }
-
- public void testApplyDecompression() {
- ByteArrayInputStream baisComp = new ByteArrayInputStream(new byte[]{31, -117, 8, 0, 0, 0, 0, 0, 0, 0});
- try (DataInputStream in = new DataInputStream(baisComp)) {
- assertTrue(NBTUtil.applyDecompression(in) instanceof GZIPInputStream);
- } catch (IOException ex) {
- ex.printStackTrace();
- fail(ex.getMessage());
- }
-
- ByteArrayInputStream baisUncomp = new ByteArrayInputStream(new byte[]{0, 0});
- try (DataInputStream in = new DataInputStream(baisUncomp)) {
- assertTrue(NBTUtil.applyDecompression(in) instanceof PushbackInputStream);
- } catch (IOException ex) {
- ex.printStackTrace();
- fail(ex.getMessage());
- }
- }
-
- public void testMakeMyCoverageGreatAgain() {
- assertThrowsException(() -> NBTUtil.readTag((String) null), NullPointerException.class);
- assertThrowsException(() -> NBTUtil.writeTag(null, (String) null), NullPointerException.class);
- assertThrowsException(() -> NBTUtil.writeTag(null, (File) null), NullPointerException.class);
- assertThrowsException(() -> NBTUtil.writeTag(null, (String) null, false), NullPointerException.class);
- assertThrowsException(() -> NBTUtil.writeTag(null, (File) null, false), NullPointerException.class);
- assertThrowsException(() -> NBTUtil.writeTag(null, null, (String) null), NullPointerException.class);
- assertThrowsException(() -> NBTUtil.writeTag(null, (File) null), NullPointerException.class);
- assertThrowsException(() -> NBTUtil.writeTag(null, null, (File) null), NullPointerException.class);
- assertThrowsException(() -> NBTUtil.writeTag(null, (File) null), NullPointerException.class);
- assertThrowsException(() -> NBTUtil.writeTag(null, null, (File) null, false), NullPointerException.class);
- assertThrowsException(() -> NBTUtil.writeTag(null, null, (String) null, false), NullPointerException.class);
-
- CompoundTag dummy = new CompoundTag();
- assertThrowsNoException(() -> NBTUtil.writeTag(dummy, getNewTmpFile("coverage.dat")));
- assertThrowsNoException(() -> NBTUtil.writeTag(dummy, getNewTmpFile("coverage.dat").getAbsolutePath()));
- assertThrowsNoException(() -> NBTUtil.writeTag(dummy, getNewTmpFile("coverage.dat"), true));
- assertThrowsNoException(() -> NBTUtil.writeTag(dummy, getNewTmpFile("coverage.dat").getAbsolutePath(), true));
- assertThrowsNoException(() -> NBTUtil.writeTag(dummy, "foo", getNewTmpFile("coverage.dat")));
- assertThrowsNoException(() -> NBTUtil.writeTag(dummy, "foo", getNewTmpFile("coverage.dat").getAbsolutePath()));
- assertThrowsNoException(() -> NBTUtil.writeTag(dummy, "foo", getNewTmpFile("coverage.dat").getAbsolutePath(), true));
- }
-}
diff --git a/src/test/java/net/querz/nbt/custom/CharTagTest.java b/src/test/java/net/querz/nbt/custom/CharTagTest.java
deleted file mode 100644
index 9f9c2bf0..00000000
--- a/src/test/java/net/querz/nbt/custom/CharTagTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package net.querz.nbt.custom;
-
-import net.querz.nbt.NBTTestCase;
-import java.util.Arrays;
-
-public class CharTagTest extends NBTTestCase {
-
- public void testStringConversion() {
- CharTag.register();
- CharTag t = new CharTag('a');
- assertEquals('a', (char) t.getValue());
- assertEquals(110, t.getID());
- assertEquals("a", t.toTagString());
- assertEquals("{\"type\":\"" + t.getClass().getSimpleName() + "\",\"value\":\"a\"}", t.toString());
- }
-
- public void testEquals() {
- CharTag t = new CharTag('a');
- CharTag t2 = new CharTag('a');
- assertTrue(t.equals(t2));
- CharTag t3 = new CharTag('b');
- assertFalse(t.equals(t3));
- }
-
- public void testClone() {
- CharTag t = new CharTag('a');
- CharTag tc = t.clone();
- assertTrue(t.equals(tc));
- assertFalse(t == tc);
- }
-
- public void testSerializeDeserialize() {
- CharTag t = new CharTag('a');
- CharTag.register();
- byte[] data = serialize(t);
- assertTrue(Arrays.equals(new byte[]{110, 0, 0, 0, 97}, data));
- CharTag tt = (CharTag) deserialize(data);
- assertTrue(t.equals(tt));
- }
-
- public void testCompareTo() {
- assertEquals(0, new CharTag('a').compareTo(new CharTag('a')));
- assertTrue(0 < new CharTag('b').compareTo(new CharTag('a')));
- assertTrue(0 > new CharTag('a').compareTo(new CharTag('b')));
-
- }
-}
diff --git a/src/test/java/net/querz/nbt/custom/ObjectTagTest.java b/src/test/java/net/querz/nbt/custom/ObjectTagTest.java
deleted file mode 100644
index e069d88c..00000000
--- a/src/test/java/net/querz/nbt/custom/ObjectTagTest.java
+++ /dev/null
@@ -1,203 +0,0 @@
-package net.querz.nbt.custom;
-
-import net.querz.nbt.NBTTestCase;
-import net.querz.nbt.NBTUtil;
-import net.querz.nbt.TagFactory;
-import static org.junit.Assert.assertNotEquals;
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Objects;
-import java.util.Random;
-
-public class ObjectTagTest extends NBTTestCase {
-
- public void testStringConversion() {
- ObjectTag.register();
- DummyObject d = new DummyObject();
- ObjectTag o = new ObjectTag<>(d);
- assertEquals(90, o.getID());
- assertEquals("{\"type\":\"ObjectTag\",\"value\":\"" + d + "\"}", o.toString());
- assertEquals("\"" + d + "\"", o.toTagString());
- }
-
- public void testEquals() {
- DummyObject d = new DummyObject();
- ObjectTag o = new ObjectTag<>(d);
- ObjectTag o2 = new ObjectTag<>(d);
- assertTrue(o.equals(o2));
- ObjectTag o3 = new ObjectTag<>(new DummyObject());
- assertFalse(o.equals(o3));
- ObjectTag o4 = new ObjectTag<>(d.clone());
- assertTrue(o.equals(o4));
- }
-
- public void testHashCode() {
- DummyObject d = new DummyObject();
- DummyObject d2 = new DummyObject();
- ObjectTag o = new ObjectTag<>(d);
- ObjectTag o2 = new ObjectTag<>(d2);
- assertNotEquals(o.hashCode(), o2.hashCode());
- assertEquals(o.hashCode(), o.clone().hashCode());
- assertEquals(0, new ObjectTag().hashCode());
- }
-
- public void testClone() {
- DummyObject d = new DummyObject();
- ObjectTag o = new ObjectTag<>(d);
- ObjectTag c = o.clone();
- assertTrue(o.equals(c));
- assertFalse(o == c);
- assertFalse(o.getValue() == c.getValue());
- ObjectTag s = new ObjectTag<>("string");
- ObjectTag cs = s.clone();
- assertTrue(s.equals(cs));
- assertFalse(s == cs);
- //String is immutable and not cloneable, so it still has the same reference
- //noinspection StringEquality
- assertTrue(s.getValue() == cs.getValue());
- }
-
- public void testSerializeDeserialize() {
- DummyObject d = new DummyObject();
- ObjectTag o = new ObjectTag<>(d);
- ObjectTag.register();
- byte[] data = serialize(o);
- ObjectTag> oo = ((ObjectTag>) deserialize(data));
- assertNotNull(oo);
- assertThrowsNoRuntimeException(() -> oo.asTypedObjectTag(AbstractDummyObject.class));
- assertThrowsRuntimeException(() -> oo.asTypedObjectTag(String.class), ClassCastException.class);
- ObjectTag ooo = oo.asTypedObjectTag(AbstractDummyObject.class);
- assertTrue(o.equals(ooo));
- }
-
- public void testNullValue() {
- ObjectTag n = new ObjectTag<>();
- assertNull(n.getValue());
- assertEquals("{\"type\":\"ObjectTag\",\"value\":null}", n.toString());
- assertEquals("null", n.toTagString());
- }
-
- public void testNullValueEquals() {
- ObjectTag n = new ObjectTag<>();
- ObjectTag n2 = new ObjectTag<>(null);
- assertTrue(n.equals(n2));
- ObjectTag n3 = new ObjectTag<>(null);
- assertTrue(n.equals(n3));
- }
-
- public void testNullValueClone() {
- ObjectTag n = new ObjectTag<>();
- ObjectTag nc = n.clone();
- assertTrue(n.equals(nc));
- assertFalse(n == nc);
- assertTrue(n.getValue() == nc.getValue());
- }
-
- public void testNullValueSerializeDeserialize() {
- ObjectTag n = new ObjectTag<>();
- ObjectTag.register();
- byte[] data = serialize(n);
- ObjectTag> nn = ((ObjectTag>) deserialize(data));
- assertNotNull(nn);
- ObjectTag nnn = nn.asTypedObjectTag(AbstractDummyObject.class);
- assertTrue(n.equals(nnn));
- }
-
- public void testCompareTo() {
- ObjectTag d = new ObjectTag<>(new DummyObject());
- ObjectTag d2 = new ObjectTag<>(new DummyObject());
- //not comparable
- assertEquals(0, d.compareTo(d2));
-
- ObjectTag d3 = new ObjectTag<>("abc");
- ObjectTag d4 = new ObjectTag<>("abd");
- assertTrue(0 > d3.compareTo(d4));
- assertTrue(0 < d4.compareTo(d3));
-
- ObjectTag d5 = new ObjectTag<>("abc");
- assertEquals(0, d3.compareTo(d5));
-
- DummyObject o = new DummyObject();
- ObjectTag d6 = new ObjectTag<>(o);
- ObjectTag d7 = new ObjectTag<>(o);
- assertEquals(0, d6.compareTo(d7));
-
- ObjectTag d8 = new ObjectTag<>();
- assertEquals(1, d8.compareTo(d7));
- assertEquals(-1, d7.compareTo(d8));
-
- ObjectTag d9 = new ObjectTag<>();
- assertEquals(0, d8.compareTo(d9));
-
- List> l = new ArrayList<>();
- l.add(d);
- l.add(d9);
- l.add(d2);
- l.sort(Comparator.naturalOrder());
- assertEquals(d9, l.get(2));
- }
-
- public void testUnknownObject() {
- TagFactory.registerCustomTag(90, ObjectTag::new, ObjectTag.class);
- assertThrowsException(() -> NBTUtil.readTag(getResourceFile("unknown_object_tag.dat")), IOException.class);
- }
-
- public static abstract class AbstractDummyObject implements Serializable {
- private static final long serialVersionUID = 1L;
-
- @Override
- public String toString() {
- return "AbstractDummyObject";
- }
- }
-
- private static final Random RANDOM = new Random();
-
- public static class DummyObject extends AbstractDummyObject implements Cloneable {
- private static final long serialVersionUID = 1L;
-
- public byte a = (byte) RANDOM.nextInt(Byte.MAX_VALUE);
- public short b = (short) RANDOM.nextInt(Short.MAX_VALUE);
- public int c = RANDOM.nextInt();
- public long d = RANDOM.nextLong();
- public float e = RANDOM.nextFloat();
- public double f = RANDOM.nextDouble();
-
- @Override
- public DummyObject clone() {
- try {
- return (DummyObject) super.clone();
- } catch (CloneNotSupportedException ex) {
- ex.printStackTrace();
- return null;
- }
- }
-
- @Override
- public String toString() {
- return String.format("%d/%d/%d/%d/%f/%f", a, b, c, d, e, f);
- }
-
- @Override
- public boolean equals(Object other) {
- if (other instanceof DummyObject) {
- DummyObject t = (DummyObject) other;
- return t.a == a
- && t.b == b
- && t.c == c
- && t.d == d
- && t.e == e
- && t.f == f;
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(a, b, c, d, e, f);
- }
- }
-}
diff --git a/src/test/java/net/querz/nbt/custom/ShortArrayTagTest.java b/src/test/java/net/querz/nbt/custom/ShortArrayTagTest.java
deleted file mode 100644
index b4a7fd5b..00000000
--- a/src/test/java/net/querz/nbt/custom/ShortArrayTagTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package net.querz.nbt.custom;
-
-import net.querz.nbt.NBTTestCase;
-import java.util.Arrays;
-import static org.junit.Assert.assertNotEquals;
-
-public class ShortArrayTagTest extends NBTTestCase {
-
- public void testStringConversion() {
- ShortArrayTag.register();
- ShortArrayTag t = new ShortArrayTag(new short[]{Short.MIN_VALUE, 0, Short.MAX_VALUE});
- assertTrue(Arrays.equals(new short[]{Short.MIN_VALUE, 0, Short.MAX_VALUE}, t.getValue()));
- assertEquals(100, t.getID());
- assertEquals("[S;-32768s,0s,32767s]", t.toTagString());
- assertEquals("{\"type\":\"" + t.getClass().getSimpleName() + "\",\"value\":[-32768,0,32767]}", t.toString());
- }
-
- public void testEquals() {
- ShortArrayTag t = new ShortArrayTag(new short[]{Short.MIN_VALUE, 0, Short.MAX_VALUE});
- ShortArrayTag t2 = new ShortArrayTag(new short[]{Short.MIN_VALUE, 0, Short.MAX_VALUE});
- assertTrue(t.equals(t2));
- ShortArrayTag t3 = new ShortArrayTag(new short[]{Short.MAX_VALUE, 0, Short.MIN_VALUE});
- assertFalse(t.equals(t3));
- }
-
- public void testHashCode() {
- ShortArrayTag t = new ShortArrayTag(new short[]{Short.MIN_VALUE, 0, Short.MAX_VALUE});
- ShortArrayTag t2 = new ShortArrayTag(new short[]{Short.MAX_VALUE, 0, Short.MIN_VALUE});
- assertNotEquals(t.hashCode(), t2.hashCode());
- assertEquals(t.hashCode(), t.clone().hashCode());
- }
-
- public void testClone() {
- ShortArrayTag t = new ShortArrayTag(new short[]{Short.MIN_VALUE, 0, Short.MAX_VALUE});
- ShortArrayTag tc = t.clone();
- assertTrue(t.equals(tc));
- assertFalse(t == tc);
- assertFalse(t.getValue() == tc.getValue());
- }
-
- public void testSerializeDeserialize() {
- ShortArrayTag t = new ShortArrayTag(new short[]{Short.MIN_VALUE, 0, Short.MAX_VALUE});
- ShortArrayTag.register();
- byte[] data = serialize(t);
- assertTrue(Arrays.equals(new byte[]{100, 0, 0, 0, 0, 0, 3, -128, 0, 0, 0, 127, -1}, data));
- ShortArrayTag tt = (ShortArrayTag) deserialize(data);
- assertTrue(t.equals(tt));
- }
-
- public void testCompareTo() {
- ShortArrayTag t = new ShortArrayTag(new short[]{Short.MIN_VALUE, 0, Short.MAX_VALUE});
- ShortArrayTag t2 = new ShortArrayTag(new short[]{Short.MIN_VALUE, 0, Short.MAX_VALUE});
- ShortArrayTag t3 = new ShortArrayTag(new short[]{Short.MAX_VALUE, 0, Short.MIN_VALUE});
- ShortArrayTag t4 = new ShortArrayTag(new short[]{0, Short.MIN_VALUE});
- assertEquals(0, t.compareTo(t2));
- assertEquals(0, t.compareTo(t3));
- assertTrue(0 < t.compareTo(t4));
- assertTrue(0 > t4.compareTo(t));
- assertThrowsRuntimeException(() -> t.compareTo(null), NullPointerException.class);
- }
-}
diff --git a/src/test/java/net/querz/nbt/custom/StructTagTest.java b/src/test/java/net/querz/nbt/custom/StructTagTest.java
deleted file mode 100644
index 77c8cfbc..00000000
--- a/src/test/java/net/querz/nbt/custom/StructTagTest.java
+++ /dev/null
@@ -1,195 +0,0 @@
-package net.querz.nbt.custom;
-
-import junit.framework.TestCase;
-import net.querz.nbt.ByteTag;
-import net.querz.nbt.CompoundTag;
-import net.querz.nbt.IntTag;
-import net.querz.nbt.ListTag;
-import net.querz.nbt.LongTag;
-import net.querz.nbt.NBTTestCase;
-import net.querz.nbt.StringTag;
-import net.querz.nbt.Tag;
-import java.util.Arrays;
-import static org.junit.Assert.assertNotEquals;
-
-public class StructTagTest extends NBTTestCase {
-
- private StructTag createStructTag() {
- StructTag s = new StructTag();
- s.add(new ByteTag(Byte.MAX_VALUE));
- s.add(new IntTag(Integer.MAX_VALUE));
- return s;
- }
-
- public void testStringConversion() {
- StructTag.register();
- StructTag s = createStructTag();
- assertEquals(120, s.getID());
- assertEquals("[127b,2147483647]", s.toTagString());
- assertEquals("{\"type\":\"StructTag\",\"value\":[{\"type\":\"ByteTag\",\"value\":127},{\"type\":\"IntTag\",\"value\":2147483647}]}", s.toString());
- }
-
- public void testEquals() {
- StructTag s = createStructTag();
-
- StructTag s2 = new StructTag();
- s2.add(new ByteTag(Byte.MAX_VALUE));
- s2.add(new IntTag(Integer.MAX_VALUE));
- assertTrue(s.equals(s2));
-
- StructTag s3 = new StructTag();
- s3.add(new IntTag(Integer.MAX_VALUE));
- s3.add(new ByteTag(Byte.MAX_VALUE));
- assertFalse(s.equals(s3));
-
- StructTag s4 = new StructTag();
- s4.add(new ByteTag(Byte.MAX_VALUE));
- assertFalse(s.equals(s4));
- }
-
- public void testHashCode() {
- StructTag s = createStructTag();
- StructTag s2 = createStructTag();
- s2.addInt(123);
- assertNotEquals(s.hashCode(), s2.hashCode());
- assertEquals(s.hashCode(), s.clone().hashCode());
-
- }
-
- public void testClone() {
- StructTag s = createStructTag();
- StructTag c = s.clone();
- assertTrue(s.equals(c));
- assertFalse(s == c);
- assertFalse(invokeGetValue(s) == invokeGetValue(c));
- }
-
- public void testSerializeDeserialize() {
- StructTag s = createStructTag();
- StructTag.register();
- byte[] data = serialize(s);
- assertTrue(Arrays.equals(new byte[]{120, 0, 0, 0, 0, 0, 2, 1, 127, 3, 127, -1, -1, -1}, data));
- StructTag ss = (StructTag) deserialize(data);
- assertTrue(s.equals(ss));
- }
-
- public void testCompareTo() {
- StructTag st = new StructTag();
- st.addInt(1);
- st.addInt(2);
- StructTag so = new StructTag();
- so.addInt(3);
- so.addInt(4);
- assertEquals(0, st.compareTo(so));
- so.addInt(5);
- assertEquals(-1, st.compareTo(so));
- so.remove(2);
- so.remove(1);
- assertEquals(1, st.compareTo(so));
- assertThrowsRuntimeException(() -> st.compareTo(null), NullPointerException.class);
- }
-
- public void testContains() {
- StructTag l = new StructTag();
- l.addInt(1);
- l.addLong(2);
- assertTrue(l.contains(new IntTag(1)));
- assertFalse(l.contains(new IntTag(2)));
- assertTrue(l.containsAll(Arrays.asList(new IntTag(1), new LongTag(2))));
- assertFalse(l.containsAll(Arrays.asList(new IntTag(1), new IntTag(2))));
- }
-
- public void testIterator() {
- StructTag l = new StructTag();
- l.addInt(1);
- l.addLong(2);
- for (Tag> t : l) {
- assertNotNull(t);
- }
- l.forEach(TestCase::assertNotNull);
- }
-
- public void testSet() {
- StructTag l = createStructTag();
- l.set(1, new ByteTag((byte) 5));
- assertEquals(2, l.size());
- assertEquals(5, l.getByte(1));
- assertThrowsRuntimeException(() -> l.set(0, null), NullPointerException.class);
- }
-
- public void testAdd() {
- StructTag l = new StructTag();
- l.addBoolean(true);
- assertThrowsNoRuntimeException(() -> l.addShort((short) 5));
- assertEquals(2, l.size());
- assertEquals(1, l.getByte(0));
- l.addByte(Byte.MAX_VALUE);
- assertEquals(3, l.size());
- assertEquals(Byte.MAX_VALUE, l.getByte(2));
- l.addBoolean(true);
- assertEquals(1, l.getByte(3));
- l.addBoolean(false);
- assertEquals(0, l.getByte(4));
- assertTrue(l.getBoolean(3));
- assertFalse(l.getBoolean(4));
- l.remove(new ByteTag(Byte.MAX_VALUE));
- assertEquals(4, l.size());
- assertThrowsRuntimeException(() -> l.remove(-1), ArrayIndexOutOfBoundsException.class);
- assertThrowsRuntimeException(() -> l.remove(4), IndexOutOfBoundsException.class);
- assertEquals(new ByteTag(true), assertThrowsNoRuntimeException(() -> l.remove(2)));
- l.clear();
- assertEquals(0, l.size());
-
- StructTag s = new StructTag();
- s.addShort(Short.MAX_VALUE);
- assertEquals(1, s.size());
- assertEquals(Short.MAX_VALUE, s.getShort(0));
- StructTag i = new StructTag();
- i.addInt(Integer.MAX_VALUE);
- assertEquals(1, i.size());
- assertEquals(Integer.MAX_VALUE, i.getInt(0));
- StructTag lo = new StructTag();
- lo.addLong(Long.MAX_VALUE);
- assertEquals(1, lo.size());
- assertEquals(Long.MAX_VALUE, lo.getLong(0));
- StructTag f = new StructTag();
- f.addFloat(Float.MAX_VALUE);
- assertEquals(1, f.size());
- assertEquals(Float.MAX_VALUE, f.getFloat(0));
- StructTag d = new StructTag();
- d.addDouble(Double.MAX_VALUE);
- assertEquals(1, d.size());
- assertEquals(Double.MAX_VALUE, d.getDouble(0));
- StructTag st = new StructTag();
- st.addString("foo");
- assertEquals(1, st.size());
- assertEquals("foo", st.getString(0));
- StructTag ba = new StructTag();
- ba.addByteArray(new byte[] {Byte.MIN_VALUE, 0, Byte.MAX_VALUE});
- assertEquals(1, ba.size());
- assertTrue(Arrays.equals(new byte[] {Byte.MIN_VALUE, 0, Byte.MAX_VALUE}, ba.getByteArray(0)));
- StructTag ia = new StructTag();
- ia.addIntArray(new int[] {Integer.MIN_VALUE, 0, Integer.MAX_VALUE});
- assertEquals(1, ia.size());
- assertTrue(Arrays.equals(new int[] {Integer.MIN_VALUE, 0, Integer.MAX_VALUE}, ia.getIntArray(0)));
- StructTag la = new StructTag();
- la.addLongArray(new long[] {Long.MIN_VALUE, 0, Long.MAX_VALUE});
- assertEquals(1, la.size());
- assertTrue(Arrays.equals(new long[] {Long.MIN_VALUE, 0, Long.MAX_VALUE}, la.getLongArray(0)));
- StructTag co = new StructTag();
- co.add(new CompoundTag());
- assertEquals(1, co.size());
- assertEquals(new CompoundTag(), co.getCompoundTag(0));
- StructTag li = new StructTag();
- li.add(new ListTag<>(IntTag.class));
- assertEquals(1, li.size());
- assertEquals(new ListTag<>(IntTag.class), li.getListTag(0));
-
- StructTag t = new StructTag();
- t.add(0, new StringTag("foo"));
- t.add(0, new IntTag(Integer.MAX_VALUE));
- assertEquals(2, t.size());
- assertEquals(new IntTag(Integer.MAX_VALUE), t.get(0));
- assertEquals(new StringTag("foo"), t.get(1));
- }
-}
diff --git a/src/test/java/net/querz/nbt/io/NamedTagTest.java b/src/test/java/net/querz/nbt/io/NamedTagTest.java
new file mode 100644
index 00000000..2dd2d11c
--- /dev/null
+++ b/src/test/java/net/querz/nbt/io/NamedTagTest.java
@@ -0,0 +1,25 @@
+package net.querz.nbt.io;
+
+import net.querz.NBTTestCase;
+import net.querz.nbt.tag.ByteTag;
+import net.querz.nbt.tag.ShortTag;
+
+public class NamedTagTest extends NBTTestCase {
+
+ public void testCreate() {
+ ByteTag t = new ByteTag();
+ NamedTag n = new NamedTag("name", t);
+ assertEquals("name", n.getName());
+ assertTrue(n.getTag() == t);
+ }
+
+ public void testSet() {
+ ByteTag t = new ByteTag();
+ NamedTag n = new NamedTag("name", t);
+ n.setName("blah");
+ assertEquals("blah", n.getName());
+ ShortTag s = new ShortTag();
+ n.setTag(s);
+ assertTrue(n.getTag() == s);
+ }
+}
diff --git a/src/test/java/net/querz/nbt/io/SNBTParserTest.java b/src/test/java/net/querz/nbt/io/SNBTParserTest.java
new file mode 100644
index 00000000..597d2026
--- /dev/null
+++ b/src/test/java/net/querz/nbt/io/SNBTParserTest.java
@@ -0,0 +1,159 @@
+package net.querz.nbt.io;
+
+import net.querz.NBTTestCase;
+import net.querz.nbt.tag.*;
+import java.util.Arrays;
+
+public class SNBTParserTest extends NBTTestCase {
+
+ public void testParse() {
+ Tag> t = assertThrowsNoException(() -> new SNBTParser("{abc: def, blah: 4b, blubb: \"string\", \"foo\": 2s}").parse());
+ assertEquals(CompoundTag.class, t.getClass());
+ CompoundTag c = (CompoundTag) t;
+ assertEquals(4, c.size());
+ assertEquals("def", c.getString("abc"));
+ assertEquals((byte) 4, c.getByte("blah"));
+ assertEquals("string", c.getString("blubb"));
+ assertEquals((short) 2, c.getShort("foo"));
+ assertFalse(c.containsKey("invalid"));
+
+ // ------------------------------------------------- number tags
+
+ Tag> tb = assertThrowsNoException(() -> new SNBTParser("16b").parse());
+ assertEquals(ByteTag.class, tb.getClass());
+ assertEquals((byte) 16, ((ByteTag) tb).asByte());
+
+ tb = assertThrowsNoException(() -> new SNBTParser("16B").parse());
+ assertEquals(ByteTag.class, tb.getClass());
+ assertEquals((byte) 16, ((ByteTag) tb).asByte());
+
+ assertThrowsException((() -> new SNBTParser("-129b").parse()), ParseException.class);
+
+ Tag> ts = assertThrowsNoException(() -> new SNBTParser("17s").parse());
+ assertEquals(ShortTag.class, ts.getClass());
+ assertEquals((short) 17, ((ShortTag) ts).asShort());
+
+ ts = assertThrowsNoException(() -> new SNBTParser("17S").parse());
+ assertEquals(ShortTag.class, ts.getClass());
+ assertEquals((short) 17, ((ShortTag) ts).asShort());
+
+ assertThrowsException((() -> new SNBTParser("-32769s").parse()), ParseException.class);
+
+ Tag> ti = assertThrowsNoException(() -> new SNBTParser("18").parse());
+ assertEquals(IntTag.class, ti.getClass());
+ assertEquals(18, ((IntTag) ti).asInt());
+
+ assertThrowsException((() -> new SNBTParser("-2147483649").parse()), ParseException.class);
+
+ Tag> tl = assertThrowsNoException(() -> new SNBTParser("19l").parse());
+ assertEquals(LongTag.class, tl.getClass());
+ assertEquals(19L, ((LongTag) tl).asLong());
+
+ tl = assertThrowsNoException(() -> new SNBTParser("19L").parse());
+ assertEquals(LongTag.class, tl.getClass());
+ assertEquals(19L, ((LongTag) tl).asLong());
+
+ assertThrowsException((() -> new SNBTParser("-9223372036854775809l").parse()), ParseException.class);
+
+ Tag> tf = assertThrowsNoException(() -> new SNBTParser("20.3f").parse());
+ assertEquals(FloatTag.class, tf.getClass());
+ assertEquals(20.3f, ((FloatTag) tf).asFloat());
+
+ tf = assertThrowsNoException(() -> new SNBTParser("20.3F").parse());
+ assertEquals(FloatTag.class, tf.getClass());
+ assertEquals(20.3f, ((FloatTag) tf).asFloat());
+
+ Tag> td = assertThrowsNoException(() -> new SNBTParser("21.3d").parse());
+ assertEquals(DoubleTag.class, td.getClass());
+ assertEquals(21.3d, ((DoubleTag) td).asDouble());
+
+ td = assertThrowsNoException(() -> new SNBTParser("21.3D").parse());
+ assertEquals(DoubleTag.class, td.getClass());
+ assertEquals(21.3d, ((DoubleTag) td).asDouble());
+
+ td = assertThrowsNoException(() -> new SNBTParser("21.3").parse());
+ assertEquals(DoubleTag.class, td.getClass());
+ assertEquals(21.3d, ((DoubleTag) td).asDouble());
+
+ Tag> tbo = assertThrowsNoException(() -> new SNBTParser("true").parse());
+ assertEquals(ByteTag.class, tbo.getClass());
+ assertEquals((byte) 1, ((ByteTag) tbo).asByte());
+
+ tbo = assertThrowsNoException(() -> new SNBTParser("false").parse());
+ assertEquals(ByteTag.class, tbo.getClass());
+ assertEquals((byte) 0, ((ByteTag) tbo).asByte());
+
+ // ------------------------------------------------- arrays
+
+ Tag> ba = assertThrowsNoException(() -> new SNBTParser("[B; -128,0, 127]").parse());
+ assertEquals(ByteArrayTag.class, ba.getClass());
+ assertEquals(3, ((ByteArrayTag) ba).length());
+ assertTrue(Arrays.equals(new byte[]{-128, 0, 127}, ((ByteArrayTag) ba).getValue()));
+
+ Tag> ia = assertThrowsNoException(() -> new SNBTParser("[I; -2147483648, 0,2147483647]").parse());
+ assertEquals(IntArrayTag.class, ia.getClass());
+ assertEquals(3, ((IntArrayTag) ia).length());
+ assertTrue(Arrays.equals(new int[]{-2147483648, 0, 2147483647}, ((IntArrayTag) ia).getValue()));
+
+ Tag> la = assertThrowsNoException(() -> new SNBTParser("[L; -9223372036854775808, 0, 9223372036854775807 ]").parse());
+ assertEquals(LongArrayTag.class, la.getClass());
+ assertEquals(3, ((LongArrayTag) la).length());
+ assertTrue(Arrays.equals(new long[]{-9223372036854775808L, 0, 9223372036854775807L}, ((LongArrayTag) la).getValue()));
+
+ // ------------------------------------------------- invalid arrays
+
+ assertThrowsException((() -> new SNBTParser("[B; -129]").parse()), ParseException.class);
+ assertThrowsException((() -> new SNBTParser("[I; -2147483649]").parse()), ParseException.class);
+ assertThrowsException((() -> new SNBTParser("[L; -9223372036854775809]").parse()), ParseException.class);
+ assertThrowsException((() -> new SNBTParser("[B; 123b]").parse()), ParseException.class);
+ assertThrowsException((() -> new SNBTParser("[I; 123i]").parse()), ParseException.class);
+ assertThrowsException((() -> new SNBTParser("[L; 123l]").parse()), ParseException.class);
+ assertThrowsException((() -> new SNBTParser("[K; -129]").parse()), ParseException.class);
+
+ // ------------------------------------------------- high level errors
+
+ assertThrowsException(() -> new SNBTParser("{20:10} {blah:blubb}").parse(), ParseException.class);
+
+ // ------------------------------------------------- string tag
+
+ Tag> st = assertThrowsNoException(() -> new SNBTParser("abc").parse());
+ assertEquals(StringTag.class, st.getClass());
+ assertEquals("abc", ((StringTag) st).getValue());
+
+ st = assertThrowsNoException(() -> new SNBTParser("\"abc\"").parse());
+ assertEquals(StringTag.class, st.getClass());
+ assertEquals("abc", ((StringTag) st).getValue());
+
+ st = assertThrowsNoException(() -> new SNBTParser("123a").parse());
+ assertEquals(StringTag.class, st.getClass());
+ assertEquals("123a", ((StringTag) st).getValue());
+
+ // ------------------------------------------------- list tag
+
+ Tag> lt = assertThrowsNoException(() -> new SNBTParser("[abc, \"def\", \"123\" ]").parse());
+ assertEquals(ListTag.class, lt.getClass());
+ assertEquals(StringTag.class, ((ListTag>) lt).getTypeClass());
+ assertEquals(3, ((ListTag>) lt).size());
+ assertEquals("abc", ((ListTag>) lt).asStringTagList().get(0).getValue());
+ assertEquals("def", ((ListTag>) lt).asStringTagList().get(1).getValue());
+ assertEquals("123", ((ListTag>) lt).asStringTagList().get(2).getValue());
+
+ assertThrowsException(() -> new SNBTParser("[123, 456").parse(), ParseException.class);
+ assertThrowsException(() -> new SNBTParser("[123, 456d]").parse(), ParseException.class);
+
+ // ------------------------------------------------- compound tag
+
+ Tag> ct = assertThrowsNoException(() -> new SNBTParser("{abc: def,\"key\": 123d, blah: [L;123, 456], blubb: [123, 456]}").parse());
+ assertEquals(CompoundTag.class, ct.getClass());
+ assertEquals(4, ((CompoundTag) ct).size());
+ assertEquals("def", assertThrowsNoException(() -> ((CompoundTag) ct).getString("abc")));
+ assertEquals(123D, assertThrowsNoException(() -> ((CompoundTag) ct).getDouble("key")));
+ assertTrue(Arrays.equals(new long[]{123, 456}, assertThrowsNoException(() -> ((CompoundTag) ct).getLongArray("blah"))));
+ assertEquals(2, assertThrowsNoException(() -> ((CompoundTag) ct).getListTag("blubb")).size());
+ assertEquals(IntTag.class, ((CompoundTag) ct).getListTag("blubb").getTypeClass());
+
+ assertThrowsException(() -> new SNBTParser("{abc: def").parse(), ParseException.class);
+ assertThrowsException(() -> new SNBTParser("{\"\":empty}").parse(), ParseException.class);
+ assertThrowsException(() -> new SNBTParser("{empty:}").parse(), ParseException.class);
+ }
+}
diff --git a/src/test/java/net/querz/nbt/io/SNBTWriterTest.java b/src/test/java/net/querz/nbt/io/SNBTWriterTest.java
new file mode 100644
index 00000000..2553802e
--- /dev/null
+++ b/src/test/java/net/querz/nbt/io/SNBTWriterTest.java
@@ -0,0 +1,57 @@
+package net.querz.nbt.io;
+
+import net.querz.NBTTestCase;
+import net.querz.nbt.tag.*;
+
+import java.util.LinkedHashMap;
+
+public class SNBTWriterTest extends NBTTestCase {
+
+ public void testWrite() {
+
+ // write number tags
+
+ assertEquals("127b", assertThrowsNoException(() -> SNBTUtil.toSNBT(new ByteTag(Byte.MAX_VALUE))));
+ assertEquals("-32768s", assertThrowsNoException(() -> SNBTUtil.toSNBT(new ShortTag(Short.MIN_VALUE))));
+ assertEquals("-2147483648", assertThrowsNoException(() -> SNBTUtil.toSNBT(new IntTag(Integer.MIN_VALUE))));
+ assertEquals("-9223372036854775808l", assertThrowsNoException(() -> SNBTUtil.toSNBT(new LongTag(Long.MIN_VALUE))));
+ assertEquals("123.456f", assertThrowsNoException(() -> SNBTUtil.toSNBT(new FloatTag(123.456F))));
+ assertEquals("123.456d", assertThrowsNoException(() -> SNBTUtil.toSNBT(new DoubleTag(123.456D))));
+
+ // write array tags
+
+ assertEquals("[B;-128,0,127]", assertThrowsNoException(() -> SNBTUtil.toSNBT(new ByteArrayTag(new byte[]{Byte.MIN_VALUE, 0, Byte.MAX_VALUE}))));
+ assertEquals("[I;-2147483648,0,2147483647]", assertThrowsNoException(() -> SNBTUtil.toSNBT(new IntArrayTag(new int[]{Integer.MIN_VALUE, 0, Integer.MAX_VALUE}))));
+ assertEquals("[L;-9223372036854775808,0,9223372036854775807]", assertThrowsNoException(() -> SNBTUtil.toSNBT(new LongArrayTag(new long[]{Long.MIN_VALUE, 0, Long.MAX_VALUE}))));
+
+ // write string tag
+
+ assertEquals("abc", assertThrowsNoException(() -> SNBTUtil.toSNBT(new StringTag("abc"))));
+ assertEquals("\"123\"", assertThrowsNoException(() -> SNBTUtil.toSNBT(new StringTag("123"))));
+ assertEquals("\"123.456\"", assertThrowsNoException(() -> SNBTUtil.toSNBT(new StringTag("123.456"))));
+ assertEquals("\"-123\"", assertThrowsNoException(() -> SNBTUtil.toSNBT(new StringTag("-123"))));
+ assertEquals("\"-1.23e14\"", assertThrowsNoException(() -> SNBTUtil.toSNBT(new StringTag("-1.23e14"))));
+ assertEquals("\"äöü\\\\\"", assertThrowsNoException(() -> SNBTUtil.toSNBT(new StringTag("äöü\\"))));
+
+ // write list tag
+
+ ListTag lt = new ListTag<>(StringTag.class);
+ lt.addString("blah");
+ lt.addString("blubb");
+ lt.addString("123");
+ assertEquals("[blah,blubb,\"123\"]", assertThrowsNoException(() -> SNBTUtil.toSNBT(lt)));
+
+ // write compound tag
+ CompoundTag ct = new CompoundTag();
+ invokeSetValue(ct, new LinkedHashMap<>());
+ ct.putString("key", "value");
+ ct.putByte("byte", Byte.MAX_VALUE);
+ ct.putByteArray("array", new byte[]{Byte.MIN_VALUE, 0, Byte.MAX_VALUE});
+ ListTag clt = new ListTag<>(StringTag.class);
+ clt.addString("foo");
+ clt.addString("bar");
+ ct.put("list", clt);
+ String ctExpected = "{key:value,byte:127b,array:[B;-128,0,127],list:[foo,bar]}";
+ assertEquals(ctExpected, assertThrowsNoException(() -> SNBTUtil.toSNBT(ct)));
+ }
+}
diff --git a/src/test/java/net/querz/nbt/io/StringPointerTest.java b/src/test/java/net/querz/nbt/io/StringPointerTest.java
new file mode 100644
index 00000000..1030c114
--- /dev/null
+++ b/src/test/java/net/querz/nbt/io/StringPointerTest.java
@@ -0,0 +1,90 @@
+package net.querz.nbt.io;
+
+import net.querz.NBTTestCase;
+
+public class StringPointerTest extends NBTTestCase {
+
+ public void testLookAhead() {
+ StringPointer ptr = new StringPointer("abcdefg");
+ char c = ptr.lookAhead(3);
+ assertEquals('d', c);
+ assertEquals('a', ptr.currentChar());
+ }
+
+ public void testSkip() {
+ StringPointer ptr = new StringPointer("abcdefg");
+ ptr.skip(3);
+ assertEquals('d', ptr.currentChar());
+ }
+
+ public void testNext() {
+ StringPointer ptr = new StringPointer("abcdefg");
+ assertEquals('a', ptr.next());
+ assertEquals('b', ptr.currentChar());
+ }
+
+ public void testCurrentChar() {
+ StringPointer ptr = new StringPointer("abcdefg");
+ assertEquals('a', ptr.currentChar());
+ ptr.skip(3);
+ assertEquals('d', ptr.currentChar());
+ }
+
+ public void testHasCharsLeft() {
+ StringPointer ptr = new StringPointer("abcdefg");
+ assertTrue(ptr.hasCharsLeft(1));
+ assertTrue(ptr.hasCharsLeft(6));
+ assertFalse(ptr.hasCharsLeft(7));
+ }
+
+ public void testHasNext() {
+ StringPointer ptr = new StringPointer("abcdefg");
+ assertTrue(ptr.hasNext());
+ ptr.skip(6);
+ assertTrue(ptr.hasNext());
+ ptr.skip(1);
+ assertFalse(ptr.hasNext());
+ }
+
+ public void testSkipWhitespace() {
+ StringPointer ptr = new StringPointer("abc \t defg");
+ ptr.skip(3);
+ assertEquals(' ', ptr.currentChar());
+ ptr.skipWhitespace();
+ assertEquals('d', ptr.currentChar());
+ }
+
+ public void testExpectChar() {
+ StringPointer ptr = new StringPointer("abcdefg");
+ assertThrowsNoException(() -> ptr.expectChar('a'));
+ assertThrowsException(() -> ptr.expectChar('a'), ParseException.class);
+ }
+
+ public void testNextArrayElement() {
+ StringPointer ptr = new StringPointer("1, 2, 3");
+ ptr.next();
+ assertTrue(ptr.nextArrayElement());
+ ptr.next();
+ assertTrue(ptr.nextArrayElement());
+ ptr.next();
+ assertFalse(ptr.nextArrayElement());
+ }
+
+ public void testParseQuotedString() {
+ StringPointer ptr = new StringPointer("\"abcdefg\"");
+ assertEquals("abcdefg", assertThrowsNoException(ptr::parseQuotedString));
+ ptr = new StringPointer("\"abc\\def\"");
+ assertThrowsException(ptr::parseQuotedString, ParseException.class);
+ ptr = new StringPointer("\"abc\\\\def\\\\\"");
+ assertEquals("abc\\def\\", assertThrowsNoException(ptr::parseQuotedString));
+ ptr = new StringPointer("\"abc");
+ assertThrowsException(ptr::parseQuotedString, ParseException.class);
+ }
+
+ public void testParseSimpleString() {
+ StringPointer ptr = new StringPointer("abcdefg},{something else}");
+ assertEquals("abcdefg", ptr.parseSimpleString());
+ ptr = new StringPointer("abcdefg");
+ assertEquals("abcdefg", ptr.parseSimpleString());
+ }
+}
diff --git a/src/test/java/net/querz/nbt/ByteArrayTagTest.java b/src/test/java/net/querz/nbt/tag/ByteArrayTagTest.java
similarity index 79%
rename from src/test/java/net/querz/nbt/ByteArrayTagTest.java
rename to src/test/java/net/querz/nbt/tag/ByteArrayTagTest.java
index 8de2f590..1d10e033 100644
--- a/src/test/java/net/querz/nbt/ByteArrayTagTest.java
+++ b/src/test/java/net/querz/nbt/tag/ByteArrayTagTest.java
@@ -1,16 +1,28 @@
-package net.querz.nbt;
+package net.querz.nbt.tag;
+
+import net.querz.NBTTestCase;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
import java.util.Arrays;
public class ByteArrayTagTest extends NBTTestCase {
+
+ public void testCreate() {
+ ByteArrayTag t = new ByteArrayTag(new byte[]{Byte.MIN_VALUE, 0, Byte.MAX_VALUE});
+ assertTrue(Arrays.equals(new byte[]{Byte.MIN_VALUE, 0, Byte.MAX_VALUE}, t.getValue()));
+ t = new ByteArrayTag();
+ assertTrue(Arrays.equals(ByteArrayTag.ZERO_VALUE, t.getValue()));
+ }
+
+ public void testSetValue() {
+ ByteArrayTag t = new ByteArrayTag();
+ t.setValue(new byte[]{Byte.MIN_VALUE, 0, Byte.MAX_VALUE});
+ assertTrue(Arrays.equals(new byte[]{Byte.MIN_VALUE, 0, Byte.MAX_VALUE}, t.getValue()));
+ }
public void testStringConversion() {
ByteArrayTag t = new ByteArrayTag(new byte[]{Byte.MIN_VALUE, 0, Byte.MAX_VALUE});
assertTrue(Arrays.equals(new byte[]{Byte.MIN_VALUE, 0, Byte.MAX_VALUE}, t.getValue()));
assertEquals(7, t.getID());
- assertEquals("[B;-128b,0b,127b]", t.toTagString());
assertEquals("{\"type\":\"" + t.getClass().getSimpleName() + "\",\"value\":[-128,0,127]}", t.toString());
}
@@ -66,18 +78,8 @@ public NotAnArrayTag(String value) {
}
@Override
- public void serializeValue(DataOutputStream dos, int depth) {
- throw new UnsupportedOperationException("goddammit, this is a test class, you don't want to save it.");
- }
-
- @Override
- public void deserializeValue(DataInputStream dis, int depth) {
- throw new UnsupportedOperationException("goddammit, this is a test class, you don't want to load it.");
- }
-
- @Override
- public String valueToTagString(int depth) {
- return escapeString(getValue(), true);
+ public byte getID() {
+ return 0;
}
@Override
diff --git a/src/test/java/net/querz/nbt/ByteTagTest.java b/src/test/java/net/querz/nbt/tag/ByteTagTest.java
similarity index 83%
rename from src/test/java/net/querz/nbt/ByteTagTest.java
rename to src/test/java/net/querz/nbt/tag/ByteTagTest.java
index de8b604a..ff9451d0 100644
--- a/src/test/java/net/querz/nbt/ByteTagTest.java
+++ b/src/test/java/net/querz/nbt/tag/ByteTagTest.java
@@ -1,8 +1,23 @@
-package net.querz.nbt;
+package net.querz.nbt.tag;
+
+import net.querz.NBTTestCase;
import java.util.Arrays;
public class ByteTagTest extends NBTTestCase {
+
+ public void testCreate() {
+ ByteTag t = new ByteTag(Byte.MAX_VALUE);
+ assertEquals(Byte.MAX_VALUE, t.asByte());
+ t = new ByteTag();
+ assertEquals(ByteTag.ZERO_VALUE, t.asByte());
+ }
+
+ public void testSetValue() {
+ ByteTag t = new ByteTag();
+ t.setValue((byte) 123);
+ assertEquals(123, t.asByte());
+ }
public void testStringConversion() {
ByteTag t = new ByteTag(Byte.MAX_VALUE);
@@ -11,7 +26,6 @@ public void testStringConversion() {
assertEquals(Byte.MAX_VALUE, t.asInt());
assertEquals(Byte.MAX_VALUE, t.asLong());
assertEquals(1, t.getID());
- assertEquals(Byte.MAX_VALUE + "b", t.toTagString());
assertEquals("{\"type\":\"" + t.getClass().getSimpleName() + "\",\"value\":" + Byte.MAX_VALUE + "}", t.toString());
}
diff --git a/src/test/java/net/querz/nbt/CompoundTagTest.java b/src/test/java/net/querz/nbt/tag/CompoundTagTest.java
similarity index 88%
rename from src/test/java/net/querz/nbt/CompoundTagTest.java
rename to src/test/java/net/querz/nbt/tag/CompoundTagTest.java
index b511a335..e08426f4 100644
--- a/src/test/java/net/querz/nbt/CompoundTagTest.java
+++ b/src/test/java/net/querz/nbt/tag/CompoundTagTest.java
@@ -1,8 +1,13 @@
-package net.querz.nbt;
+package net.querz.nbt.tag;
+
+import net.querz.io.MaxDepthReachedException;
+import net.querz.NBTTestCase;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
+
+import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertNotEquals;
public class CompoundTagTest extends NBTTestCase {
@@ -19,7 +24,6 @@ private CompoundTag createCompoundTag() {
public void testStringConversion() {
CompoundTag ct = createCompoundTag();
- assertEquals("{b:127b,str:foo,list:[123b]}", ct.toTagString());
assertEquals("{\"type\":\"CompoundTag\"," +
"\"value\":{" +
"\"b\":{\"type\":\"ByteTag\",\"value\":127}," +
@@ -35,16 +39,16 @@ public void testEquals() {
ct2.putString("str", "foo");
ct2.put("list", new ListTag<>(ByteTag.class));
ct2.getListTag("list").addByte((byte) 123);
- assertTrue(ct.equals(ct2));
+ assertEquals(ct, ct2);
ct2.getListTag("list").asByteTagList().get(0).setValue((byte) 124);
- assertFalse(ct.equals(ct2));
+ assertNotEquals(ct, ct2);
ct2.remove("str");
- assertFalse(ct.equals(ct2));
+ assertNotEquals(ct, ct2);
assertThrowsNoRuntimeException(() -> ct.equals("blah"));
- assertFalse(ct.equals("blah"));
+ assertNotEquals("blah", ct);
assertEquals(ct, ct);
}
@@ -135,10 +139,10 @@ public void testHashCode() {
public void testClone() {
CompoundTag ct = createCompoundTag();
CompoundTag cl = ct.clone();
- assertTrue(ct.equals(cl));
- assertFalse(ct == cl);
- assertFalse(ct.get("list") == cl.get("list"));
- assertFalse(invokeGetValue(ct) == invokeGetValue(cl));
+ assertEquals(ct, cl);
+ assertNotSame(ct, cl);
+ assertNotSame(ct.get("list"), cl.get("list"));
+ assertNotSame(invokeGetValue(ct), invokeGetValue(cl));
}
public void testClear() {
@@ -152,9 +156,12 @@ public void testClear() {
public void testSerializeDeserialize() {
CompoundTag ct = createCompoundTag();
byte[] data = serialize(ct);
- assertTrue(Arrays.equals(new byte[]{10, 0, 0, 1, 0, 1, 98, 127, 8, 0, 3, 115, 116, 114, 0, 3, 102, 111, 111, 9, 0, 4, 108, 105, 115, 116, 1, 0, 0, 0, 1, 123, 0}, data));
+ assertArrayEquals(
+ new byte[] { 10, 0, 0, 1, 0, 1, 98, 127, 8, 0, 3, 115, 116, 114, 0, 3, 102, 111, 111, 9, 0, 4, 108, 105, 115, 116,
+ 1, 0, 0, 0, 1, 123, 0
+ }, data);
CompoundTag tt = (CompoundTag) deserialize(data);
- assertTrue(ct.equals(tt));
+ assertEquals(ct, tt);
}
public void testCasting() {
@@ -167,9 +174,9 @@ public void testCasting() {
assertEquals(Byte.MAX_VALUE, cc.get("b", ByteTag.class).asByte());
assertThrowsRuntimeException(() -> cc.getShort("b"), ClassCastException.class);
assertEquals(0, cc.getByte("bb"));
- assertEquals(true, cc.getBoolean("b"));
+ assertTrue(cc.getBoolean("b"));
cc.putByte("b2", (byte) 0);
- assertEquals(false, cc.getBoolean("b2"));
+ assertFalse(cc.getBoolean("b2"));
cc.putBoolean("b3", false);
assertEquals(0, cc.getByte("b3"));
cc.putBoolean("b4", true);
@@ -220,23 +227,23 @@ public void testCasting() {
cc.putByteArray("ba", new byte[]{Byte.MIN_VALUE, 0, Byte.MAX_VALUE});
assertEquals(new ByteArrayTag(new byte[]{Byte.MIN_VALUE, 0, Byte.MAX_VALUE}), cc.getByteArrayTag("ba"));
assertNull(cc.getByteArrayTag("baba"));
- assertTrue(Arrays.equals(new byte[]{Byte.MIN_VALUE, 0, Byte.MAX_VALUE}, cc.get("ba", ByteArrayTag.class).getValue()));
+ assertArrayEquals(new byte[] { Byte.MIN_VALUE, 0, Byte.MAX_VALUE }, cc.get("ba", ByteArrayTag.class).getValue());
assertThrowsRuntimeException(() -> cc.getIntArray("ba"), ClassCastException.class);
- assertTrue(Arrays.equals(new byte[0], cc.getByteArray("baba")));
+ assertArrayEquals(new byte[0], cc.getByteArray("baba"));
cc.putIntArray("ia", new int[]{Integer.MIN_VALUE, 0, Integer.MAX_VALUE});
assertEquals(new IntArrayTag(new int[]{Integer.MIN_VALUE, 0, Integer.MAX_VALUE}), cc.getIntArrayTag("ia"));
assertNull(cc.getIntArrayTag("iaia"));
- assertTrue(Arrays.equals(new int[]{Integer.MIN_VALUE, 0, Integer.MAX_VALUE}, cc.get("ia", IntArrayTag.class).getValue()));
+ assertArrayEquals(new int[] { Integer.MIN_VALUE, 0, Integer.MAX_VALUE }, cc.get("ia", IntArrayTag.class).getValue());
assertThrowsRuntimeException(() -> cc.getLongArray("ia"), ClassCastException.class);
- assertTrue(Arrays.equals(new int[0], cc.getIntArray("iaia")));
+ assertArrayEquals(new int[0], cc.getIntArray("iaia"));
cc.putLongArray("la", new long[]{Long.MIN_VALUE, 0, Long.MAX_VALUE});
assertEquals(new LongArrayTag(new long[]{Long.MIN_VALUE, 0, Long.MAX_VALUE}), cc.getLongArrayTag("la"));
assertNull(cc.getLongArrayTag("lala"));
- assertTrue(Arrays.equals(new long[]{Long.MIN_VALUE, 0, Long.MAX_VALUE}, cc.get("la", LongArrayTag.class).getValue()));
+ assertArrayEquals(new long[] { Long.MIN_VALUE, 0, Long.MAX_VALUE }, cc.get("la", LongArrayTag.class).getValue());
assertThrowsRuntimeException(() -> cc.getListTag("la"), ClassCastException.class);
- assertTrue(Arrays.equals(new long[0], cc.getLongArray("lala")));
+ assertArrayEquals(new long[0], cc.getLongArray("lala"));
cc.put("li", new ListTag<>(IntTag.class));
assertEquals(new ListTag<>(IntTag.class), cc.getListTag("li"));
@@ -277,10 +284,7 @@ public void testMaxDepth() {
assertThrowsRuntimeException(() -> deserializeFromFile("max_depth_reached.dat"), MaxDepthReachedException.class);
assertThrowsNoRuntimeException(() -> root.toString(Tag.DEFAULT_MAX_DEPTH + 1));
assertThrowsRuntimeException(root::toString, MaxDepthReachedException.class);
- assertThrowsNoRuntimeException(() -> root.toTagString(Tag.DEFAULT_MAX_DEPTH + 1));
- assertThrowsRuntimeException(root::toTagString, MaxDepthReachedException.class);
assertThrowsRuntimeException(() -> root.valueToString(-1), IllegalArgumentException.class);
- assertThrowsRuntimeException(() -> root.valueToTagString(-1), IllegalArgumentException.class);
}
public void testRecursion() {
@@ -288,7 +292,6 @@ public void testRecursion() {
recursive.put("recursive", recursive);
assertThrowsRuntimeException(() -> serialize(recursive), MaxDepthReachedException.class);
assertThrowsRuntimeException(recursive::toString, MaxDepthReachedException.class);
- assertThrowsRuntimeException(recursive::toTagString, MaxDepthReachedException.class);
}
public void testEntrySet() {
@@ -304,7 +307,7 @@ public void testEntrySet() {
public void testContains() {
CompoundTag ct = createCompoundTag();
- assertTrue(3 == ct.size());
+ assertEquals(3, ct.size());
assertTrue(ct.containsKey("b"));
assertTrue(ct.containsKey("str"));
assertTrue(ct.containsKey("list"));
@@ -361,4 +364,13 @@ public void testIterator() {
});
assertEquals(3, ct.size());
}
+
+ public void testPutIfNotNull() {
+ CompoundTag ct = new CompoundTag();
+ assertEquals(0, ct.size());
+ ct.putIfNotNull("foo", new StringTag("bar"));
+ ct.putIfNotNull("bar", null);
+ assertEquals(1, ct.size());
+ assertEquals("bar", ct.getString("foo"));
+ }
}
diff --git a/src/test/java/net/querz/nbt/DoubleTagTest.java b/src/test/java/net/querz/nbt/tag/DoubleTagTest.java
similarity index 78%
rename from src/test/java/net/querz/nbt/DoubleTagTest.java
rename to src/test/java/net/querz/nbt/tag/DoubleTagTest.java
index 2444aebc..024fca99 100644
--- a/src/test/java/net/querz/nbt/DoubleTagTest.java
+++ b/src/test/java/net/querz/nbt/tag/DoubleTagTest.java
@@ -1,15 +1,29 @@
-package net.querz.nbt;
+package net.querz.nbt.tag;
+
+import net.querz.NBTTestCase;
import static org.junit.Assert.assertNotEquals;
import java.util.Arrays;
public class DoubleTagTest extends NBTTestCase {
+
+ public void testCreate() {
+ DoubleTag t = new DoubleTag(Double.MAX_VALUE);
+ assertEquals(Double.MAX_VALUE, t.asDouble());
+ t = new DoubleTag();
+ assertEquals(DoubleTag.ZERO_VALUE, t.asDouble());
+ }
+
+ public void testSetValue() {
+ DoubleTag t = new DoubleTag();
+ t.setValue(123.4);
+ assertEquals(123.4, t.asDouble());
+ }
public void testStringConversion() {
DoubleTag t = new DoubleTag(Double.MAX_VALUE);
assertEquals(Double.MAX_VALUE, t.asDouble());
assertEquals(6, t.getID());
- assertEquals(Double.MAX_VALUE + "d", t.toTagString());
assertEquals("{\"type\":\"" + t.getClass().getSimpleName() + "\",\"value\":" + Double.MAX_VALUE + "}", t.toString());
}
diff --git a/src/test/java/net/querz/nbt/EndTagTest.java b/src/test/java/net/querz/nbt/tag/EndTagTest.java
similarity index 53%
rename from src/test/java/net/querz/nbt/EndTagTest.java
rename to src/test/java/net/querz/nbt/tag/EndTagTest.java
index 72c538b5..0044f78d 100644
--- a/src/test/java/net/querz/nbt/EndTagTest.java
+++ b/src/test/java/net/querz/nbt/tag/EndTagTest.java
@@ -1,4 +1,6 @@
-package net.querz.nbt;
+package net.querz.nbt.tag;
+
+import net.querz.NBTTestCase;
public class EndTagTest extends NBTTestCase {
@@ -7,15 +9,9 @@ public void testStringConversion() {
assertEquals(0, e.getID());
assertNull(e.getValue());
assertEquals("{\"type\":\"" + e.getClass().getSimpleName() + "\",\"value\":\"end\"}", e.toString());
- assertThrowsRuntimeException(e::toTagString, UnsupportedOperationException.class);
}
public void testClone() {
assertTrue(EndTag.INSTANCE == EndTag.INSTANCE.clone());
}
-
- public void testSerializeDeserialize() {
- assertThrowsNoRuntimeException(() -> EndTag.INSTANCE.serializeValue(null, 0));
- assertThrowsNoRuntimeException(() -> EndTag.INSTANCE.deserializeValue(null, 0));
- }
}
diff --git a/src/test/java/net/querz/nbt/FloatTagTest.java b/src/test/java/net/querz/nbt/tag/FloatTagTest.java
similarity index 78%
rename from src/test/java/net/querz/nbt/FloatTagTest.java
rename to src/test/java/net/querz/nbt/tag/FloatTagTest.java
index 1d6e8172..006b40bf 100644
--- a/src/test/java/net/querz/nbt/FloatTagTest.java
+++ b/src/test/java/net/querz/nbt/tag/FloatTagTest.java
@@ -1,15 +1,29 @@
-package net.querz.nbt;
+package net.querz.nbt.tag;
+
+import net.querz.NBTTestCase;
import static org.junit.Assert.assertNotEquals;
import java.util.Arrays;
public class FloatTagTest extends NBTTestCase {
+
+ public void testCreate() {
+ FloatTag t = new FloatTag(Float.MAX_VALUE);
+ assertEquals(Float.MAX_VALUE, t.asFloat());
+ t = new FloatTag();
+ assertEquals(FloatTag.ZERO_VALUE, t.asFloat());
+ }
+
+ public void testSetValue() {
+ FloatTag t = new FloatTag();
+ t.setValue(123.4f);
+ assertEquals(123.4f, t.asFloat());
+ }
public void testStringConversion() {
FloatTag t = new FloatTag(Float.MAX_VALUE);
assertEquals(Float.MAX_VALUE, t.asFloat());
assertEquals(5, t.getID());
- assertEquals(Float.MAX_VALUE + "f", t.toTagString());
assertEquals("{\"type\":\"" + t.getClass().getSimpleName() + "\",\"value\":" + Float.MAX_VALUE + "}", t.toString());
}
diff --git a/src/test/java/net/querz/nbt/IntArrayTagTest.java b/src/test/java/net/querz/nbt/tag/IntArrayTagTest.java
similarity index 77%
rename from src/test/java/net/querz/nbt/IntArrayTagTest.java
rename to src/test/java/net/querz/nbt/tag/IntArrayTagTest.java
index e02c686e..1458a732 100644
--- a/src/test/java/net/querz/nbt/IntArrayTagTest.java
+++ b/src/test/java/net/querz/nbt/tag/IntArrayTagTest.java
@@ -1,14 +1,28 @@
-package net.querz.nbt;
+package net.querz.nbt.tag;
+
+import net.querz.NBTTestCase;
import java.util.Arrays;
public class IntArrayTagTest extends NBTTestCase {
+ public void testCreate() {
+ IntArrayTag t = new IntArrayTag(new int[]{Integer.MIN_VALUE, 0, Integer.MAX_VALUE});
+ assertTrue(Arrays.equals(new int[]{Integer.MIN_VALUE, 0, Integer.MAX_VALUE}, t.getValue()));
+ t = new IntArrayTag();
+ assertTrue(Arrays.equals(IntArrayTag.ZERO_VALUE, t.getValue()));
+ }
+
+ public void testSetValue() {
+ IntArrayTag t = new IntArrayTag();
+ t.setValue(new int[]{Integer.MIN_VALUE, 0, Integer.MAX_VALUE});
+ assertTrue(Arrays.equals(new int[]{Integer.MIN_VALUE, 0, Integer.MAX_VALUE}, t.getValue()));
+ }
+
public void testStringConversion() {
IntArrayTag t = new IntArrayTag(new int[]{Integer.MIN_VALUE, 0, Integer.MAX_VALUE});
assertTrue(Arrays.equals(new int[]{Integer.MIN_VALUE, 0, Integer.MAX_VALUE}, t.getValue()));
assertEquals(11, t.getID());
- assertEquals("[I;-2147483648,0,2147483647]", t.toTagString());
assertEquals("{\"type\":\"" + t.getClass().getSimpleName() + "\",\"value\":[-2147483648,0,2147483647]}", t.toString());
}
diff --git a/src/test/java/net/querz/nbt/IntTagTest.java b/src/test/java/net/querz/nbt/tag/IntTagTest.java
similarity index 79%
rename from src/test/java/net/querz/nbt/IntTagTest.java
rename to src/test/java/net/querz/nbt/tag/IntTagTest.java
index d62ad42e..6c15fa42 100644
--- a/src/test/java/net/querz/nbt/IntTagTest.java
+++ b/src/test/java/net/querz/nbt/tag/IntTagTest.java
@@ -1,15 +1,29 @@
-package net.querz.nbt;
+package net.querz.nbt.tag;
+
+import net.querz.NBTTestCase;
import java.util.Arrays;
public class IntTagTest extends NBTTestCase {
+ public void testCreate() {
+ IntTag t = new IntTag(Integer.MAX_VALUE);
+ assertEquals(Integer.MAX_VALUE, t.asInt());
+ t = new IntTag();
+ assertEquals(IntTag.ZERO_VALUE, t.asInt());
+ }
+
+ public void testSetValue() {
+ IntTag t = new IntTag();
+ t.setValue(123);
+ assertEquals(123, t.asInt());
+ }
+
public void testStringConversion() {
IntTag t = new IntTag(Integer.MAX_VALUE);
assertEquals(Integer.MAX_VALUE, t.asInt());
assertEquals(Integer.MAX_VALUE, t.asLong());
assertEquals(3, t.getID());
- assertEquals(Integer.MAX_VALUE + "", t.toTagString());
assertEquals("{\"type\":\"" + t.getClass().getSimpleName() + "\",\"value\":" + Integer.MAX_VALUE + "}", t.toString());
}
diff --git a/src/test/java/net/querz/nbt/ListTagTest.java b/src/test/java/net/querz/nbt/tag/ListTagTest.java
similarity index 88%
rename from src/test/java/net/querz/nbt/ListTagTest.java
rename to src/test/java/net/querz/nbt/tag/ListTagTest.java
index 243db1c1..af2b72fb 100644
--- a/src/test/java/net/querz/nbt/ListTagTest.java
+++ b/src/test/java/net/querz/nbt/tag/ListTagTest.java
@@ -1,6 +1,9 @@
-package net.querz.nbt;
+package net.querz.nbt.tag;
import junit.framework.TestCase;
+import net.querz.io.MaxDepthReachedException;
+import net.querz.NBTTestCase;
+
import java.util.Arrays;
import java.util.Comparator;
import static org.junit.Assert.assertNotEquals;
@@ -26,7 +29,6 @@ public void testStringConversion() {
assertEquals(Byte.MIN_VALUE, bl.get(0).asByte());
assertEquals(0, bl.get(1).asByte());
assertEquals(Byte.MAX_VALUE, bl.get(2).asByte());
- assertEquals("[-128b,0b,127b]", bl.toTagString());
assertEquals("{\"type\":\"ListTag\"," +
"\"value\":{" +
"\"type\":\"ByteTag\"," +
@@ -34,7 +36,7 @@ public void testStringConversion() {
"-128," +
"0," +
"127]}}", bl.toString());
- ListTag> lu = ListTag.createUnchecked();
+ ListTag> lu = ListTag.createUnchecked(null);
assertEquals("{\"type\":\"ListTag\",\"value\":{\"type\":\"EndTag\",\"list\":[]}}", lu.toString());
}
@@ -66,15 +68,15 @@ public void testEquals() {
assertEquals(il, new ListTag<>(IntTag.class));
// test empty untyped list
- ListTag> lu = ListTag.createUnchecked();
- ListTag> lu2 = ListTag.createUnchecked();
+ ListTag> lu = ListTag.createUnchecked(null);
+ ListTag> lu2 = ListTag.createUnchecked(null);
assertTrue(lu.equals(lu2));
lu2.asIntTagList();
- assertFalse(lu.equals(lu2));
+ assertTrue(lu.equals(lu2));
ListTag lie = new ListTag<>(IntTag.class);
assertFalse(lu.equals(lie));
lu.asIntTagList();
- assertTrue(lie.equals(lu));
+ assertFalse(lie.equals(lu));
}
public void testHashCode() {
@@ -89,7 +91,8 @@ public void testClone() {
ListTag i = new ListTag<>(IntTag.class);
ListTag c = i.clone();
assertThrowsRuntimeException(() -> c.addString("wrong type in clone"), IllegalArgumentException.class);
- c.addInt(123);
+ assertThrowsNoRuntimeException(() -> c.addInt(123));
+
assertFalse(i.equals(c));
c.clear();
assertTrue(i.equals(c));
@@ -137,53 +140,53 @@ public void testCasting() {
assertEquals(ByteTag.class, b.getTypeClass());
//adjust ListTag type during deserialization
- ListTag> l = ListTag.createUnchecked();
+ ListTag> l = ListTag.createUnchecked(null);
assertThrowsNoRuntimeException(l::asByteTagList);
l.addByte(Byte.MAX_VALUE);
assertThrowsNoRuntimeException(l::asByteTagList);
assertThrowsRuntimeException(l::asShortTagList, ClassCastException.class);
- l = ListTag.createUnchecked();
+ l = ListTag.createUnchecked(null);
l.addShort(Short.MAX_VALUE);
assertThrowsNoRuntimeException(l::asShortTagList);
assertThrowsRuntimeException(l::asIntTagList, ClassCastException.class);
- l = ListTag.createUnchecked();
+ l = ListTag.createUnchecked(null);
l.addInt(Integer.MAX_VALUE);
assertThrowsNoRuntimeException(l::asIntTagList);
assertThrowsRuntimeException(l::asLongTagList, ClassCastException.class);
- l = ListTag.createUnchecked();
+ l = ListTag.createUnchecked(null);
l.addLong(Long.MAX_VALUE);
assertThrowsNoRuntimeException(l::asLongTagList);
assertThrowsRuntimeException(l::asFloatTagList, ClassCastException.class);
- l = ListTag.createUnchecked();
+ l = ListTag.createUnchecked(null);
l.addFloat(Float.MAX_VALUE);
assertThrowsNoRuntimeException(l::asFloatTagList);
assertThrowsRuntimeException(l::asDoubleTagList, ClassCastException.class);
- l = ListTag.createUnchecked();
+ l = ListTag.createUnchecked(null);
l.addDouble(Double.MAX_VALUE);
assertThrowsNoRuntimeException(l::asDoubleTagList);
assertThrowsRuntimeException(l::asStringTagList, ClassCastException.class);
- l = ListTag.createUnchecked();
+ l = ListTag.createUnchecked(null);
l.addString("foo");
assertThrowsNoRuntimeException(l::asStringTagList);
assertThrowsRuntimeException(l::asByteArrayTagList, ClassCastException.class);
- l = ListTag.createUnchecked();
+ l = ListTag.createUnchecked(null);
l.addByteArray(new byte[]{Byte.MIN_VALUE, 0, Byte.MAX_VALUE});
assertThrowsNoRuntimeException(l::asByteArrayTagList);
assertThrowsRuntimeException(l::asIntArrayTagList, ClassCastException.class);
- l = ListTag.createUnchecked();
+ l = ListTag.createUnchecked(null);
l.addIntArray(new int[]{Integer.MIN_VALUE, 0, Integer.MAX_VALUE});
assertThrowsNoRuntimeException(l::asIntArrayTagList);
assertThrowsRuntimeException(l::asLongArrayTagList, ClassCastException.class);
- l = ListTag.createUnchecked();
+ l = ListTag.createUnchecked(null);
l.addLongArray(new long[]{Long.MIN_VALUE, 0, Long.MAX_VALUE});
assertThrowsNoRuntimeException(l::asLongArrayTagList);
assertThrowsRuntimeException(l::asListTagList, ClassCastException.class);
@@ -198,23 +201,11 @@ public void testCasting() {
assertThrowsNoRuntimeException(lco::asCompoundTagList);
assertThrowsRuntimeException(lco::asByteTagList, ClassCastException.class);
- ListTag> lg = ListTag.createUnchecked();
+ ListTag> lg = ListTag.createUnchecked(null);
ListTag lb = assertThrowsNoRuntimeException(lg::asByteTagList);
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());
-
-
+ // allow casting to a different list type if the list is empty
+ assertThrowsNoException(lg::asShortTagList);
}
public void testCompareTo() {
@@ -244,9 +235,7 @@ public void testMaxDepth() {
assertThrowsRuntimeException(() -> serialize(root), MaxDepthReachedException.class);
assertThrowsRuntimeException(() -> deserializeFromFile("max_depth_reached.dat"), MaxDepthReachedException.class);
assertThrowsRuntimeException(root::toString, MaxDepthReachedException.class);
- assertThrowsRuntimeException(root::toTagString, MaxDepthReachedException.class);
assertThrowsRuntimeException(() -> root.valueToString(-1), IllegalArgumentException.class);
- assertThrowsRuntimeException(() -> root.valueToTagString(-1), IllegalArgumentException.class);
}
public void testRecursion() {
@@ -254,7 +243,6 @@ public void testRecursion() {
recursive.add(recursive);
assertThrowsRuntimeException(() -> serialize(recursive), MaxDepthReachedException.class);
assertThrowsRuntimeException(recursive::toString, MaxDepthReachedException.class);
- assertThrowsRuntimeException(recursive::toTagString, MaxDepthReachedException.class);
}
public void testContains() {
diff --git a/src/test/java/net/querz/nbt/LongArrayTagTest.java b/src/test/java/net/querz/nbt/tag/LongArrayTagTest.java
similarity index 77%
rename from src/test/java/net/querz/nbt/LongArrayTagTest.java
rename to src/test/java/net/querz/nbt/tag/LongArrayTagTest.java
index a2fe39c4..dfa2a3f3 100644
--- a/src/test/java/net/querz/nbt/LongArrayTagTest.java
+++ b/src/test/java/net/querz/nbt/tag/LongArrayTagTest.java
@@ -1,14 +1,28 @@
-package net.querz.nbt;
+package net.querz.nbt.tag;
+
+import net.querz.NBTTestCase;
import java.util.Arrays;
public class LongArrayTagTest extends NBTTestCase {
+ public void testCreate() {
+ LongArrayTag t = new LongArrayTag(new long[]{Long.MIN_VALUE, 0, Long.MAX_VALUE});
+ assertTrue(Arrays.equals(new long[]{Long.MIN_VALUE, 0, Long.MAX_VALUE}, t.getValue()));
+ t = new LongArrayTag();
+ assertTrue(Arrays.equals(LongArrayTag.ZERO_VALUE, t.getValue()));
+ }
+
+ public void testSetValue() {
+ LongArrayTag t = new LongArrayTag();
+ t.setValue(new long[]{Long.MIN_VALUE, 0, Long.MAX_VALUE});
+ assertTrue(Arrays.equals(new long[]{Long.MIN_VALUE, 0, Long.MAX_VALUE}, t.getValue()));
+ }
+
public void testStringConversion() {
LongArrayTag t = new LongArrayTag(new long[]{Long.MIN_VALUE, 0, Long.MAX_VALUE});
assertTrue(Arrays.equals(new long[]{Long.MIN_VALUE, 0, Long.MAX_VALUE}, t.getValue()));
assertEquals(12, t.getID());
- assertEquals("[L;-9223372036854775808l,0l,9223372036854775807l]", t.toTagString());
assertEquals("{\"type\":\"" + t.getClass().getSimpleName() + "\",\"value\":[-9223372036854775808,0,9223372036854775807]}", t.toString());
}
diff --git a/src/test/java/net/querz/nbt/LongTagTest.java b/src/test/java/net/querz/nbt/tag/LongTagTest.java
similarity index 78%
rename from src/test/java/net/querz/nbt/LongTagTest.java
rename to src/test/java/net/querz/nbt/tag/LongTagTest.java
index 6d9ea1e1..86ef1ff2 100644
--- a/src/test/java/net/querz/nbt/LongTagTest.java
+++ b/src/test/java/net/querz/nbt/tag/LongTagTest.java
@@ -1,14 +1,28 @@
-package net.querz.nbt;
+package net.querz.nbt.tag;
+
+import net.querz.NBTTestCase;
import java.util.Arrays;
public class LongTagTest extends NBTTestCase {
+ public void testCreate() {
+ LongTag t = new LongTag(Long.MAX_VALUE);
+ assertEquals(Long.MAX_VALUE, t.asLong());
+ t = new LongTag();
+ assertEquals(LongTag.ZERO_VALUE, t.asLong());
+ }
+
+ public void testSetValue() {
+ LongTag t = new LongTag();
+ t.setValue(123);
+ assertEquals(123, t.asLong());
+ }
+
public void testStringConversion() {
LongTag t = new LongTag(Long.MAX_VALUE);
assertEquals(Long.MAX_VALUE, t.asLong());
assertEquals(4, t.getID());
- assertEquals(Long.MAX_VALUE + "l", t.toTagString());
assertEquals("{\"type\":\"" + t.getClass().getSimpleName() + "\",\"value\":" + Long.MAX_VALUE + "}", t.toString());
}
diff --git a/src/test/java/net/querz/nbt/NoNullEntrySetTest.java b/src/test/java/net/querz/nbt/tag/NoNullEntrySetTest.java
similarity index 97%
rename from src/test/java/net/querz/nbt/NoNullEntrySetTest.java
rename to src/test/java/net/querz/nbt/tag/NoNullEntrySetTest.java
index 6492300a..74d628b2 100644
--- a/src/test/java/net/querz/nbt/NoNullEntrySetTest.java
+++ b/src/test/java/net/querz/nbt/tag/NoNullEntrySetTest.java
@@ -1,4 +1,6 @@
-package net.querz.nbt;
+package net.querz.nbt.tag;
+
+import net.querz.NBTTestCase;
import java.util.Arrays;
import java.util.Map;
diff --git a/src/test/java/net/querz/nbt/ShortTagTest.java b/src/test/java/net/querz/nbt/tag/ShortTagTest.java
similarity index 79%
rename from src/test/java/net/querz/nbt/ShortTagTest.java
rename to src/test/java/net/querz/nbt/tag/ShortTagTest.java
index ec039a7d..9668c248 100644
--- a/src/test/java/net/querz/nbt/ShortTagTest.java
+++ b/src/test/java/net/querz/nbt/tag/ShortTagTest.java
@@ -1,16 +1,30 @@
-package net.querz.nbt;
+package net.querz.nbt.tag;
+
+import net.querz.NBTTestCase;
import java.util.Arrays;
public class ShortTagTest extends NBTTestCase {
+ public void testCreate() {
+ ShortTag t = new ShortTag(Short.MAX_VALUE);
+ assertEquals(Short.MAX_VALUE, t.asShort());
+ t = new ShortTag();
+ assertEquals(ShortTag.ZERO_VALUE, t.asShort());
+ }
+
+ public void testSetValue() {
+ ShortTag t = new ShortTag();
+ t.setValue((short) 123);
+ assertEquals(123, t.asShort());
+ }
+
public void testStringConversion() {
ShortTag t = new ShortTag(Short.MAX_VALUE);
assertEquals(Short.MAX_VALUE, t.asShort());
assertEquals(Short.MAX_VALUE, t.asInt());
assertEquals(Short.MAX_VALUE, t.asLong());
assertEquals(2, t.getID());
- assertEquals(Short.MAX_VALUE + "s", t.toTagString());
assertEquals("{\"type\":\"" + t.getClass().getSimpleName() + "\",\"value\":" + Short.MAX_VALUE + "}", t.toString());
}
diff --git a/src/test/java/net/querz/nbt/StringTagTest.java b/src/test/java/net/querz/nbt/tag/StringTagTest.java
similarity index 82%
rename from src/test/java/net/querz/nbt/StringTagTest.java
rename to src/test/java/net/querz/nbt/tag/StringTagTest.java
index da6b39fb..e008a55a 100644
--- a/src/test/java/net/querz/nbt/StringTagTest.java
+++ b/src/test/java/net/querz/nbt/tag/StringTagTest.java
@@ -1,4 +1,6 @@
-package net.querz.nbt;
+package net.querz.nbt.tag;
+
+import net.querz.NBTTestCase;
import java.util.Arrays;
@@ -8,7 +10,6 @@ public void testStringConversion() {
StringTag t = new StringTag("foo");
assertEquals("foo", t.getValue());
assertEquals(8, t.getID());
- assertEquals("foo", t.toTagString());
assertEquals("{\"type\":\"" + t.getClass().getSimpleName() + "\",\"value\":\"foo\"}", t.toString());
}
@@ -37,13 +38,13 @@ public void testSerializeDeserialize() {
public void testEscape() {
StringTag allValue = new StringTag("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789_-+");
- assertEquals("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789_-+", allValue.toTagString());
+ assertEquals("\"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789_-+\"", allValue.valueToString());
StringTag escapeValue = new StringTag("öäü");
- assertEquals("\"öäü\"", escapeValue.toTagString());
+ assertEquals("\"öäü\"", escapeValue.valueToString());
StringTag escapeSpecialChars = new StringTag("\\\n\r\t\"");
- assertEquals("\"\\\\\\n\\r\\t\\\"\"", escapeSpecialChars.toTagString());
+ assertEquals("\"\\\\\\n\\r\\t\\\"\"", escapeSpecialChars.valueToString());
StringTag escapeEmpty = new StringTag("");
- assertEquals("\"\"", escapeEmpty.toTagString());
+ assertEquals("\"\"", escapeEmpty.valueToString());
//no null values allowed
assertThrowsRuntimeException(() -> new StringTag().setValue(null), NullPointerException.class);
diff --git a/src/test/resources/r.0.0.mca b/src/test/resources/r.0.0.mca
new file mode 100644
index 00000000..45146729
Binary files /dev/null and b/src/test/resources/r.0.0.mca differ
diff --git a/src/test/resources/unknown_object_tag.dat b/src/test/resources/unknown_object_tag.dat
deleted file mode 100644
index 2f2ed2c3..00000000
Binary files a/src/test/resources/unknown_object_tag.dat and /dev/null differ