/*! ****************************************************************************** * * 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.core.util; import static org.junit.Assert.*; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.junit.Before; import org.junit.Test; /** * Test class for StringEvaluator functionality. * * @author Alexander Buloichik */ public class StringEvaluatorTest { private StringEvaluator evaluator; @Before public void setUp() { evaluator = new StringEvaluator(); } ///////////////////////////////////// // common //////////////////////////////////// @Test public void testEmpty() { evaluator.evaluateString( "" ); assertTrue( evaluator.getStringEvaluationResults().isEmpty() ); evaluator.evaluateString( " " ); assertTrue( evaluator.getStringEvaluationResults().isEmpty() ); } @Test public void testGetValues_WithoutDublicate() { List<String> strings = Arrays.asList( "name1", "name2" ); for ( String string : strings ) { evaluator.evaluateString( string ); } assertEquals( strings.size(), evaluator.getValues().size() ); List<String> actualStrings = new ArrayList<String>( evaluator.getValues() ); Collections.sort( strings ); Collections.sort( actualStrings ); Iterator<String> exIterator = strings.iterator(); Iterator<String> iterator = actualStrings.iterator(); while ( iterator.hasNext() ) { assertEquals( exIterator.next(), iterator.next() ); } } @Test public void testGetValues_Duplicate() { String dublicatedString = "name1"; List<String> strings = Arrays.asList( dublicatedString ); for ( String string : strings ) { evaluator.evaluateString( string ); } evaluator.evaluateString( dublicatedString ); assertEquals( strings.size(), evaluator.getValues().size() ); Iterator<String> exIterator = strings.iterator(); Iterator<String> iterator = evaluator.getValues().iterator(); while ( iterator.hasNext() ) { assertEquals( exIterator.next(), iterator.next() ); } } @Test public void testGetCount() { List<String> strings = Arrays.asList( "02/29/2000", "03/29/2000" ); for ( String string : strings ) { evaluator.evaluateString( string ); } assertEquals( strings.size(), evaluator.getCount() ); } @Test public void testGetAdvicedResult_NullInput() { String expectedNull = ""; List<String> strings = Arrays.asList( expectedNull ); for ( String string : strings ) { evaluator.evaluateString( string ); } StringEvaluationResult result = evaluator.getAdvicedResult(); assertEquals( 1, result.getNrNull() ); } @Test public void testGetAdvicedResult_MinMaxInput() { String expectedMin = "500"; String expectedMax = "1000"; List<String> strings = Arrays.asList( expectedMax, expectedMin ); for ( String string : strings ) { evaluator.evaluateString( string ); } StringEvaluationResult result = evaluator.getAdvicedResult(); assertEquals( Long.parseLong( expectedMax ), result.getMax() ); assertEquals( Long.parseLong( expectedMin ), result.getMin() ); assertEquals( expectedMax.length(), evaluator.getMaxLength() ); } ///////////////////////////////////// // mixed types //////////////////////////////////// @Test public void testIntegerWithNumber() { List<String> strings = Arrays.asList( "1", "1.1" ); String mask = "#.#"; for ( String string : strings ) { evaluator.evaluateString( string ); } assertFalse( evaluator.getStringEvaluationResults().isEmpty() ); assertTrue( evaluator.getAdvicedResult().getConversionMeta().isNumber() ); assertTrue( mask.equals( evaluator.getAdvicedResult().getConversionMeta().getConversionMask() ) ); } ///////////////////////////////////// // number types //////////////////////////////////// @Test public void testNumberWithPoint() { testNumber( "#.#", "1.1" ); } @Test public void testNumberWithGroupAndPoint() { testNumber( "#,###,###.#", "1,111,111.1" ); } @Test public void testNumbers() { testNumber( "#,###,###.#", "1,111,111.1", "1,111" ); } @Test public void testStringAsNumber() { evaluator.evaluateString( "1" ); evaluator.evaluateString( "1.111111111" ); evaluator.evaluateString( "1,111" ); evaluator.evaluateString( "1,111.11111111" ); evaluator.evaluateString( "1,111,111.1111" ); evaluator.evaluateString( "1,111.111.1111" ); evaluator.evaluateString( "1,111,111.111.111" ); assertTrue( evaluator.getStringEvaluationResults().isEmpty() ); assertTrue( evaluator.getAdvicedResult().getConversionMeta().isString() ); } private void testNumber( String mask, String... strings ) { for ( String string : strings ) { evaluator.evaluateString( string ); } assertFalse( evaluator.getStringEvaluationResults().isEmpty() ); assertTrue( evaluator.getAdvicedResult().getConversionMeta().isNumber() ); assertTrue( mask.equals( evaluator.getAdvicedResult().getConversionMeta().getConversionMask() ) ); } ///////////////////////////////////// // integer types //////////////////////////////////// @Test public void testInteger() { testInteger( "#", "1" ); } @Test public void testIntegerWithGroup() { testInteger( "#", "1111" ); } private void testInteger( String mask, String... strings ) { for ( String string : strings ) { evaluator.evaluateString( string ); } assertFalse( evaluator.getStringEvaluationResults().isEmpty() ); assertTrue( evaluator.getAdvicedResult().getConversionMeta().isInteger() ); assertTrue( mask.equals( evaluator.getAdvicedResult().getConversionMeta().getConversionMask() ) ); } ///////////////////////////////////// // currency types //////////////////////////////////// @Test public void testCurrency() { testCurrencyBasic( "+123", "-123", "(123)" ); } private void testCurrencyBasic( String... strings ) { for ( String string : strings ) { evaluator.evaluateString( string ); } assertTrue( evaluator.getStringEvaluationResults().isEmpty() ); assertTrue( evaluator.getAdvicedResult().getConversionMeta().isString() ); } ///////////////////////////////////// // boolean types //////////////////////////////////// @Test public void testBooleanY() { testBoolean( "Y" ); } @Test public void testBooleanN() { testBoolean( "N" ); } @Test public void testBooleanTrue() { testBoolean( "True" ); } @Test public void testBooleanFalse() { testBoolean( "False" ); } private void testBoolean( String... strings ) { for ( String string : strings ) { evaluator.evaluateString( string ); } assertFalse( evaluator.getStringEvaluationResults().isEmpty() ); assertTrue( evaluator.getAdvicedResult().getConversionMeta().isBoolean() ); } ///////////////////////////////////// // Date types, use default USA format //////////////////////////////////// @Test public void testDate() { testDefaultDateFormat( "MM/dd/yyyy", "10/10/2000" ); } @Test public void testDateArray() { testDefaultDateFormat( "MM/dd/yyyy", "10/10/2000", "11/10/2000", "12/10/2000" ); } @Test public void testTimeStamp() { testDefaultDateFormat( "MM/dd/yyyy HH:mm:ss", "10/10/2000 00:00:00" ); } @Test public void testTimeStampSeconds() { testDefaultDateFormat( "MM/dd/yyyy HH:mm:ss", "10/10/2000 00:00:00" ); } private void testDefaultDateFormat( String maskEn, String... strings ) { for ( String string : strings ) { evaluator.evaluateString( string ); } assertFalse( evaluator.getStringEvaluationResults().isEmpty() ); assertTrue( evaluator.getAdvicedResult().getConversionMeta().isDate() ); String actualMask = evaluator.getAdvicedResult().getConversionMeta().getConversionMask(); assertTrue( maskEn.equals( actualMask ) ); } @Test public void testDate2YearDigits() { testDefaultDateFormat( "MM/dd/yy", "10/10/20", "11/10/20", "12/10/20" ); } @Test public void testCustomDateFormat() { String sampleFormat = "MM/dd/yyyy HH:mm:ss"; ArrayList<String> dateFormats = new ArrayList<String>(); dateFormats.add( sampleFormat ); StringEvaluator evaluator = new StringEvaluator( true, new ArrayList<String>(), dateFormats ); evaluator.evaluateString( "02/29/2000 00:00:00" ); assertFalse( evaluator.getStringEvaluationResults().isEmpty() ); assertTrue( evaluator.getAdvicedResult().getConversionMeta().isDate() ); assertTrue( sampleFormat.equals( evaluator.getAdvicedResult().getConversionMeta().getConversionMask() ) ); } @Test public void testAdviceedOneDateFormat() { String sampleLongFormat = "MM/dd/yyyy HH:mm:ss"; String sampleShortFormat = "MM/dd/yy HH:mm:ss"; ArrayList<String> dateFormats = new ArrayList<String>(); dateFormats.add( sampleLongFormat ); dateFormats.add( sampleShortFormat ); StringEvaluator evaluator = new StringEvaluator( true, new ArrayList<String>(), dateFormats ); evaluator.evaluateString( "02/29/20 00:00:00" ); assertFalse( evaluator.getStringEvaluationResults().isEmpty() ); assertTrue( evaluator.getAdvicedResult().getConversionMeta().isDate() ); assertFalse( sampleLongFormat.equals( evaluator.getAdvicedResult().getConversionMeta().getConversionMask() ) ); //should advice short format assertTrue( sampleShortFormat.equals( evaluator.getAdvicedResult().getConversionMeta().getConversionMask() ) ); } }