/*! ******************************************************************************
*
* 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.scriptvalues_mod;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.RowMetaAndData;
import org.pentaho.di.core.exception.KettleValueException;
import org.pentaho.di.core.plugins.PluginRegistry;
import org.pentaho.di.core.plugins.StepPluginType;
import org.pentaho.di.core.row.RowMeta;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.row.ValueMetaInterface;
import org.pentaho.di.core.row.value.ValueMetaBoolean;
import org.pentaho.di.core.row.value.ValueMetaDate;
import org.pentaho.di.core.row.value.ValueMetaInteger;
import org.pentaho.di.core.row.value.ValueMetaNumber;
import org.pentaho.di.core.row.value.ValueMetaString;
import org.pentaho.di.core.variables.Variables;
import org.pentaho.di.trans.RowProducer;
import org.pentaho.di.trans.RowStepCollector;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransHopMeta;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.TransTestFactory;
import org.pentaho.di.trans.step.StepInterface;
import org.pentaho.di.trans.step.StepMeta;
import org.pentaho.di.trans.steps.dummytrans.DummyTransMeta;
import org.pentaho.di.trans.steps.injector.InjectorMeta;
import junit.framework.TestCase;
/**
* Test class for the Modified Javascript step for the special functions. Things tested: LuhnCheck().
*
* @author Sven Boden
*/
public class JavaScriptSpecialTest extends TestCase {
public RowMetaInterface createRowMetaInterface1() {
RowMetaInterface rm = new RowMeta();
ValueMetaInterface[] valuesMeta = { new ValueMetaString( "string" ), };
for ( int i = 0; i < valuesMeta.length; i++ ) {
rm.addValueMeta( valuesMeta[ i ] );
}
return rm;
}
public List<RowMetaAndData> createData1() {
List<RowMetaAndData> list = new ArrayList<RowMetaAndData>();
RowMetaInterface rm = createRowMetaInterface1();
Object[] r1 = new Object[] { "446-667-651" };
Object[] r2 = new Object[] { "446667651" };
Object[] r3 = new Object[] { "4444333322221111" };
Object[] r4 = new Object[] { "4444 3333 2222 1111" };
Object[] r5 = new Object[] { "444433332aa2221111" };
Object[] r6 = new Object[] { "4444333322221111aa" };
list.add( new RowMetaAndData( rm, r1 ) );
list.add( new RowMetaAndData( rm, r2 ) );
list.add( new RowMetaAndData( rm, r3 ) );
list.add( new RowMetaAndData( rm, r4 ) );
list.add( new RowMetaAndData( rm, r5 ) );
list.add( new RowMetaAndData( rm, r6 ) );
return list;
}
/**
* Create the meta data for the results (ltrim/rtrim/trim).
*/
public RowMetaInterface createRowMetaInterfaceResult1() {
RowMetaInterface rm = new RowMeta();
ValueMetaInterface[] valuesMeta =
{ new ValueMetaString( "string" ), new ValueMetaBoolean( "bool" ) };
for ( int i = 0; i < valuesMeta.length; i++ ) {
rm.addValueMeta( valuesMeta[ i ] );
}
return rm;
}
/**
* Create result data for test case 1.
*/
public List<RowMetaAndData> createResultData1() {
List<RowMetaAndData> list = new ArrayList<RowMetaAndData>();
RowMetaInterface rm = createRowMetaInterfaceResult1();
Object[] r1 = new Object[] { "446-667-651", Boolean.FALSE };
Object[] r2 = new Object[] { "446667651", Boolean.TRUE };
Object[] r3 = new Object[] { "4444333322221111", Boolean.TRUE };
Object[] r4 = new Object[] { "4444 3333 2222 1111", Boolean.FALSE };
Object[] r5 = new Object[] { "444433332aa2221111", Boolean.FALSE };
Object[] r6 = new Object[] { "4444333322221111aa", Boolean.FALSE };
list.add( new RowMetaAndData( rm, r1 ) );
list.add( new RowMetaAndData( rm, r2 ) );
list.add( new RowMetaAndData( rm, r3 ) );
list.add( new RowMetaAndData( rm, r4 ) );
list.add( new RowMetaAndData( rm, r5 ) );
list.add( new RowMetaAndData( rm, r6 ) );
return list;
}
public List<RowMetaAndData> createResultData2() {
List<RowMetaAndData> list = new ArrayList<RowMetaAndData>();
RowMetaInterface rm = createRowMetaInterface1();
Object[] r1 = new Object[] { "446-667-651" };
Object[] r2 = new Object[] { "446667651" };
Object[] r3 = new Object[] { "4444333322221111" };
list.add( new RowMetaAndData( rm, r1 ) );
list.add( new RowMetaAndData( rm, r2 ) );
list.add( new RowMetaAndData( rm, r3 ) );
return list;
}
public RowMetaInterface createRowMetaInterface3() {
RowMetaInterface rm = new RowMeta();
ValueMetaInterface[] valuesMeta =
{
new ValueMetaInteger( "int_in" ),
new ValueMetaNumber( "number_in" ),
new ValueMetaString( "string_in" ), };
for ( int i = 0; i < valuesMeta.length; i++ ) {
rm.addValueMeta( valuesMeta[ i ] );
}
return rm;
}
public List<RowMetaAndData> createData3() {
List<RowMetaAndData> list = new ArrayList<RowMetaAndData>();
RowMetaInterface rm = createRowMetaInterface3();
Object[] r1 = new Object[] { new Long( 1 ), new Double( 1.0D ), "1" };
Object[] r2 = new Object[] { new Long( 2 ), new Double( 2.0D ), "2" };
Object[] r3 = new Object[] { new Long( 3 ), new Double( 3.0D ), "3" };
Object[] r4 = new Object[] { new Long( 4 ), new Double( 4.0D ), "4" };
list.add( new RowMetaAndData( rm, r1 ) );
list.add( new RowMetaAndData( rm, r2 ) );
list.add( new RowMetaAndData( rm, r3 ) );
list.add( new RowMetaAndData( rm, r4 ) );
return list;
}
public RowMetaInterface createRowMetaInterface4() {
RowMetaInterface rm = new RowMeta();
ValueMetaInterface[] valuesMeta =
{
new ValueMetaInteger( "int_in" ),
new ValueMetaNumber( "number_in" ),
new ValueMetaString( "string_in" ), new ValueMetaInteger( "long1" ),
new ValueMetaNumber( "number1" ), new ValueMetaString( "string1" ),
new ValueMetaInteger( "long2" ), new ValueMetaNumber( "number2" ),
new ValueMetaString( "string2" ), };
for ( int i = 0; i < valuesMeta.length; i++ ) {
rm.addValueMeta( valuesMeta[ i ] );
}
return rm;
}
public List<RowMetaAndData> createResultData3() {
List<RowMetaAndData> list = new ArrayList<RowMetaAndData>();
RowMetaInterface rm = createRowMetaInterface4();
Object[] r1 =
new Object[] {
new Long( 1 ), new Double( 1.0D ), "1", new Long( 2 ), new Double( 2.0D ), "2", new Long( 2 ),
new Double( 2.0D ), "2" };
Object[] r2 =
new Object[] {
new Long( 2 ), new Double( 2.0D ), "2", new Long( 3 ), new Double( 3.0D ), "3", new Long( 3 ),
new Double( 3.0D ), "3" };
Object[] r3 =
new Object[] {
new Long( 3 ), new Double( 3.0D ), "3", new Long( 4 ), new Double( 4.0D ), "4", new Long( 4 ),
new Double( 4.0D ), "4" };
Object[] r4 =
new Object[] {
new Long( 4 ), new Double( 4.0D ), "4", new Long( 5 ), new Double( 5.0D ), "5", new Long( 5 ),
new Double( 5.0D ), "5" };
list.add( new RowMetaAndData( rm, r1 ) );
list.add( new RowMetaAndData( rm, r2 ) );
list.add( new RowMetaAndData( rm, r3 ) );
list.add( new RowMetaAndData( rm, r4 ) );
return list;
}
/**
* Check the 2 lists comparing the rows in order. If they are not the same fail the test.
*/
public void checkRows( List<RowMetaAndData> rows1, List<RowMetaAndData> rows2 ) {
int idx = 1;
if ( rows1.size() != rows2.size() ) {
fail( "Number of rows is not the same: " + rows1.size() + " and " + rows2.size() );
}
Iterator<RowMetaAndData> it1 = rows1.iterator();
Iterator<RowMetaAndData> it2 = rows2.iterator();
while ( it1.hasNext() && it2.hasNext() ) {
RowMetaAndData rm1 = it1.next();
RowMetaAndData rm2 = it2.next();
Object[] r1 = rm1.getData();
Object[] r2 = rm2.getData();
if ( rm1.size() != rm2.size() ) {
fail( "row nr " + idx + " is not equal" );
}
int[] fields = new int[ rm1.size() ];
for ( int ydx = 0; ydx < rm1.size(); ydx++ ) {
fields[ ydx ] = ydx;
}
try {
if ( rm1.getRowMeta().compare( r1, r2, fields ) != 0 ) {
fail( "row nr " + idx + " is not equal" );
}
} catch ( KettleValueException e ) {
fail( "row nr " + idx + " is not equal" );
}
idx++;
}
}
/**
* Test case for javascript functionality: ltrim(), rtrim(), trim().
*/
public void testLuhnCheck() throws Exception {
KettleEnvironment.init();
//
// Create a new transformation...
//
TransMeta transMeta = new TransMeta();
transMeta.setName( "test javascript LuhnCheck" );
PluginRegistry registry = PluginRegistry.getInstance();
//
// create an injector step...
//
String injectorStepname = "injector step";
InjectorMeta im = new InjectorMeta();
// Set the information of the injector.
String injectorPid = registry.getPluginId( StepPluginType.class, im );
StepMeta injectorStep = new StepMeta( injectorPid, injectorStepname, im );
transMeta.addStep( injectorStep );
//
// Create a javascript step
//
String javaScriptStepname = "javascript step";
ScriptValuesMetaMod svm = new ScriptValuesMetaMod();
ScriptValuesScript[] js =
new ScriptValuesScript[] { new ScriptValuesScript(
ScriptValuesScript.TRANSFORM_SCRIPT, "script", "var str = string;\n" + "var bool = LuhnCheck(str);" ) };
svm.setJSScripts( js );
svm.setFieldname( new String[] { "bool" } );
svm.setRename( new String[] { "" } );
svm.setType( new int[] { ValueMetaInterface.TYPE_BOOLEAN } );
svm.setLength( new int[] { -1 } );
svm.setPrecision( new int[] { -1 } );
svm.setReplace( new boolean[] { false } );
svm.setCompatible( false );
String javaScriptStepPid = registry.getPluginId( StepPluginType.class, svm );
StepMeta javaScriptStep = new StepMeta( javaScriptStepPid, javaScriptStepname, svm );
transMeta.addStep( javaScriptStep );
TransHopMeta hi1 = new TransHopMeta( injectorStep, javaScriptStep );
transMeta.addTransHop( hi1 );
//
// Create a dummy step
//
String dummyStepname = "dummy step";
DummyTransMeta dm = new DummyTransMeta();
String dummyPid = registry.getPluginId( StepPluginType.class, dm );
StepMeta dummyStep = new StepMeta( dummyPid, dummyStepname, dm );
transMeta.addStep( dummyStep );
TransHopMeta hi2 = new TransHopMeta( javaScriptStep, dummyStep );
transMeta.addTransHop( hi2 );
// Now execute the transformation...
Trans trans = new Trans( transMeta );
trans.prepareExecution( null );
StepInterface si;
si = trans.getStepInterface( javaScriptStepname, 0 );
RowStepCollector javaScriptRc = new RowStepCollector();
si.addRowListener( javaScriptRc );
si = trans.getStepInterface( dummyStepname, 0 );
RowStepCollector dummyRc = new RowStepCollector();
si.addRowListener( dummyRc );
RowProducer rp = trans.addRowProducer( injectorStepname, 0 );
trans.startThreads();
// add rows
List<RowMetaAndData> inputList = createData1();
Iterator<RowMetaAndData> it = inputList.iterator();
while ( it.hasNext() ) {
RowMetaAndData rm = it.next();
rp.putRow( rm.getRowMeta(), rm.getData() );
}
rp.finished();
trans.waitUntilFinished();
List<RowMetaAndData> goldenImageRows = createResultData1();
List<RowMetaAndData> resultRows1 = javaScriptRc.getRowsWritten();
checkRows( resultRows1, goldenImageRows );
List<RowMetaAndData> resultRows2 = dummyRc.getRowsRead();
checkRows( resultRows2, goldenImageRows );
}
/**
* Test case for javascript functionality: trans_Status and SKIP_TRANSFORMATION. Regression test case for JIRA defect
* PDI-364.
*/
public void testTransStatus() throws Exception {
KettleEnvironment.init();
//
// Create a new transformation...
//
TransMeta transMeta = new TransMeta();
transMeta.setName( "test javascript trans_Status" );
PluginRegistry registry = PluginRegistry.getInstance();
//
// create an injector step...
//
String injectorStepname = "injector step";
InjectorMeta im = new InjectorMeta();
// Set the information of the injector.
String injectorPid = registry.getPluginId( StepPluginType.class, im );
StepMeta injectorStep = new StepMeta( injectorPid, injectorStepname, im );
transMeta.addStep( injectorStep );
//
// Create a javascript step
//
String javaScriptStepname = "javascript step";
ScriptValuesMetaMod svm = new ScriptValuesMetaMod();
// process 3 rows and skip the rest.
ScriptValuesScript[] js =
new ScriptValuesScript[] { new ScriptValuesScript(
ScriptValuesScript.TRANSFORM_SCRIPT, "script", "trans_Status = CONTINUE_TRANSFORMATION;\n"
+ "if (getProcessCount(\"r\") > 3) {\n" + " \ttrans_Status = SKIP_TRANSFORMATION;\n" + "}" ) };
svm.setJSScripts( js );
svm.setFieldname( new String[] {} );
svm.setRename( new String[] {} );
svm.setType( new int[] {} );
svm.setLength( new int[] {} );
svm.setPrecision( new int[] {} );
svm.setCompatible( false );
String javaScriptStepPid = registry.getPluginId( StepPluginType.class, svm );
StepMeta javaScriptStep = new StepMeta( javaScriptStepPid, javaScriptStepname, svm );
transMeta.addStep( javaScriptStep );
TransHopMeta hi1 = new TransHopMeta( injectorStep, javaScriptStep );
transMeta.addTransHop( hi1 );
//
// Create a dummy step
//
String dummyStepname = "dummy step";
DummyTransMeta dm = new DummyTransMeta();
String dummyPid = registry.getPluginId( StepPluginType.class, dm );
StepMeta dummyStep = new StepMeta( dummyPid, dummyStepname, dm );
transMeta.addStep( dummyStep );
TransHopMeta hi2 = new TransHopMeta( javaScriptStep, dummyStep );
transMeta.addTransHop( hi2 );
// Now execute the transformation...
Trans trans = new Trans( transMeta );
trans.prepareExecution( null );
StepInterface si;
si = trans.getStepInterface( javaScriptStepname, 0 );
RowStepCollector javaScriptRc = new RowStepCollector();
si.addRowListener( javaScriptRc );
si = trans.getStepInterface( dummyStepname, 0 );
RowStepCollector dummyRc = new RowStepCollector();
si.addRowListener( dummyRc );
RowProducer rp = trans.addRowProducer( injectorStepname, 0 );
trans.startThreads();
// add rows
List<RowMetaAndData> inputList = createData1();
Iterator<RowMetaAndData> it = inputList.iterator();
while ( it.hasNext() ) {
RowMetaAndData rm = it.next();
rp.putRow( rm.getRowMeta(), rm.getData() );
}
rp.finished();
trans.waitUntilFinished();
List<RowMetaAndData> goldenImageRows = createResultData2();
List<RowMetaAndData> resultRows1 = javaScriptRc.getRowsWritten();
checkRows( resultRows1, goldenImageRows );
List<RowMetaAndData> resultRows2 = dummyRc.getRowsRead();
checkRows( resultRows2, goldenImageRows );
}
/**
* Test case for JavaScript/Java/JavaScript interfacing.
*/
public void disabledTestJavaInterface() throws Exception {
KettleEnvironment.init();
//
// Create a new transformation...
//
TransMeta transMeta = new TransMeta();
transMeta.setName( "test javascript interface" );
PluginRegistry registry = PluginRegistry.getInstance();
//
// create an injector step...
//
String injectorStepname = "injector step";
InjectorMeta im = new InjectorMeta();
// Set the information of the injector.
String injectorPid = registry.getPluginId( StepPluginType.class, im );
StepMeta injectorStep = new StepMeta( injectorPid, injectorStepname, im );
transMeta.addStep( injectorStep );
//
// Create a javascript step
//
String javaScriptStepname = "javascript step";
ScriptValuesMetaMod svm = new ScriptValuesMetaMod();
// process 3 rows and skip the rest.
ScriptValuesScript[] js =
new ScriptValuesScript[] { new ScriptValuesScript(
ScriptValuesScript.TRANSFORM_SCRIPT,
"script1",
"java;\n\n"
+ "var obj = new Packages.org.pentaho.di.trans.steps.scriptvalues_mod.JavaScriptTest();\n"
+ "var long1 = obj.add1ToLong(getInputRowMeta().getInteger(row, 0));\n"
+ "var number1 = obj.add1ToNumber(getInputRowMeta().getNumber(row, 1));\n"
+ "var string1 = obj.add1ToString(getInputRowMeta().getString(row, 2));\n"
+ "var long2 = Packages.org.pentaho.di.trans.steps.scriptvalues_mod."
+ "JavaScriptTest.add1ToLongStatic(getInputRowMeta().getInteger(row, 0));\n"
+ "var number2 = Packages.org.pentaho.di.trans.steps.scriptvalues_mod."
+ "JavaScriptTest.add1ToNumberStatic(getInputRowMeta().getNumber(row, 1));\n"
+ "var string2 = Packages.org.pentaho.di.trans.steps.scriptvalues_mod."
+ "JavaScriptTest.add1ToStringStatic(getInputRowMeta().getString(row, 2));\n" ) };
svm.setJSScripts( js );
svm.setFieldname( new String[] { "long1", "number1", "string1", "long2", "number2", "string2" } );
svm.setRename( new String[] { "long1", "number1", "string1", "long2", "number2", "string2" } );
svm.setType( new int[] {
ValueMetaInterface.TYPE_INTEGER, ValueMetaInterface.TYPE_NUMBER, ValueMetaInterface.TYPE_STRING,
ValueMetaInterface.TYPE_INTEGER, ValueMetaInterface.TYPE_NUMBER, ValueMetaInterface.TYPE_STRING, } );
svm.setLength( new int[] { -1, -1, -1, -1, -1, -1, -1 } );
svm.setPrecision( new int[] { -1, -1, -1, -1, -1, -1, -1 } );
svm.setReplace( new boolean[] { false, false, false, false, false, false, } );
svm.setCompatible( false );
String javaScriptStepPid = registry.getPluginId( StepPluginType.class, svm );
StepMeta javaScriptStep = new StepMeta( javaScriptStepPid, javaScriptStepname, svm );
transMeta.addStep( javaScriptStep );
TransHopMeta hi1 = new TransHopMeta( injectorStep, javaScriptStep );
transMeta.addTransHop( hi1 );
//
// Create a dummy step
//
String dummyStepname = "dummy step";
DummyTransMeta dm = new DummyTransMeta();
String dummyPid = registry.getPluginId( StepPluginType.class, dm );
StepMeta dummyStep = new StepMeta( dummyPid, dummyStepname, dm );
transMeta.addStep( dummyStep );
TransHopMeta hi2 = new TransHopMeta( javaScriptStep, dummyStep );
transMeta.addTransHop( hi2 );
// Now execute the transformation...
Trans trans = new Trans( transMeta );
trans.prepareExecution( null );
StepInterface si;
si = trans.getStepInterface( javaScriptStepname, 0 );
RowStepCollector javaScriptRc = new RowStepCollector();
si.addRowListener( javaScriptRc );
si = trans.getStepInterface( dummyStepname, 0 );
RowStepCollector dummyRc = new RowStepCollector();
si.addRowListener( dummyRc );
RowProducer rp = trans.addRowProducer( injectorStepname, 0 );
trans.startThreads();
// add rows
List<RowMetaAndData> inputList = createData3();
Iterator<RowMetaAndData> it = inputList.iterator();
while ( it.hasNext() ) {
RowMetaAndData rm = it.next();
rp.putRow( rm.getRowMeta(), rm.getData() );
}
rp.finished();
trans.waitUntilFinished();
List<RowMetaAndData> goldenImageRows = createResultData3();
List<RowMetaAndData> resultRows1 = javaScriptRc.getRowsWritten();
checkRows( resultRows1, goldenImageRows );
List<RowMetaAndData> resultRows2 = dummyRc.getRowsRead();
checkRows( resultRows2, goldenImageRows );
}
public List<RowMetaAndData> createDateAddData() throws ParseException {
List<RowMetaAndData> list = new ArrayList<RowMetaAndData>();
//Create RowMeta
RowMetaInterface rm = new RowMeta();
rm.addValueMeta( new ValueMetaDate( "input" ) );
//Populate Row
DateFormat format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
list.add( new RowMetaAndData( rm, new Object[] { format.parse( "2014-01-01 00:00:00" ) } ) );
return list;
}
public List<RowMetaAndData> createDateAddResultData() throws ParseException {
List<RowMetaAndData> list = new ArrayList<RowMetaAndData>();
//Create RowMeta
RowMetaInterface rm = new RowMeta();
rm.addValueMeta( new ValueMetaDate( "input" ) );
rm.addValueMeta( new ValueMetaDate( "new_weekday" ) );
rm.addValueMeta( new ValueMetaDate( "new_year" ) );
rm.addValueMeta( new ValueMetaDate( "new_month" ) );
rm.addValueMeta( new ValueMetaDate( "new_week" ) );
rm.addValueMeta( new ValueMetaDate( "new_day" ) );
rm.addValueMeta( new ValueMetaDate( "new_hour" ) );
rm.addValueMeta( new ValueMetaDate( "new_minute" ) );
rm.addValueMeta( new ValueMetaDate( "new_second" ) );
DateFormat format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
Object[] r1 = new Object[] {
format.parse( "2014-01-01 00:00:00" ), //input
format.parse( "2014-01-06 00:00:00" ), //weekday
format.parse( "2019-01-01 00:00:00" ), //year
format.parse( "2014-06-01 00:00:00" ), //month
format.parse( "2014-02-05 00:00:00" ), //week
format.parse( "2014-01-06 00:00:00" ), //day
format.parse( "2014-01-01 05:00:00" ), //hour
format.parse( "2014-01-01 00:05:00" ), //minute
format.parse( "2014-01-01 00:00:05" ), //second
};
list.add( new RowMetaAndData( rm, r1 ) );
return list;
}
public void testDateAdd() throws Exception {
KettleEnvironment.init();
//
// Create a javascript step
//
String javaScriptStepName = "javascript step";
ScriptValuesMetaMod svm = new ScriptValuesMetaMod();
ScriptValuesScript[] js =
new ScriptValuesScript[] { new ScriptValuesScript(
ScriptValuesScript.TRANSFORM_SCRIPT, "script",
"var new_weekday = dateAdd( input, 'wd', 3 );\n" // PDI-13486
+ "var new_year = dateAdd( input, 'y', 5 );\n"
+ "var new_month = dateAdd( input, 'm', 5 );\n"
+ "var new_week = dateAdd( input, 'w', 5 );\n"
+ "var new_day = dateAdd( input, 'd', 5 );\n"
+ "var new_hour = dateAdd( input, 'hh', 5 );\n"
+ "var new_minute = dateAdd( input, 'mi', 5 );\n"
+ "var new_second = dateAdd( input, 'ss', 5 );\n" )
};
svm.setJSScripts( js );
svm.setFieldname( new String[] {
"new_weekday", "new_year", "new_month", "new_week", "new_day", "new_hour", "new_minute", "new_second" } );
svm.setType( new int[] {
ValueMetaInterface.TYPE_DATE, ValueMetaInterface.TYPE_DATE, ValueMetaInterface.TYPE_DATE,
ValueMetaInterface.TYPE_DATE, ValueMetaInterface.TYPE_DATE, ValueMetaInterface.TYPE_DATE,
ValueMetaInterface.TYPE_DATE, ValueMetaInterface.TYPE_DATE } );
svm.setRename( new String[] { null, null, null, null, null, null, null, null } );
svm.setLength( new int[] { -1, -1, -1, -1, -1, -1, -1, -1 } );
svm.setPrecision( new int[] { -1, -1, -1, -1, -1, -1, -1, -1 } );
svm.setReplace( new boolean[] { false, false, false, false, false, false, false, false } );
svm.setCompatible( false );
TransMeta transMeta = TransTestFactory.generateTestTransformation( new Variables(), svm, javaScriptStepName );
List<RowMetaAndData> result =
TransTestFactory.executeTestTransformation(
transMeta, TransTestFactory.INJECTOR_STEPNAME, javaScriptStepName, TransTestFactory.DUMMY_STEPNAME,
createDateAddData() );
checkRows( result, createDateAddResultData() );
}
}