/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2016 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.mappinginput;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.pentaho.di.core.exception.KettlePluginException;
import org.pentaho.di.core.row.RowMeta;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.row.value.ValueMetaPluginType;
import org.pentaho.di.core.row.value.ValueMetaString;
import org.pentaho.di.trans.steps.mapping.MappingValueRename;
import java.util.Arrays;
import java.util.List;
import java.util.Collections;
import static org.junit.Assert.*;
/**
* @author Andrey Khayrutdinov
*/
@RunWith( Parameterized.class )
public class MappingInputMeta_GetFields_Test {
@BeforeClass
public static void setUpBeforeClass() throws KettlePluginException {
ValueMetaPluginType.getInstance().searchPlugins();
}
@Parameterized.Parameters
public static List<Object[]> getData() {
return Arrays.asList(
simpleRename(),
renameAndSort(),
noRenames(),
noInputRowMeta(),
alreadyRenamed()
);
}
private static Object[] createCaseData( RowMeta inputRowMeta, List<MappingValueRename> renames, String[] fields,
boolean sortUnspecified, String[] expectedOutputFields ) {
return new Object[] { inputRowMeta, renames, fields, sortUnspecified, expectedOutputFields };
}
private static Object[] createCaseData( RowMeta inputRowMeta, List<MappingValueRename> renames, String[] fields,
String[] expectedOutputFields ) {
return createCaseData( inputRowMeta, renames, fields, false, expectedOutputFields );
}
private static RowMeta createRowMeta( String... fields ) {
RowMeta meta = new RowMeta();
for ( String field : fields ) {
meta.addValueMeta( new ValueMetaString( field ) );
}
return meta;
}
private static Object[] simpleRename() {
RowMeta inputRowMeta = createRowMeta( "field1", "field2" );
List<MappingValueRename> renames = Collections.singletonList( new MappingValueRename( "field2", "renamed" ) );
String[] fields = new String[] { "field1", "renamed" };
String[] expected = new String[] { "field1", "renamed" };
return createCaseData( inputRowMeta, renames, fields, expected );
}
private static Object[] renameAndSort() {
RowMeta inputRowMeta = createRowMeta( "field1", "field2", "2", "1" );
List<MappingValueRename> renames = Collections.singletonList( new MappingValueRename( "field2", "renamed" ) );
String[] fields = new String[] { "field1", "renamed" };
String[] expected = new String[] { "field1", "renamed", "1", "2" };
return createCaseData( inputRowMeta, renames, fields, true, expected );
}
private static Object[] noRenames() {
RowMeta inputRowMeta = createRowMeta( "field1", "field2" );
String[] fields = new String[] { "field1", "field2" };
String[] expected = new String[] { "field1", "field2" };
return createCaseData( inputRowMeta, null, fields, expected );
}
private static Object[] noInputRowMeta() {
String[] fields = new String[] { "field1", "field2" };
String[] expected = new String[] { "field1", "field2" };
return createCaseData( null, null, fields, expected );
}
private static Object[] alreadyRenamed() {
RowMeta inputRowMeta = createRowMeta( "field1", "renamed" );
List<MappingValueRename> renames = Collections.singletonList( new MappingValueRename( "field2", "renamed" ) );
String[] fields = new String[] { "field1", "renamed" };
String[] expected = new String[] { "field1", "renamed" };
return createCaseData( inputRowMeta, renames, fields, expected );
}
private final RowMeta inputRowMeta;
private final List<MappingValueRename> renames;
private final String[] fields;
private final boolean sortUnspecified;
private final String[] expectedOutputFields;
public MappingInputMeta_GetFields_Test( RowMeta inputRowMeta, List<MappingValueRename> renames, String[] fields,
boolean sortUnspecified, String[] expectedOutputFields ) {
this.inputRowMeta = inputRowMeta;
this.renames = renames;
this.fields = fields;
this.sortUnspecified = sortUnspecified;
this.expectedOutputFields = expectedOutputFields;
}
@Test
public void getFields() throws Exception {
MappingInputMeta meta = new MappingInputMeta();
meta.setInputRowMeta( inputRowMeta );
meta.setValueRenames( renames );
meta.allocate( fields.length );
meta.setFieldName( fields );
meta.setSelectingAndSortingUnspecifiedFields( sortUnspecified );
RowMeta rowMeta = new RowMeta();
meta.getFields( rowMeta, "origin", new RowMetaInterface[ 0 ], null, null, null, null );
assertEquals( Arrays.toString( expectedOutputFields ), expectedOutputFields.length, rowMeta.size() );
for ( int i = 0; i < rowMeta.size(); i++ ) {
assertEquals( String.format( "Element %d", i ), expectedOutputFields[ i ], rowMeta.getValueMeta( i ).getName() );
}
}
}