ggregory 2004/08/25 14:20:15
Modified: lang/src/test/org/apache/commons/lang ArrayUtilsTest.java
lang/src/java/org/apache/commons/lang/builder
EqualsBuilder.java
lang/src/test/org/apache/commons/lang/builder
EqualsBuilderTest.java
Log:
Bugzilla Bug 30815
ArrayUtils.isEquals() throws ClassCastException when array1 and array2 are different
dimension
http://issues.apache.org/bugzilla/show_bug.cgi?id=30815
Revision Changes Path
1.28 +54 -7
jakarta-commons/lang/src/test/org/apache/commons/lang/ArrayUtilsTest.java
Index: ArrayUtilsTest.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/lang/src/test/org/apache/commons/lang/ArrayUtilsTest.java,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- ArrayUtilsTest.java 6 Jun 2004 03:53:24 -0000 1.27
+++ ArrayUtilsTest.java 25 Aug 2004 21:20:13 -0000 1.28
@@ -103,14 +103,61 @@
}
//-----------------------------------------------------------------------
- public void testIsEquals() {
- long[][] array1 = new long[][] {{2,5}, {4,5}};
- long[][] array2 = new long[][] {{2,5}, {4,6}};
+ private void assertIsEquals(Object array1, Object array2, Object array3) {
assertEquals(true, ArrayUtils.isEquals(array1, array1));
+ assertEquals(true, ArrayUtils.isEquals(array2, array2));
+ assertEquals(true, ArrayUtils.isEquals(array3, array3));
+ assertEquals(false, ArrayUtils.isEquals(array1, array2));
+ assertEquals(false, ArrayUtils.isEquals(array2, array1));
+ assertEquals(false, ArrayUtils.isEquals(array1, array3));
+ assertEquals(false, ArrayUtils.isEquals(array3, array1));
assertEquals(false, ArrayUtils.isEquals(array1, array2));
-
- Object[] array3 = new Object[] {new String(new char[] {'A', 'B'})};
- Object[] array4 = new Object[] {"AB"};
+ assertEquals(false, ArrayUtils.isEquals(array2, array1));
+ }
+
+ public void testIsEquals() {
+ long[][] larray1 = new long[][]{{2, 5}, {4, 5}};
+ long[][] larray2 = new long[][]{{2, 5}, {4, 6}};
+ long[] larray3 = new long[]{2, 5};
+ this.assertIsEquals(larray1, larray2, larray3);
+
+ int[][] iarray1 = new int[][]{{2, 5}, {4, 5}};
+ int[][] iarray2 = new int[][]{{2, 5}, {4, 6}};
+ int[] iarray3 = new int[]{2, 5};
+ this.assertIsEquals(iarray1, iarray2, iarray3);
+
+ short[][] sarray1 = new short[][]{{2, 5}, {4, 5}};
+ short[][] sarray2 = new short[][]{{2, 5}, {4, 6}};
+ short[] sarray3 = new short[]{2, 5};
+ this.assertIsEquals(sarray1, sarray2, sarray3);
+
+ float[][] farray1 = new float[][]{{2, 5}, {4, 5}};
+ float[][] farray2 = new float[][]{{2, 5}, {4, 6}};
+ float[] farray3 = new float[]{2, 5};
+ this.assertIsEquals(farray1, farray2, farray3);
+
+ double[][] darray1 = new double[][]{{2, 5}, {4, 5}};
+ double[][] darray2 = new double[][]{{2, 5}, {4, 6}};
+ double[] darray3 = new double[]{2, 5};
+ this.assertIsEquals(darray1, darray2, darray3);
+
+ byte[][] byteArray1 = new byte[][]{{2, 5}, {4, 5}};
+ byte[][] byteArray2 = new byte[][]{{2, 5}, {4, 6}};
+ byte[] byteArray3 = new byte[]{2, 5};
+ this.assertIsEquals(byteArray1, byteArray2, byteArray3);
+
+ char[][] charArray1 = new char[][]{{2, 5}, {4, 5}};
+ char[][] charArray2 = new char[][]{{2, 5}, {4, 6}};
+ char[] charArray3 = new char[]{2, 5};
+ this.assertIsEquals(charArray1, charArray2, charArray3);
+
+ boolean[][] barray1 = new boolean[][]{{true, false}, {true, true}};
+ boolean[][] barray2 = new boolean[][]{{true, false}, {true, false}};
+ boolean[] barray3 = new boolean[]{false, true};
+ this.assertIsEquals(barray1, barray2, barray3);
+
+ Object[] array3 = new Object[]{new String(new char[]{'A', 'B'})};
+ Object[] array4 = new Object[]{"AB"};
assertEquals(true, ArrayUtils.isEquals(array3, array3));
assertEquals(true, ArrayUtils.isEquals(array3, array4));
1.25 +34 -28
jakarta-commons/lang/src/java/org/apache/commons/lang/builder/EqualsBuilder.java
Index: EqualsBuilder.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/lang/src/java/org/apache/commons/lang/builder/EqualsBuilder.java,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- EqualsBuilder.java 18 Feb 2004 22:53:24 -0000 1.24
+++ EqualsBuilder.java 25 Aug 2004 21:20:13 -0000 1.25
@@ -288,40 +288,46 @@
}
Class lhsClass = lhs.getClass();
if (!lhsClass.isArray()) {
- //the simple case, not an array, just test the element
+ // The simple case, not an array, just test the element
isEquals = lhs.equals(rhs);
+ } else if (lhs.getClass() != rhs.getClass()) {
+ // Here when we compare different dimensions, for example: a
boolean[][] to a boolean[]
+ isEquals = false;
+ }
+ // 'Switch' on type of array, to dispatch to the correct handler
+ // This handles multi dimensional arrays of the same depth
+ else if (lhs instanceof long[]) {
+ append((long[]) lhs, (long[]) rhs);
+ } else if (lhs instanceof int[]) {
+ append((int[]) lhs, (int[]) rhs);
+ } else if (lhs instanceof short[]) {
+ append((short[]) lhs, (short[]) rhs);
+ } else if (lhs instanceof char[]) {
+ append((char[]) lhs, (char[]) rhs);
+ } else if (lhs instanceof byte[]) {
+ append((byte[]) lhs, (byte[]) rhs);
+ } else if (lhs instanceof double[]) {
+ append((double[]) lhs, (double[]) rhs);
+ } else if (lhs instanceof float[]) {
+ append((float[]) lhs, (float[]) rhs);
+ } else if (lhs instanceof boolean[]) {
+ append((boolean[]) lhs, (boolean[]) rhs);
} else {
- //'Switch' on type of array, to dispatch to the correct handler
- // This handles multi dimensional arrays
- if (lhs instanceof long[]) {
- append((long[]) lhs, (long[]) rhs);
- } else if (lhs instanceof int[]) {
- append((int[]) lhs, (int[]) rhs);
- } else if (lhs instanceof short[]) {
- append((short[]) lhs, (short[]) rhs);
- } else if (lhs instanceof char[]) {
- append((char[]) lhs, (char[]) rhs);
- } else if (lhs instanceof byte[]) {
- append((byte[]) lhs, (byte[]) rhs);
- } else if (lhs instanceof double[]) {
- append((double[]) lhs, (double[]) rhs);
- } else if (lhs instanceof float[]) {
- append((float[]) lhs, (float[]) rhs);
- } else if (lhs instanceof boolean[]) {
- append((boolean[]) lhs, (boolean[]) rhs);
- } else {
- // Not an array of primitives
- append((Object[]) lhs, (Object[]) rhs);
- }
+ // Not an array of primitives
+ append((Object[]) lhs, (Object[]) rhs);
}
return this;
}
/**
- * <p>Test if two <code>long</code>s are equal.</p>
- *
- * @param lhs the left hand <code>long</code>
- * @param rhs the right hand <code>long</code>
+ * <p>
+ * Test if two <code>long</code> s are equal.
+ * </p>
+ *
+ * @param lhs
+ * the left hand <code>long</code>
+ * @param rhs
+ * the right hand <code>long</code>
* @return EqualsBuilder - used to chain calls.
*/
public EqualsBuilder append(long lhs, long rhs) {
1.10 +8 -1
jakarta-commons/lang/src/test/org/apache/commons/lang/builder/EqualsBuilderTest.java
Index: EqualsBuilderTest.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/lang/src/test/org/apache/commons/lang/builder/EqualsBuilderTest.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- EqualsBuilderTest.java 18 Feb 2004 23:00:51 -0000 1.9
+++ EqualsBuilderTest.java 25 Aug 2004 21:20:15 -0000 1.10
@@ -669,6 +669,13 @@
assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
array1[1][1] = false;
assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
+
+ // compare 1 dim to 2.
+ boolean[] array3 = new boolean[]{true, true};
+ assertFalse(new EqualsBuilder().append(array1, array3).isEquals());
+ assertFalse(new EqualsBuilder().append(array3, array1).isEquals());
+ assertFalse(new EqualsBuilder().append(array2, array3).isEquals());
+ assertFalse(new EqualsBuilder().append(array3, array2).isEquals());
}
public void testRaggedArray() {
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]