diff --git a/game/src/main/org/apollo/game/model/entity/attr/AttributeDefinition.java b/game/src/main/org/apollo/game/model/entity/attr/AttributeDefinition.java index 9f08acbb..6a47996f 100644 --- a/game/src/main/org/apollo/game/model/entity/attr/AttributeDefinition.java +++ b/game/src/main/org/apollo/game/model/entity/attr/AttributeDefinition.java @@ -42,6 +42,17 @@ public final class AttributeDefinition { return new AttributeDefinition<>(defaultValue, persistence, AttributeType.LONG); } + /** + * Creates an AttributeDefinition for a {@code long}. + * + * @param defaultValue The default value of the definition. + * @param persistence The {@link AttributePersistence} of the definition. + * @return The AttributeDefinition. + */ + public static AttributeDefinition forLong(long defaultValue, AttributePersistence persistence) { + return new AttributeDefinition<>(defaultValue, persistence, AttributeType.LONG); + } + /** * Creates an AttributeDefinition for a String. * diff --git a/game/src/main/org/apollo/game/model/entity/attr/AttributeMap.java b/game/src/main/org/apollo/game/model/entity/attr/AttributeMap.java index 5937274b..0ee12779 100644 --- a/game/src/main/org/apollo/game/model/entity/attr/AttributeMap.java +++ b/game/src/main/org/apollo/game/model/entity/attr/AttributeMap.java @@ -113,7 +113,7 @@ public final class AttributeMap { private Attribute createAttribute(T value, AttributeType type) { switch (type) { case LONG: - return new NumericalAttribute((Long) value); + return new NumericalAttribute(((Number) value).longValue()); case DOUBLE: return new NumericalAttribute((Double) value); case STRING: diff --git a/game/src/main/org/apollo/game/model/entity/attr/StringAttribute.java b/game/src/main/org/apollo/game/model/entity/attr/StringAttribute.java index c2f0454c..2f6062bf 100644 --- a/game/src/main/org/apollo/game/model/entity/attr/StringAttribute.java +++ b/game/src/main/org/apollo/game/model/entity/attr/StringAttribute.java @@ -1,6 +1,6 @@ package org.apollo.game.model.entity.attr; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.Arrays; /** @@ -31,11 +31,11 @@ public final class StringAttribute extends Attribute { @Override public byte[] encode() { - byte[] bytes = value.getBytes(Charset.forName("UTF-8")); + byte[] bytes = value.getBytes(StandardCharsets.UTF_8); int length = bytes.length; bytes = Arrays.copyOf(bytes, length + 1); - bytes[length - 1] = 0; + bytes[length] = 0; return bytes; } diff --git a/game/src/test/org/apollo/game/model/entity/attr/AttributeTests.java b/game/src/test/org/apollo/game/model/entity/attr/AttributeTests.java new file mode 100644 index 00000000..bbd656f8 --- /dev/null +++ b/game/src/test/org/apollo/game/model/entity/attr/AttributeTests.java @@ -0,0 +1,78 @@ +package org.apollo.game.model.entity.attr; + +import java.nio.charset.StandardCharsets; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.google.common.primitives.Longs; + +/** + * Tests for different {@link Attribute}s. + */ +public final class AttributeTests { + + /** + * Defines Attributes with their default values before any tests are run. + */ + @Before + public void setup() { + AttributeMap.define("string_test", AttributeDefinition.forString("Hello world", AttributePersistence.TRANSIENT)); + AttributeMap.define("boolean_test", AttributeDefinition.forBoolean(true, AttributePersistence.TRANSIENT)); + AttributeMap.define("int_test", AttributeDefinition.forInt(Integer.MAX_VALUE, AttributePersistence.TRANSIENT)); + AttributeMap.define("long_test", AttributeDefinition.forLong(Long.MAX_VALUE, AttributePersistence.TRANSIENT)); + AttributeMap.define("double_test", AttributeDefinition.forDouble(Double.MAX_VALUE, AttributePersistence.TRANSIENT)); + } + + /** + * Tests Attribute String encoding. + */ + @Test + public void stringEncode() { + AttributeMap map = new AttributeMap(); + byte[] expected = "Hello world\0".getBytes(StandardCharsets.UTF_8); + Assert.assertArrayEquals(expected, map.get("string_test").encode()); + } + + /** + * Tests Attribute boolean encoding. + */ + @Test + public void booleanEncode() { + AttributeMap map = new AttributeMap(); + byte[] expected = { 1 }; + Assert.assertArrayEquals(expected, map.get("boolean_test").encode()); + } + + /** + * Tests Attribute int encoding. + */ + @Test + public void intEncode() { + AttributeMap map = new AttributeMap(); + byte[] expected = Longs.toByteArray(Integer.MAX_VALUE); + Assert.assertArrayEquals(expected, map.get("int_test").encode()); + } + + /** + * Tests Attribute long encoding. + */ + @Test + public void longEncode() { + AttributeMap map = new AttributeMap(); + byte[] expected = Longs.toByteArray(Long.MAX_VALUE); + Assert.assertArrayEquals(expected, map.get("long_test").encode()); + } + + /** + * Tests Attribute double encoding. + */ + @Test + public void doubleEncode() { + AttributeMap map = new AttributeMap(); + byte[] expected = Longs.toByteArray(Double.doubleToLongBits(Double.MAX_VALUE)); + Assert.assertArrayEquals(expected, map.get("double_test").encode()); + } + +}