Issue 135: Arrays of primitives are not fully supported
- added new test case 'PrimitiveArrayTest', which tests all types of primitive
array, including cycling Java -> YAML -> Java.
- removed outdated tests from generics.GenericArrayTypeTest and types.SeqTagTest
- updated BaseRepresenter to remove outdated "not fully supported" message
- updated SafeRepresenter to handle serializing primitive arrays
- updated Representer.checkGlobalTag to ignore primitive arrays
- updated BaseConstructor to handle constructing arrays of primitives as well as
arrays of Object.
diff --git a/src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java b/src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java
index fadc89c..6d6d200 100644
--- a/src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java
+++ b/src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java
@@ -226,9 +226,8 @@
return new LinkedHashSet<Object>(initSize);
}
- @SuppressWarnings("unchecked")
- protected <T> T[] createArray(Class<T> type, int size) {
- return (T[]) Array.newInstance(type.getComponentType(), size);
+ protected Object createArray(Class<?> type, int size) {
+ return Array.newInstance(type.getComponentType(), size);
}
@SuppressWarnings("unchecked")
@@ -278,9 +277,65 @@
}
protected Object constructArrayStep2(SequenceNode node, Object array) {
+ final Class<?> componentType = node.getType().getComponentType();
+
int index = 0;
for (Node child : node.getValue()) {
- Array.set(array, index++, constructObject(child));
+ Object value = constructObject(child);
+
+ if (componentType.isPrimitive()) {
+ // Primitive arrays require quite a lot of work.
+ if (byte.class.equals(componentType)) {
+ Array.setByte(array, index, ((Number) value).byteValue());
+
+ } else if (short.class.equals(componentType)) {
+ Array.setShort(array, index, ((Number) value).shortValue());
+
+ } else if (int.class.equals(componentType)) {
+ Array.setInt(array, index, ((Number) value).intValue());
+
+ } else if (long.class.equals(componentType)) {
+ Array.setLong(array, index, ((Number) value).longValue());
+
+ } else if (float.class.equals(componentType)) {
+ Array.setFloat(array, index, ((Number) value).floatValue());
+
+ } else if (double.class.equals(componentType)) {
+ Array.setDouble(array, index,
+ ((Number) value).doubleValue());
+
+ } else if (char.class.equals(componentType)) {
+
+ if (value instanceof Character) {
+ Array.setChar(array, index,
+ ((Character) value).charValue());
+
+ } else if (value instanceof String) {
+ String val = (String) value;
+ if (val.length() != 1) {
+ throw new YAMLException("expected char but got \""
+ + val + "\"");
+ }
+ Array.setChar(array, index, val.charAt(0));
+ } else {
+ throw new ClassCastException("expected char but got "
+ + value.getClass().getCanonicalName());
+ }
+
+ } else if (boolean.class.equals(componentType)) {
+ Array.setBoolean(array, index,
+ ((Boolean) value).booleanValue());
+
+ } else {
+ throw new YAMLException("unexpected primitive type");
+ }
+
+ } else {
+ // Non-primitive arrays can simply be assigned:
+ Array.set(array, index, constructObject(child));
+ }
+
+ ++index;
}
return array;
}
diff --git a/src/main/java/org/yaml/snakeyaml/representer/BaseRepresenter.java b/src/main/java/org/yaml/snakeyaml/representer/BaseRepresenter.java
index fcbde03..743824a 100644
--- a/src/main/java/org/yaml/snakeyaml/representer/BaseRepresenter.java
+++ b/src/main/java/org/yaml/snakeyaml/representer/BaseRepresenter.java
@@ -96,10 +96,7 @@
return node;
}
}
- // check array of primitives
- if (clazz.isArray()) {
- throw new YAMLException("Arrays of primitives are not fully supported.");
- }
+
// check defaults
if (multiRepresenters.containsKey(null)) {
Represent representer = multiRepresenters.get(null);
diff --git a/src/main/java/org/yaml/snakeyaml/representer/Representer.java b/src/main/java/org/yaml/snakeyaml/representer/Representer.java
index 486094f..c4a7908 100644
--- a/src/main/java/org/yaml/snakeyaml/representer/Representer.java
+++ b/src/main/java/org/yaml/snakeyaml/representer/Representer.java
@@ -162,6 +162,12 @@
*/
@SuppressWarnings("unchecked")
protected void checkGlobalTag(Property property, Node node, Object object) {
+ // Skip primitive arrays.
+ if (object.getClass().isArray()
+ && object.getClass().getComponentType().isPrimitive()) {
+ return;
+ }
+
Class<?>[] arguments = property.getActualTypeArguments();
if (arguments != null) {
if (node.getNodeId() == NodeId.sequence) {
diff --git a/src/main/java/org/yaml/snakeyaml/representer/SafeRepresenter.java b/src/main/java/org/yaml/snakeyaml/representer/SafeRepresenter.java
index b2d599f..b4b618f 100644
--- a/src/main/java/org/yaml/snakeyaml/representer/SafeRepresenter.java
+++ b/src/main/java/org/yaml/snakeyaml/representer/SafeRepresenter.java
@@ -17,6 +17,7 @@
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
@@ -49,6 +50,16 @@
this.representers.put(Boolean.class, new RepresentBoolean());
this.representers.put(Character.class, new RepresentString());
this.representers.put(byte[].class, new RepresentByteArray());
+
+ Represent primitiveArray = new RepresentPrimitiveArray();
+ representers.put(short[].class, primitiveArray);
+ representers.put(int[].class, primitiveArray);
+ representers.put(long[].class, primitiveArray);
+ representers.put(float[].class, primitiveArray);
+ representers.put(double[].class, primitiveArray);
+ representers.put(char[].class, primitiveArray);
+ representers.put(boolean[].class, primitiveArray);
+
this.multiRepresenters.put(Number.class, new RepresentNumber());
this.multiRepresenters.put(List.class, new RepresentList());
this.multiRepresenters.put(Map.class, new RepresentMap());
@@ -207,11 +218,107 @@
}
}
+ /**
+ * Represents primitive arrays, such as short[] and float[], by converting
+ * them into equivalent List<Short> and List<Float> using the appropriate
+ * autoboxing type.
+ */
+ protected class RepresentPrimitiveArray implements Represent {
+ public Node representData(Object data) {
+ Class<?> type = data.getClass().getComponentType();
+
+ if (byte.class == type) {
+ return representSequence(Tag.SEQ, asByteList(data), null);
+ } else if (short.class == type) {
+ return representSequence(Tag.SEQ, asShortList(data), null);
+ } else if (int.class == type) {
+ return representSequence(Tag.SEQ, asIntList(data), null);
+ } else if (long.class == type) {
+ return representSequence(Tag.SEQ, asLongList(data), null);
+ } else if (float.class == type) {
+ return representSequence(Tag.SEQ, asFloatList(data), null);
+ } else if (double.class == type) {
+ return representSequence(Tag.SEQ, asDoubleList(data), null);
+ } else if (char.class == type) {
+ return representSequence(Tag.SEQ, asCharList(data), null);
+ } else if (boolean.class == type) {
+ return representSequence(Tag.SEQ, asBooleanList(data), null);
+ }
+
+ throw new YAMLException("Unexpected primitive '"
+ + type.getCanonicalName() + "'");
+ }
+
+ private List<Byte> asByteList(Object in) {
+ byte[] array = (byte[]) in;
+ List<Byte> list = new ArrayList<Byte>(array.length);
+ for (int i = 0; i < array.length; ++i)
+ list.add(array[i]);
+ return list;
+ }
+
+ private List<Short> asShortList(Object in) {
+ short[] array = (short[]) in;
+ List<Short> list = new ArrayList<Short>(array.length);
+ for (int i = 0; i < array.length; ++i)
+ list.add(array[i]);
+ return list;
+ }
+
+ private List<Integer> asIntList(Object in) {
+ int[] array = (int[]) in;
+ List<Integer> list = new ArrayList<Integer>(array.length);
+ for (int i = 0; i < array.length; ++i)
+ list.add(array[i]);
+ return list;
+ }
+
+ private List<Long> asLongList(Object in) {
+ long[] array = (long[]) in;
+ List<Long> list = new ArrayList<Long>(array.length);
+ for (int i = 0; i < array.length; ++i)
+ list.add(array[i]);
+ return list;
+ }
+
+ private List<Float> asFloatList(Object in) {
+ float[] array = (float[]) in;
+ List<Float> list = new ArrayList<Float>(array.length);
+ for (int i = 0; i < array.length; ++i)
+ list.add(array[i]);
+ return list;
+ }
+
+ private List<Double> asDoubleList(Object in) {
+ double[] array = (double[]) in;
+ List<Double> list = new ArrayList<Double>(array.length);
+ for (int i = 0; i < array.length; ++i)
+ list.add(array[i]);
+ return list;
+ }
+
+ private List<Character> asCharList(Object in) {
+ char[] array = (char[]) in;
+ List<Character> list = new ArrayList<Character>(array.length);
+ for (int i = 0; i < array.length; ++i)
+ list.add(array[i]);
+ return list;
+ }
+
+ private List<Boolean> asBooleanList(Object in) {
+ boolean[] array = (boolean[]) in;
+ List<Boolean> list = new ArrayList<Boolean>(array.length);
+ for (int i = 0; i < array.length; ++i)
+ list.add(array[i]);
+ return list;
+ }
+ }
+
protected class RepresentMap implements Represent {
@SuppressWarnings("unchecked")
public Node representData(Object data) {
- return representMapping(getTag(data.getClass(), Tag.MAP), (Map<Object, Object>) data,
- null);
+ return representMapping(getTag(data.getClass(), Tag.MAP),
+ (Map<Object, Object>) data, null);
}
}
diff --git a/src/test/java/org/yaml/snakeyaml/array/BooleanArr.java b/src/test/java/org/yaml/snakeyaml/array/BooleanArr.java
new file mode 100644
index 0000000..c46bf8f
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/array/BooleanArr.java
@@ -0,0 +1,25 @@
+package org.yaml.snakeyaml.array;
+
+import java.util.Arrays;
+
+public class BooleanArr {
+ private boolean[] bools;
+
+ public BooleanArr () {}
+
+ public BooleanArr ( boolean[] bools ) {
+ this.bools = bools;
+ }
+
+ public String toString() {
+ return Arrays.toString(bools);
+ }
+
+ public boolean[] getBools() {
+ return bools;
+ }
+
+ public void setBools(boolean[] bools) {
+ this.bools = bools;
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/array/ByteArr.java b/src/test/java/org/yaml/snakeyaml/array/ByteArr.java
new file mode 100644
index 0000000..ee8ab2c
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/array/ByteArr.java
@@ -0,0 +1,26 @@
+package org.yaml.snakeyaml.array;
+
+import java.util.Arrays;
+
+public class ByteArr {
+
+ private byte[] bytes;
+
+ public ByteArr(){}
+
+ public ByteArr ( byte[] bytes ) {
+ this.bytes = bytes;
+ }
+
+ public String toString() {
+ return Arrays.toString(bytes);
+ }
+
+ public byte[] getBytes() {
+ return bytes;
+ }
+
+ public void setBytes(byte[] bytes) {
+ this.bytes = bytes;
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/array/CharArr.java b/src/test/java/org/yaml/snakeyaml/array/CharArr.java
new file mode 100644
index 0000000..12dd78a
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/array/CharArr.java
@@ -0,0 +1,25 @@
+package org.yaml.snakeyaml.array;
+
+import java.util.Arrays;
+
+public class CharArr {
+ private char[] chars;
+
+ public CharArr () {}
+
+ public CharArr ( char[] chars ) {
+ this.chars = chars;
+ }
+
+ public String toString() {
+ return Arrays.toString(chars);
+ }
+
+ public char[] getChars() {
+ return chars;
+ }
+
+ public void setChars(char[] chars) {
+ this.chars = chars;
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/array/DoubleArr.java b/src/test/java/org/yaml/snakeyaml/array/DoubleArr.java
new file mode 100644
index 0000000..84ff81e
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/array/DoubleArr.java
@@ -0,0 +1,25 @@
+package org.yaml.snakeyaml.array;
+
+import java.util.Arrays;
+
+public class DoubleArr {
+ private double[] doubles;
+
+ public DoubleArr () {}
+
+ public DoubleArr ( double[] doubles ) {
+ this.doubles = doubles;
+ }
+
+ public String toString() {
+ return Arrays.toString(doubles);
+ }
+
+ public double[] getDoubles() {
+ return doubles;
+ }
+
+ public void setDoubles(double[] doubles) {
+ this.doubles = doubles;
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/array/FloatArr.java b/src/test/java/org/yaml/snakeyaml/array/FloatArr.java
new file mode 100644
index 0000000..7cce7b2
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/array/FloatArr.java
@@ -0,0 +1,25 @@
+package org.yaml.snakeyaml.array;
+
+import java.util.Arrays;
+
+public class FloatArr {
+ private float[] floats;
+
+ public FloatArr () {}
+
+ public FloatArr ( float[] floats ) {
+ this.floats = floats;
+ }
+
+ public String toString() {
+ return Arrays.toString(floats);
+ }
+
+ public float[] getFloats() {
+ return floats;
+ }
+
+ public void setFloats(float[] floats) {
+ this.floats = floats;
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/array/IntArr.java b/src/test/java/org/yaml/snakeyaml/array/IntArr.java
new file mode 100644
index 0000000..ac95eb4
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/array/IntArr.java
@@ -0,0 +1,25 @@
+package org.yaml.snakeyaml.array;
+
+import java.util.Arrays;
+
+public class IntArr {
+ private int[] ints;
+
+ public IntArr () {}
+
+ public IntArr ( int[] ints ) {
+ this.ints = ints;
+ }
+
+ public String toString() {
+ return Arrays.toString(ints);
+ }
+
+ public int[] getInts() {
+ return ints;
+ }
+
+ public void setInts(int[] ints) {
+ this.ints = ints;
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/array/LongArr.java b/src/test/java/org/yaml/snakeyaml/array/LongArr.java
new file mode 100644
index 0000000..7aae69a
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/array/LongArr.java
@@ -0,0 +1,25 @@
+package org.yaml.snakeyaml.array;
+
+import java.util.Arrays;
+
+public class LongArr {
+ private long[] longs;
+
+ public LongArr () {}
+
+ public LongArr ( long[] longs ) {
+ this.longs = longs;
+ }
+
+ public String toString() {
+ return Arrays.toString(longs);
+ }
+
+ public long[] getLongs() {
+ return longs;
+ }
+
+ public void setLongs(long[] longs) {
+ this.longs = longs;
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/array/PrimitiveArrayTest.java b/src/test/java/org/yaml/snakeyaml/array/PrimitiveArrayTest.java
new file mode 100644
index 0000000..f5b13a2
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/array/PrimitiveArrayTest.java
@@ -0,0 +1,184 @@
+package org.yaml.snakeyaml.array;
+
+import java.util.Arrays;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.junit.Assert;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.ConstructorException;
+import org.yaml.snakeyaml.error.YAMLException;
+
+public class PrimitiveArrayTest extends TestCase {
+
+ private final String pkg = "!!org.yaml.snakeyaml.array";
+
+ private final byte[] bytes = new byte[]{1,2,3};
+ private final short[] shorts = new short[]{300,301,302};
+ private final int[] ints = new int[]{40000,40001,40002};
+ private final long[] longs = new long[]{5000000000L,5000000001L};
+ private final float[] floats = new float[]{0.1f,3.1415f};
+ private final double[] doubles = new double[]{50.0001, 2150.0002};
+ private final char[] chars = new char[]{'a', 'b', 'c', 'd', 'e'};
+ private final boolean[] bools = new boolean[]{true, false};
+
+ public void testValidConstructor () {
+ String testInput =
+ "- " + pkg + ".ByteArr [ " + Arrays.toString(bytes) + " ]\n" +
+ "- " + pkg + ".ShortArr [ " + Arrays.toString(shorts) + " ]\n" +
+ "- " + pkg + ".IntArr [ " + Arrays.toString(ints) + " ]\n" +
+ "- " + pkg + ".LongArr [ " + Arrays.toString(longs) + " ]\n" +
+ "- " + pkg + ".FloatArr [ " + Arrays.toString(floats) + " ]\n" +
+ "- " + pkg + ".DoubleArr [ " + Arrays.toString(doubles) + " ]\n" +
+ "- " + pkg + ".CharArr [ " + Arrays.toString(chars) + " ]\n" +
+ "- " + pkg + ".BooleanArr [ " + Arrays.toString(bools) + " ]\n";
+
+ Yaml yaml = new Yaml();
+ List<Object> wrappers = (List<Object>)yaml.load(testInput);
+
+ Assert.assertArrayEquals ( bytes, ((ByteArr) wrappers.get(0)).getBytes() );
+ Assert.assertArrayEquals ( shorts, ((ShortArr) wrappers.get(1)).getShorts() );
+ Assert.assertArrayEquals ( ints, ((IntArr) wrappers.get(2)).getInts() );
+ Assert.assertArrayEquals ( longs, ((LongArr) wrappers.get(3)).getLongs() );
+ Assert.assertArrayEquals ( floats, ((FloatArr) wrappers.get(4)).getFloats(), 0.001f );
+ Assert.assertArrayEquals ( doubles,((DoubleArr)wrappers.get(5)).getDoubles(), 0.001 );
+ Assert.assertArrayEquals ( chars, ((CharArr) wrappers.get(6)).getChars() );
+ assertArrayEquals ( bools, ((BooleanArr)wrappers.get(7)).getBools() );
+ }
+
+ /*
+ * For some reason, every other assertArrayEquals specialization is
+ * provided by org.junit.Assert, but not this one.
+ */
+ private void assertArrayEquals ( boolean[] expected, boolean[] actuals ) {
+ assertEquals ( "Arrays differ in length", expected.length, actuals.length );
+ for ( int i = 0; i < expected.length; ++i ) {
+ if ( expected[i] != actuals[i] ) {
+ fail ( "Arrays first differ at " + i + "; expected " + expected[i] + " but got " + actuals[i] );
+ }
+ }
+ }
+
+ private void tryInvalid ( String t, Class<?> expectedException ) {
+ Yaml yaml = new Yaml();
+ try {
+ Object loaded = yaml.load(t);
+ fail ( "Expected " + expectedException.getCanonicalName() + " but loaded = \"" + loaded + "\"" );
+ } catch ( YAMLException e ) {
+ assertEquals ( expectedException, e.getCause().getClass() );
+ }
+ }
+
+ public void testInvalidConstructors() {
+ // Loading a character as any primitive other than 'char' is a ClassCastException
+ tryInvalid ( pkg + ".ByteArr [ [ 'a' ] ]", ClassCastException.class );
+ tryInvalid ( pkg + ".ShortArr [ [ 'a' ] ]", ClassCastException.class );
+ tryInvalid ( pkg + ".IntArr [ [ 'a' ] ]", ClassCastException.class );
+ tryInvalid ( pkg + ".LongArr [ [ 'a' ] ]", ClassCastException.class );
+ tryInvalid ( pkg + ".FloatArr [ [ 'a' ] ]", ClassCastException.class );
+ tryInvalid ( pkg + ".DoubleArr [ [ 'a' ] ]", ClassCastException.class );
+ tryInvalid ( pkg + ".BooleanArr [ [ 'a' ] ]", ClassCastException.class );
+
+ // Loading a floating-point number as a character is a ClassCastException
+ tryInvalid ( pkg + ".CharArr [ [ 1.2 ] ]", ClassCastException.class );
+
+ // Loading a String as a Character is a YAMLException
+ tryInvalid ( pkg + ".CharArr [ [ 'abcd' ] ]", YAMLException.class );
+
+ }
+
+ public void testTruncation() {
+ Yaml yaml = new Yaml();
+
+ // Loading floating-point numbers as integer types is allowed, because
+ // that's how the Number.byteValue(), .shortValue(), .intValue(),
+ // .longValue().
+ Assert.assertArrayEquals (
+ new byte[]{3,5},
+ ((ByteArr)yaml.load(pkg + ".ByteArr [ [ 3.14, 5.2 ] ] ")).getBytes()
+ );
+
+ Assert.assertArrayEquals (
+ new short[]{3,5},
+ ((ShortArr)yaml.load(pkg + ".ShortArr [ [ 3.14, 5.2 ] ] ")).getShorts()
+ );
+
+ Assert.assertArrayEquals (
+ new int[]{3,5},
+ ((IntArr)yaml.load(pkg + ".IntArr [ [ 3.14, 5.2 ] ] ")).getInts()
+ );
+
+ Assert.assertArrayEquals (
+ new long[]{3,5},
+ ((LongArr)yaml.load(pkg + ".LongArr [ [ 3.14, 5.2 ] ] ")).getLongs()
+ );
+ }
+
+ public void testPromotion() {
+ Yaml yaml = new Yaml();
+
+ // Loading integer numbers as floating-point types is allowed...
+ Assert.assertArrayEquals (
+ new float[]{3,5},
+ ((FloatArr)yaml.load(pkg + ".FloatArr [ [ 3, 5 ] ] ")).getFloats(),
+ 0.001f
+ );
+
+ Assert.assertArrayEquals (
+ new double[]{3,5},
+ ((DoubleArr)yaml.load(pkg + ".DoubleArr [ [ 3, 5 ] ] ")).getDoubles(),
+ 0.001f
+ );
+ }
+
+ public void testStringCharArray () {
+ Yaml yaml = new Yaml();
+
+ try {
+ yaml.load(pkg + ".CharArr [ [ abcd ] ]");
+ fail ( "Expected exception." );
+ } catch ( Exception e ) {
+ assertEquals ( ConstructorException.class, e.getClass() );
+ assertEquals ( "expected char but got \"abcd\"", e.getCause().getMessage() );
+ }
+ }
+
+ private static Object cycle ( Object in ) {
+ Yaml yaml = new Yaml();
+ String dumped = yaml.dump(in);
+ //System.out.println ( dumped );
+ return yaml.load(dumped);
+ }
+
+ /**
+ * All kinds of primitive arrays should be able to cycle from (Java array)
+ * to (YAML string) to (Java array) again, and they should be exactly the
+ * same before and after.
+ */
+ public void testCycle() {
+ ByteArr byteArr = new ByteArr(bytes);
+ Assert.assertArrayEquals ( byteArr.getBytes(), ((ByteArr)cycle(byteArr)).getBytes() );
+
+ ShortArr shortArr = new ShortArr(shorts);
+ Assert.assertArrayEquals ( shortArr.getShorts(), ((ShortArr)cycle(shortArr)).getShorts() );
+
+ IntArr intArr = new IntArr(ints);
+ Assert.assertArrayEquals ( intArr.getInts(), ((IntArr)cycle(intArr)).getInts() );
+
+ LongArr longArr = new LongArr(longs);
+ Assert.assertArrayEquals ( longArr.getLongs(), ((LongArr)cycle(longArr)).getLongs() );
+
+ FloatArr floatArr = new FloatArr(floats);
+ Assert.assertArrayEquals ( floatArr.getFloats(), ((FloatArr)cycle(floatArr)).getFloats(), 0.001f );
+
+ DoubleArr doubleArr = new DoubleArr(doubles);
+ Assert.assertArrayEquals ( doubleArr.getDoubles(), ((DoubleArr)cycle(doubleArr)).getDoubles(), 0.001 );
+
+ CharArr charArr = new CharArr(chars);
+ Assert.assertArrayEquals ( charArr.getChars(), ((CharArr)cycle(charArr)).getChars() );
+
+ BooleanArr boolArr = new BooleanArr(bools);
+ assertArrayEquals ( boolArr.getBools(), ((BooleanArr)cycle(boolArr)).getBools() );
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/array/ShortArr.java b/src/test/java/org/yaml/snakeyaml/array/ShortArr.java
new file mode 100644
index 0000000..9351370
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/array/ShortArr.java
@@ -0,0 +1,25 @@
+package org.yaml.snakeyaml.array;
+
+import java.util.Arrays;
+
+public class ShortArr {
+ private short[] shorts;
+
+ public ShortArr(){}
+
+ public ShortArr ( short[] shorts ) {
+ this.shorts = shorts;
+ }
+
+ public String toString() {
+ return Arrays.toString(shorts);
+ }
+
+ public short[] getShorts() {
+ return shorts;
+ }
+
+ public void setShorts(short[] shorts) {
+ this.shorts = shorts;
+ }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/generics/GenericArrayTypeTest.java b/src/test/java/org/yaml/snakeyaml/generics/GenericArrayTypeTest.java
index 9848ff7..40880c0 100644
--- a/src/test/java/org/yaml/snakeyaml/generics/GenericArrayTypeTest.java
+++ b/src/test/java/org/yaml/snakeyaml/generics/GenericArrayTypeTest.java
@@ -24,38 +24,6 @@
public class GenericArrayTypeTest extends TestCase {
- public void testPrimitives() {
- GenericPrimitivesArray ga = new GenericPrimitivesArray(3);
- Yaml yaml = new Yaml();
- try {
- yaml.dump(ga);
- fail("Arrays of primitives are not yet fully supported.");
- } catch (Exception e) {
- assertEquals("Arrays of primitives are not fully supported.", e.getMessage());
- }
- }
-
- public static class GenericPrimitivesArray extends AbstractAnimal<int[]> {
- private int[] home;
-
- public GenericPrimitivesArray(int count) {
- home = new int[count];
- for (int i = 0; i < home.length; i++) {
- home[i] = i + 1;
- }
- }
-
- @Override
- public int[] getHome() {
- return home;
- }
-
- @Override
- public void setHome(int[] home) {
- this.home = home;
- }
- }
-
public void testClasses() throws IntrospectionException {
GenericArray ga = new GenericArray();
Yaml yaml = new Yaml();
diff --git a/src/test/java/org/yaml/snakeyaml/types/SeqTagTest.java b/src/test/java/org/yaml/snakeyaml/types/SeqTagTest.java
index 89434d6..8859eb3 100644
--- a/src/test/java/org/yaml/snakeyaml/types/SeqTagTest.java
+++ b/src/test/java/org/yaml/snakeyaml/types/SeqTagTest.java
@@ -90,17 +90,4 @@
String output = dump(array);
assertEquals("[aaa, bbb, ccc]\n", output);
}
-
- public void testArrayPrimitives() {
- int[] array = new int[3];
- array[0] = 1;
- array[1] = 1;
- array[2] = 2;
- try {
- dump(array);
- fail("Arrays of primitives are not supported.");
- } catch (RuntimeException e) {
- assertEquals("Arrays of primitives are not fully supported.", e.getMessage());
- }
- }
}