/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2015 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.trans.steps.memgroupby; import static org.mockito.Matchers.any; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import junit.framework.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.mockito.Mockito; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.logging.LoggingObjectInterface; import org.pentaho.di.core.row.RowMetaInterface; import org.pentaho.di.core.row.ValueMetaInterface; import org.pentaho.di.core.row.value.ValueMetaInteger; import org.pentaho.di.trans.steps.mock.StepMockHelper; public class MemoryGroupByNewAggregateTest { static StepMockHelper<MemoryGroupByMeta, MemoryGroupByData> mockHelper; static List<Integer> strings; static List<Integer> statistics; MemoryGroupBy step; MemoryGroupByData data; @BeforeClass public static void setUpBeforeClass() throws Exception { mockHelper = new StepMockHelper<MemoryGroupByMeta, MemoryGroupByData>( "Memory Group By", MemoryGroupByMeta.class, MemoryGroupByData.class ); when( mockHelper.logChannelInterfaceFactory.create( any(), any( LoggingObjectInterface.class ) ) ).thenReturn( mockHelper.logChannelInterface ); when( mockHelper.trans.isRunning() ).thenReturn( true ); // In this step we will distinct String aggregations from numeric ones strings = new ArrayList<Integer>(); strings.add( MemoryGroupByMeta.TYPE_GROUP_CONCAT_COMMA ); strings.add( MemoryGroupByMeta.TYPE_GROUP_CONCAT_STRING ); // Statistics will be initialized with collections... statistics = new ArrayList<Integer>(); statistics.add( MemoryGroupByMeta.TYPE_GROUP_MEDIAN ); statistics.add( MemoryGroupByMeta.TYPE_GROUP_PERCENTILE ); } @Before public void setUp() throws Exception { data = new MemoryGroupByData(); data.subjectnrs = new int[16]; int[] arr = new int[16]; String[] arrF = new String[16]; for ( int i = 0; i < arr.length; i++ ) { // set aggregation types (hardcoded integer values from 1 to 18) arr[i] = i + 1; data.subjectnrs[i] = i; } Arrays.fill( arrF, "x" ); MemoryGroupByMeta meta = new MemoryGroupByMeta(); meta.setAggregateType( arr ); meta.setAggregateField( arrF ); ValueMetaInterface vmi = new ValueMetaInteger(); when( mockHelper.stepMeta.getStepMetaInterface() ).thenReturn( meta ); RowMetaInterface rmi = Mockito.mock( RowMetaInterface.class ); data.inputRowMeta = rmi; when( rmi.getValueMeta( Mockito.anyInt() ) ).thenReturn( vmi ); data.aggMeta = rmi; step = new MemoryGroupBy( mockHelper.stepMeta, data, 0, mockHelper.transMeta, mockHelper.trans ); } @Test public void testNewAggregate() throws KettleException { Object[] r = new Object[16]; Arrays.fill( r, null ); Aggregate agg = new Aggregate(); step.newAggregate( r, agg ); Assert.assertEquals( "All possible aggregation cases considered", 16, agg.agg.length ); // all aggregations types is int values, filled in ascending order in perconditions for ( int i = 0; i < agg.agg.length; i++ ) { int type = i + 1; if ( strings.contains( type ) ) { Assert.assertTrue( "This is appendable type, type=" + type, agg.agg[i] instanceof Appendable ); } else if ( statistics.contains( type ) ) { Assert.assertTrue( "This is collection, type=" + type, agg.agg[i] instanceof Collection ); } else { Assert.assertNull( "Aggregation initialized with null, type=" + type, agg.agg[i] ); } } } }