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]

Reply via email to