/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2013 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ******************************************************************************/ package org.pentaho.di.core.row; import junit.framework.TestCase; import org.pentaho.di.core.exception.KettleValueException; public class RowDataUtilTest extends TestCase { public boolean arrayCompare( Object[] arr1, int start1, Object[] arr2, int start2, int len ) { boolean rcode = true; int idx = 0; while ( idx < len && rcode == true ) { if ( arr1[start1 + idx] == null && arr2[start2 + idx] == null ) { // do nothing } else if ( !arr1[start1 + idx].equals( arr2[start2 + idx] ) ) { rcode = false; } idx++; } return rcode; } public void testResizeArray() throws KettleValueException { Object[] arr1 = new Object[] { "test", Boolean.TRUE, new Long( 100 ), new Long( 101 ), new String( "test1" ) }; Object[] nullArr = new Object[] { null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null }; // ------- Normal cases // Make array size bigger Object[] arr2 = RowDataUtil.resizeArray( arr1, 7 ); assertTrue( arr1 != arr2 ); // Allocate new array assertTrue( arr2.length >= 7 ); assertTrue( arrayCompare( arr1, 0, arr2, 0, arr1.length ) ); // Elements of arr1 are copied assertTrue( arrayCompare( arr2, arr1.length, nullArr, 0, arr2.length - arr1.length ) ); // last are null // Make array size smaller Object[] arr3 = RowDataUtil.resizeArray( arr1, 3 ); assertTrue( arr3 == arr1 ); // Make array size equal Object[] arr4 = RowDataUtil.resizeArray( arr1, arr1.length ); assertTrue( arr1 != arr2 ); // Allocatew new array assertEquals( arr4.length, arr1.length ); assertTrue( arrayCompare( arr1, 0, arr4, 0, arr1.length ) ); // Elements of arr1 are copied } public void testRemoveItem() throws KettleValueException { Object[] arr = new Object[] { new Long( 1L ), new Long( 2L ), new Long( 3L ), new Long( 4L ), new Long( 5L ) }; // Remove the first item Object[] comp1 = new Object[] { new Long( 2L ), new Long( 3L ), new Long( 4L ), new Long( 5L ) }; Object[] newArr1 = RowDataUtil.removeItem( arr, 0 ); assertTrue( newArr1.length == comp1.length ); assertTrue( newArr1.length == arr.length - 1 ); assertTrue( arrayCompare( newArr1, 0, comp1, 0, newArr1.length ) ); // Remove the last item Object[] comp2 = new Object[] { new Long( 2L ), new Long( 3L ), new Long( 4L ) }; Object[] newArr2 = RowDataUtil.removeItem( newArr1, newArr1.length - 1 ); assertTrue( newArr2.length == arr.length - 2 ); assertTrue( newArr2.length == comp2.length ); assertTrue( arrayCompare( newArr2, 0, comp2, 0, newArr2.length ) ); // Remove in the middle Object[] comp3 = new Object[] { new Long( 2L ), new Long( 4L ) }; Object[] newArr3 = RowDataUtil.removeItem( newArr2, 1 ); assertTrue( newArr3.length == arr.length - 3 ); assertTrue( newArr3.length == comp3.length ); assertTrue( arrayCompare( newArr3, 0, comp3, 0, newArr3.length ) ); // Remove until empty Object[] comp4 = new Object[] {}; Object[] newArr4 = RowDataUtil.removeItem( newArr3, 0 ); newArr4 = RowDataUtil.removeItem( newArr4, 0 ); assertTrue( newArr4.length == arr.length - 5 ); assertTrue( newArr4.length == comp4.length ); assertTrue( arrayCompare( newArr4, 0, comp4, 0, newArr4.length ) ); } public void testAddRowData() throws KettleValueException { Object[] arr = new Object[] { new Long( 1L ), new Long( 2L ), new Long( 3L ) }; // Do all different combinations of adding rows to // each other Object[] newArr1 = RowDataUtil.addRowData( new Object[] {}, 0, new Object[] { new Long( 1L ), new Long( 2L ), new Long( 3L ) } ); assertTrue( newArr1.length >= arr.length ); assertTrue( arrayCompare( newArr1, 0, arr, 0, arr.length ) ); Object[] newArr2 = RowDataUtil.addRowData( new Object[] { new Long( 1L ), new Long( 2L ), new Long( 3L ) }, 3, new Object[] {} ); assertTrue( newArr2.length >= arr.length ); assertTrue( arrayCompare( newArr2, 0, arr, 0, arr.length ) ); Object[] newArr3 = RowDataUtil.addRowData( new Object[] { new Long( 1L ) }, 1, new Object[] { new Long( 2L ), new Long( 3L ) } ); assertTrue( newArr3.length >= arr.length ); assertTrue( arrayCompare( newArr3, 0, arr, 0, arr.length ) ); Object[] newArr4 = RowDataUtil.addRowData( new Object[] { new Long( 1L ), new Long( 2L ) }, 2, new Object[] { new Long( 3L ) } ); assertTrue( newArr4.length >= arr.length ); assertTrue( arrayCompare( newArr4, 0, arr, 0, arr.length ) ); } public void testAddValueData() throws KettleValueException { Object[] arr1 = new Object[] { new Long( 1L ) }; Object[] arr2 = new Object[] { new Long( 1L ), new Long( 2L ) }; Object[] newArr1 = RowDataUtil.addValueData( new Object[] {}, 0, new Long( 1L ) ); assertTrue( newArr1.length >= arr1.length ); assertTrue( arrayCompare( newArr1, 0, arr1, 0, arr1.length ) ); Object[] newArr2 = RowDataUtil.addValueData( new Object[] { new Long( 1L ) }, 1, new Long( 2L ) ); assertTrue( newArr2.length >= arr2.length ); assertTrue( arrayCompare( newArr2, 0, arr2, 0, arr2.length ) ); } public void testRemoveItems() throws KettleValueException { Object[] arr1 = new Object[] { new Long( 1L ), new Long( 2L ), new Long( 3L ), new Long( 4L ), new Long( 5L ) }; Object[] comp1 = new Object[] { new Long( 2L ), new Long( 4L ) }; Object[] newArr1 = RowDataUtil.removeItems( arr1, new int[] {} ); assertTrue( newArr1.length == arr1.length ); assertTrue( arrayCompare( newArr1, 0, arr1, 0, newArr1.length ) ); Object[] newArr2 = RowDataUtil.removeItems( arr1, new int[] { 0, 2, 4 } ); assertTrue( newArr2.length == arr1.length - 3 ); assertTrue( arrayCompare( newArr2, 0, comp1, 0, newArr2.length ) ); } }