/*! ******************************************************************************
*
* 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.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
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.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. Things tested: ltrim(), rtrim(), trim(), lpad(), rpad(), upper(),
* lower(), isNum(), str2num(), num2str().
* <p/>
* Still to do: - Use multiple arguments in str2num/num2str (tests only with 1 argument) - Defined error handling
*
* @author Sven Boden
*/
public class JavaScriptStringTest 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[] { null };
Object[] r2 = new Object[] { "" };
Object[] r3 = new Object[] { " " };
Object[] r4 = new Object[] { "small" };
Object[] r5 = new Object[] { "longer string" };
Object[] r6 = new Object[] { "spaces right " };
Object[] r7 = new Object[] { " spaces left" };
Object[] r8 = new Object[] { " spaces " };
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 ) );
list.add( new RowMetaAndData( rm, r7 ) );
list.add( new RowMetaAndData( rm, r8 ) );
return list;
}
public List<RowMetaAndData> createData2() {
List<RowMetaAndData> list = new ArrayList<RowMetaAndData>();
RowMetaInterface rm = createRowMetaInterface1();
Object[] r1 = new Object[] { null };
Object[] r2 = new Object[] { "" };
Object[] r3 = new Object[] { " " };
Object[] r4 = new Object[] { "TeSt1" };
Object[] r5 = new Object[] { "loNgeR st1ing" };
Object[] r6 = new Object[] { "SPACES RIGHT " };
Object[] r7 = new Object[] { " spacEs lEft" };
Object[] r8 = new Object[] { " spaces " };
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 ) );
list.add( new RowMetaAndData( rm, r7 ) );
list.add( new RowMetaAndData( rm, r8 ) );
return list;
}
/*
* Bug PDI-50 information: Str2num in Javascript steps fails on leading spaces. Fix was to left trim strings in
* str2num.
*/
public List<RowMetaAndData> createData3() {
List<RowMetaAndData> list = new ArrayList<RowMetaAndData>();
RowMetaInterface rm = createRowMetaInterface1();
list.add( new RowMetaAndData( rm, new Object[] { "3.5a" } ) );
list.add( new RowMetaAndData( rm, new Object[] { "3.a" } ) );
list.add( new RowMetaAndData( rm, new Object[] { "2.0" } ) );
list.add( new RowMetaAndData( rm, new Object[] { "1.12" } ) );
list.add( new RowMetaAndData( rm, new Object[] { " 5.3" } ) ); /* Data for bug JIRA PDI-50 */
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 ValueMetaString( "original" ),
new ValueMetaString( "ltrimStr" ),
new ValueMetaString( "rtrimStr" ), new ValueMetaString( "trimStr" ), };
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[] { null, "bnulle", "bnulle", "bnulle", "bnulle" };
Object[] r2 = new Object[] { null, "bnulle", "bnulle", "bnulle", "bnulle" };
Object[] r3 = new Object[] { " ", "b e", "be", "be", "be" };
Object[] r4 = new Object[] { "small", "bsmalle", "bsmalle", "bsmalle", "bsmalle" };
Object[] r5 =
new Object[] { "longer string", "blonger stringe", "blonger stringe", "blonger stringe", "blonger stringe" };
Object[] r6 =
new Object[] {
"spaces right ", "bspaces right e", "bspaces right e", "bspaces righte", "bspaces righte" };
Object[] r7 =
new Object[] { " spaces left", "b spaces lefte", "bspaces lefte", "b spaces lefte", "bspaces lefte" };
Object[] r8 = new Object[] { " spaces ", "b spaces e", "bspaces e", "b spacese", "bspacese" };
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 ) );
list.add( new RowMetaAndData( rm, r7 ) );
list.add( new RowMetaAndData( rm, r8 ) );
return list;
}
/**
* Create the meta data for the results (lpad/rpad/upper/lower).
*/
public RowMetaInterface createRowMetaInterfaceResult2() {
RowMetaInterface rm = new RowMeta();
ValueMetaInterface[] valuesMeta =
{
new ValueMetaString( "string" ), new ValueMetaString( "lpadded1" ),
new ValueMetaString( "lpadded2" ),
new ValueMetaString( "rpadded1" ),
new ValueMetaString( "rpadded2" ),
new ValueMetaString( "upperStr" ),
new ValueMetaString( "lowerStr" ), };
for ( int i = 0; i < valuesMeta.length; i++ ) {
rm.addValueMeta( valuesMeta[ i ] );
}
return rm;
}
/**
* Create the meta data for the results (isnum/num2str/str2num).
*/
public RowMetaInterface createRowMetaInterfaceResult3() {
RowMetaInterface rm = new RowMeta();
ValueMetaInterface[] valuesMeta =
{
new ValueMetaString( "string" ), new ValueMetaNumber( "numb1" ),
new ValueMetaBoolean( "bool1" ), new ValueMetaString( "str1" ), };
for ( int i = 0; i < valuesMeta.length; i++ ) {
rm.addValueMeta( valuesMeta[ i ] );
}
return rm;
}
/**
* Create result data for test case 2: lpad/rpad/upper/lower.
*/
public List<RowMetaAndData> createResultData2() {
List<RowMetaAndData> list = new ArrayList<RowMetaAndData>();
RowMetaInterface rm = createRowMetaInterfaceResult2();
Object[] r1 = new Object[] { null, "xxxxxxxxxx", " ", "xxxxxxxxxx", " ", "", "" };
Object[] r2 = new Object[] { null, "xxxxxxxxxx", " ", "xxxxxxxxxx", " ", "", "" };
Object[] r3 = new Object[] { " ", "xxxxxx ", " ", " xxxxxx", " ", " ", " " };
Object[] r4 = new Object[] { "TeSt1", "xxxxxTeSt1", " TeSt1", "TeSt1xxxxx", "TeSt1 ", "TEST1", "test1" };
Object[] r5 =
new Object[] {
"loNgeR st1ing", "loNgeR st1ing", "loNgeR st1ing", "loNgeR st1ing", "loNgeR st1ing", "LONGER ST1ING",
"longer st1ing" };
Object[] r6 =
new Object[] {
"SPACES RIGHT ", "SPACES RIGHT ", "SPACES RIGHT ", "SPACES RIGHT ", "SPACES RIGHT ",
"SPACES RIGHT ", "spaces right " };
Object[] r7 =
new Object[] {
" spacEs lEft", " spacEs lEft", " spacEs lEft", " spacEs lEft", " spacEs lEft",
" SPACES LEFT", " spaces left" };
Object[] r8 =
new Object[] {
" spaces ", " spaces ", " spaces ", " spaces ", " spaces ", " SPACES ",
" spaces " };
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 ) );
list.add( new RowMetaAndData( rm, r7 ) );
list.add( new RowMetaAndData( rm, r8 ) );
return list;
}
/**
* Create result data for test case 3: isNum, num2str, str2num.
*/
public List<RowMetaAndData> createResultData3() {
List<RowMetaAndData> list = new ArrayList<RowMetaAndData>();
RowMetaInterface rm = createRowMetaInterfaceResult3();
Object[] r1 = new Object[] { "3.5a", 3.5D, false, "3.5" };
Object[] r2 = new Object[] { "3.a", 3.0D, false, "3" };
Object[] r3 = new Object[] { "2.0", 2.0D, true, "2" };
Object[] r4 = new Object[] { "1.12", 1.12D, true, "1.12" };
Object[] r5 = new Object[] { " 5.3", 5.3D, true, "5.3" };
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 ) );
return list;
}
public RowMetaInterface createRowMetaInterface2() {
RowMetaInterface rm = new RowMeta();
ValueMetaInterface[] valuesMeta =
{
new ValueMetaString( "string" ), new ValueMetaString( "search" ),
new ValueMetaInteger( "offset1" ),
new ValueMetaInteger( "offset2" ), };
for ( int i = 0; i < valuesMeta.length; i++ ) {
rm.addValueMeta( valuesMeta[ i ] );
}
return rm;
}
public List<RowMetaAndData> createData4() {
List<RowMetaAndData> list = new ArrayList<RowMetaAndData>();
RowMetaInterface rm = createRowMetaInterface2();
Object[] r1 = new Object[] { "abcdefgh", "ef", new Long( 3 ), new Long( 10 ) };
Object[] r2 = new Object[] { "abcdefgh", "h", new Long( 0 ), new Long( 7 ) };
Object[] r3 = new Object[] { "abcdefgh", "h", new Long( 1 ), new Long( 6 ) };
Object[] r4 = new Object[] { "abcdefgh", null, new Long( 1 ), new Long( 2 ) };
Object[] r5 = new Object[] { "abcdefgh", "invalid", new Long( 1 ), new Long( 1 ) };
Object[] r6 = new Object[] { "abcdefgh", "invalidlonger", new Long( 1 ), new Long( 1 ) };
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 (indexOf).
*/
public RowMetaInterface createRowMetaInterfaceResult4() {
RowMetaInterface rm = new RowMeta();
ValueMetaInterface[] valuesMeta =
{
new ValueMetaString( "string" ), new ValueMetaString( "search" ),
new ValueMetaInteger( "offset1" ),
new ValueMetaInteger( "offset2" ), new ValueMetaInteger( "index1" ),
new ValueMetaInteger( "index2" ), new ValueMetaInteger( "index3" ), };
for ( int i = 0; i < valuesMeta.length; i++ ) {
rm.addValueMeta( valuesMeta[ i ] );
}
return rm;
}
/**
* Create result data for test case 4: indexOf.
*/
public List<RowMetaAndData> createResultData4() {
List<RowMetaAndData> list = new ArrayList<RowMetaAndData>();
RowMetaInterface rm = createRowMetaInterfaceResult4();
Object[] r1 =
new Object[] {
"abcdefgh", "ef", new Long( 3 ), new Long( 10 ), new Long( 4 ), new Long( 4 ), new Long( -1 ) };
Object[] r2 =
new Object[] { "abcdefgh", "h", new Long( 0 ), new Long( 7 ), new Long( 7 ), new Long( 7 ), new Long( 7 ) };
Object[] r3 =
new Object[] { "abcdefgh", "h", new Long( 1 ), new Long( 6 ), new Long( 7 ), new Long( 7 ), new Long( 7 ) };
Object[] r4 =
new Object[] {
"abcdefgh", null, new Long( 1 ), new Long( 2 ), new Long( -1 ), new Long( -1 ), new Long( -1 ) };
Object[] r5 =
new Object[] {
"abcdefgh", "invalid", new Long( 1 ), new Long( 1 ), new Long( -1 ), new Long( -1 ), new Long( -1 ) };
Object[] r6 =
new Object[] {
"abcdefgh", "invalidlonger", new Long( 1 ), new Long( 1 ), new Long( -1 ), new Long( -1 ),
new Long( -1 ) };
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;
}
/**
* 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 testStringsTrim() throws Exception {
KettleEnvironment.init();
//
// Create a new transformation...
//
TransMeta transMeta = new TransMeta();
transMeta.setName( "test javascript trim" );
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 original = 'b' + string.getString() + 'e';\n"
+ "var ltrimStr = 'b' + ltrim(string.getString()) + 'e';\n"
+ "var rtrimStr = 'b' + rtrim(string.getString()) + 'e';\n"
+ "var trimStr = 'b' + trim(string.getString()) + 'e';\n" ) };
svm.setJSScripts( js );
svm.setFieldname( new String[] { "original", "ltrimStr", "rtrimStr", "trimStr" } );
svm.setRename( new String[] { "", "", "", "" } );
svm.setType( new int[] {
ValueMetaInterface.TYPE_STRING, ValueMetaInterface.TYPE_STRING, ValueMetaInterface.TYPE_STRING,
ValueMetaInterface.TYPE_STRING } );
svm.setLength( new int[] { -1, -1, -1, -1 } );
svm.setPrecision( new int[] { -1, -1, -1, -1 } );
svm.setReplace( new boolean[] { false, false, false, false, } );
svm.setCompatible( true );
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: lpad(), rpad(), upper(), lower().
*/
public void testStringsPadCase() throws Exception {
KettleEnvironment.init();
//
// Create a new transformation...
//
TransMeta transMeta = new TransMeta();
transMeta.setName( "test javascript pad casing" );
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 lpadded1 = lpad(string, \"x\", 10);\n"
+ "var lpadded2 = lpad(string, \" \", 9);\n" + "var rpadded1 = rpad(string, \"x\", 10);\n"
+ "var rpadded2 = rpad(string, \" \", 9);\n" + "var upperStr = upper(string);\n"
+ "var lowerStr = lower(string);\n" ) };
svm.setJSScripts( js );
svm.setFieldname( new String[] { "lpadded1", "lpadded2", "rpadded1", "rpadded2", "upperStr", "lowerStr" } );
svm.setRename( new String[] { "", "", "", "", "", "", "" } );
svm.setType( new int[] {
ValueMetaInterface.TYPE_STRING, ValueMetaInterface.TYPE_STRING, ValueMetaInterface.TYPE_STRING,
ValueMetaInterface.TYPE_STRING, ValueMetaInterface.TYPE_STRING, ValueMetaInterface.TYPE_STRING,
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, false, } );
svm.setCompatible( true );
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 = createData2();
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 );
}
public void testStringsNum() throws Exception {
KettleEnvironment.init();
Locale.setDefault( Locale.ENGLISH );
//
// Create a javascript step
//
ScriptValuesMetaMod svm = new ScriptValuesMetaMod();
ScriptValuesScript[] js =
new ScriptValuesScript[] { new ScriptValuesScript(
ScriptValuesScript.TRANSFORM_SCRIPT, "script",
"var numb1 = str2num(trim(string.getString()), \"#.#\", \"en\");\n"
+ "var bool1 = isNum(string.getString());\n" + "var str1 = num2str(numb1);\n" ) };
svm.setJSScripts( js );
svm.setFieldname( new String[] { "numb1", "bool1", "str1" } );
svm.setRename( new String[] { "", "", "" } );
svm.setType( new int[] {
ValueMetaInterface.TYPE_NUMBER, ValueMetaInterface.TYPE_BOOLEAN, ValueMetaInterface.TYPE_STRING } );
svm.setLength( new int[] { -1, -1, -1 } );
svm.setPrecision( new int[] { -1, -1, -1 } );
svm.setReplace( new boolean[] { false, false, false, } );
svm.setCompatible( true );
// Generate a test transformation with an injector and a dummy:
//
String testStepname = "javascript";
TransMeta transMeta = TransTestFactory.generateTestTransformation( new Variables(), svm, testStepname );
// Now execute the transformation and get the result from the dummy step.
//
List<RowMetaAndData> result =
TransTestFactory.executeTestTransformation(
transMeta, TransTestFactory.INJECTOR_STEPNAME, testStepname, TransTestFactory.DUMMY_STEPNAME,
createData3() );
// Verify that this is what we expected...
//
checkRows( result, createResultData3() );
}
/**
* Test case for javascript functionality: indexOf().
*/
public void testIndexOf() 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 index1 = indexOf(string.getString(), search.getString());\n"
+ "var index2 = indexOf(string.getString(), search.getString(), offset1.getInteger());\n"
+ "var index3 = indexOf(string.getString(), search.getString(), offset2.getInteger());\n" ) };
svm.setJSScripts( js );
svm.setFieldname( new String[] { "index1", "index2", "index3" } );
svm.setRename( new String[] { "", "", "" } );
svm.setType( new int[] {
ValueMetaInterface.TYPE_INTEGER, ValueMetaInterface.TYPE_INTEGER, ValueMetaInterface.TYPE_INTEGER } );
svm.setLength( new int[] { -1, -1, -1 } );
svm.setPrecision( new int[] { -1, -1, -1 } );
svm.setReplace( new boolean[] { false, false, false, } );
svm.setCompatible( true );
// Generate a test transformation with an injector and a dummy:
//
TransMeta transMeta = TransTestFactory.generateTestTransformation( new Variables(), svm, javaScriptStepname );
// Now execute the transformation and get the result from the dummy step.
//
List<RowMetaAndData> result =
TransTestFactory.executeTestTransformation(
transMeta, TransTestFactory.INJECTOR_STEPNAME, javaScriptStepname, TransTestFactory.DUMMY_STEPNAME,
createData4() );
// Verify that this is what we expected...
//
checkRows( result, createResultData4() );
}
}