Skip to content

Commit

Permalink
improve ArrayTag type safety
Browse files Browse the repository at this point in the history
  • Loading branch information
Querz committed Dec 18, 2018
1 parent 812dbde commit c821420
Show file tree
Hide file tree
Showing 8 changed files with 66 additions and 21 deletions.
17 changes: 7 additions & 10 deletions src/main/java/net/querz/nbt/ArrayTag.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@
* */
public abstract class ArrayTag<T> extends Tag<T> {

public ArrayTag() {}

public ArrayTag(T value) {
super(value);
if (!value.getClass().isArray()) {
throw new UnsupportedOperationException("type of array tag must be an array");
}
setValue(value);
}

public int length() {
Expand All @@ -31,7 +32,7 @@ public void setValue(T value) {

@Override
public String valueToString(int depth) {
return arrayToString(getValue(), "", "");
return arrayToString("", "");
}

@Override
Expand All @@ -42,14 +43,10 @@ public int compareTo(Tag<T> other) {
return Integer.compare(Array.getLength(getValue()), Array.getLength(other.getValue()));
}

protected String arrayToString(T array, String prefix, String suffix) {
if (array == null || !array.getClass().isArray()) {
throw new UnsupportedOperationException("cannot convert non-array to String");
}

protected String arrayToString(String prefix, String suffix) {
StringBuilder sb = new StringBuilder("[").append(prefix).append("".equals(prefix) ? "" : ";");
for (int i = 0; i < length(); i++) {
sb.append(i == 0 ? "" : ",").append(Array.get(array, i)).append(suffix);
sb.append(i == 0 ? "" : ",").append(Array.get(getValue(), i)).append(suffix);
}
sb.append("]");
return sb.toString();
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/net/querz/nbt/ByteArrayTag.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@

public class ByteArrayTag extends ArrayTag<byte[]> {

public ByteArrayTag() {}
public ByteArrayTag() {
super(new byte[0]);
}

public ByteArrayTag(byte[] value) {
super(value);
Expand All @@ -33,7 +35,7 @@ public void deserializeValue(DataInputStream dis, int depth) throws IOException

@Override
public String valueToTagString(int depth) {
return arrayToString(getValue(), "B", "b");
return arrayToString("B", "b");
}

@Override
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/net/querz/nbt/IntArrayTag.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@

public class IntArrayTag extends ArrayTag<int[]> {

public IntArrayTag() {}
public IntArrayTag() {
super(new int[0]);
}

public IntArrayTag(int[] value) {
super(value);
Expand Down Expand Up @@ -37,7 +39,7 @@ public void deserializeValue(DataInputStream dis, int depth) throws IOException

@Override
public String valueToTagString(int depth) {
return arrayToString(getValue(), "I", "");
return arrayToString("I", "");
}

@Override
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/net/querz/nbt/LongArrayTag.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@

public class LongArrayTag extends ArrayTag<long[]> {

public LongArrayTag() {}
public LongArrayTag() {
super(new long[0]);
}

public LongArrayTag(long[] value) {
super(value);
Expand Down Expand Up @@ -37,7 +39,7 @@ public void deserializeValue(DataInputStream dis, int depth) throws IOException

@Override
public String valueToTagString(int depth) {
return arrayToString(getValue(), "L", "l");
return arrayToString("L", "l");
}

@Override
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/net/querz/nbt/custom/ShortArrayTag.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ public static void register() {
TagFactory.registerCustomTag(100, ShortArrayTag::new, ShortArrayTag.class);
}

public ShortArrayTag() {}
public ShortArrayTag() {
super(new short[0]);
}

public ShortArrayTag(short[] value) {
super(value);
Expand Down Expand Up @@ -43,7 +45,7 @@ public void deserializeValue(DataInputStream dis, int depth) throws IOException

@Override
public String valueToTagString(int depth) {
return arrayToString(getValue(), "S", "s");
return arrayToString("S", "s");
}

@Override
Expand Down
44 changes: 43 additions & 1 deletion src/test/java/net/querz/nbt/ByteArrayTagTest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package net.querz.nbt;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.util.Arrays;

public class ByteArrayTagTest extends NBTTestCase {
Expand All @@ -10,7 +12,6 @@ public void testStringConversion() {
assertEquals(7, t.getID());
assertEquals("[B;-128b,0b,127b]", t.toTagString());
assertEquals("{\"type\":\"" + t.getClass().getSimpleName() + "\",\"value\":[-128,0,127]}", t.toString());
assertThrowsRuntimeException(() -> t.arrayToString(null, "", ""), UnsupportedOperationException.class);
}

public void testEquals() {
Expand Down Expand Up @@ -48,4 +49,45 @@ public void testCompareTo() {
assertTrue(0 > t4.compareTo(t));
assertThrowsRuntimeException(() -> t.compareTo(null), IllegalArgumentException.class);
}

public void testInvalidType() {
assertThrowsRuntimeException(NotAnArrayTag::new, UnsupportedOperationException.class);
assertThrowsRuntimeException(() -> new NotAnArrayTag("test"), UnsupportedOperationException.class);
}

public class NotAnArrayTag extends ArrayTag<String> {

public NotAnArrayTag() {
super("");
}

public NotAnArrayTag(String value) {
super(value);
}

@Override
protected String getEmptyValue() {
return "";
}

@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);
}

@Override
public NotAnArrayTag clone() {
return new NotAnArrayTag(getName());
}
}
}
1 change: 0 additions & 1 deletion src/test/java/net/querz/nbt/IntArrayTagTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ public void testStringConversion() {
assertEquals(11, t.getID());
assertEquals("[I;-2147483648,0,2147483647]", t.toTagString());
assertEquals("{\"type\":\"" + t.getClass().getSimpleName() + "\",\"value\":[-2147483648,0,2147483647]}", t.toString());
assertThrowsRuntimeException(() -> t.arrayToString(null, "", ""), UnsupportedOperationException.class);
}

public void testEquals() {
Expand Down
1 change: 0 additions & 1 deletion src/test/java/net/querz/nbt/LongArrayTagTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ public void testStringConversion() {
assertEquals(12, t.getID());
assertEquals("[L;-9223372036854775808l,0l,9223372036854775807l]", t.toTagString());
assertEquals("{\"type\":\"" + t.getClass().getSimpleName() + "\",\"value\":[-9223372036854775808,0,9223372036854775807]}", t.toString());
assertThrowsRuntimeException(() -> t.arrayToString(null, "", ""), UnsupportedOperationException.class);
}

public void testEquals() {
Expand Down

0 comments on commit c821420

Please sign in to comment.