/*! ******************************************************************************
*
* 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.univariatestats;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.UUID;
import org.apache.commons.io.IOUtils;
import org.json.simple.parser.ParseException;
import org.junit.Test;
import org.pentaho.di.core.util.Utils;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.exception.KettleXMLException;
import org.pentaho.di.core.xml.XMLHandler;
import org.pentaho.di.repository.Repository;
import org.pentaho.di.repository.StringObjectId;
import org.pentaho.di.trans.steps.loadsave.MemoryRepository;
import org.pentaho.test.util.GetterSetterTester;
import org.pentaho.test.util.ObjectTester;
import org.pentaho.test.util.ObjectTesterBuilder;
import org.pentaho.test.util.ObjectValidator;
public class UnivariateStatsMetaFunctionTest {
@Test
public void testValuesConstructor() {
UnivariateStatsMetaFunction function =
new UnivariateStatsMetaFunction( null, false, false, false, false, false, false, 0, false );
assertNull( function.getSourceFieldName() );
assertFalse( function.getCalcN() );
assertFalse( function.getCalcMean() );
assertFalse( function.getCalcStdDev() );
assertFalse( function.getCalcMin() );
assertFalse( function.getCalcMax() );
assertFalse( function.getCalcMedian() );
assertEquals( 0, function.getCalcPercentile(), 0 );
assertFalse( function.getInterpolatePercentile() );
function = new UnivariateStatsMetaFunction( "test", true, true, true, true, true, true, 0.5, true );
assertEquals( "test", function.getSourceFieldName() );
assertTrue( function.getCalcN() );
assertTrue( function.getCalcMean() );
assertTrue( function.getCalcStdDev() );
assertTrue( function.getCalcMin() );
assertTrue( function.getCalcMax() );
assertTrue( function.getCalcMedian() );
assertEquals( 0.5, function.getCalcPercentile(), 0 );
assertTrue( function.getInterpolatePercentile() );
}
@Test
public void testNodeConstructor() throws IOException, KettleXMLException {
String functionXml =
IOUtils.toString( UnivariateStatsMetaTest.class.getClassLoader().getResourceAsStream(
"org/pentaho/di/trans/steps/univariatestats/trueValuesUnivariateStatsMetaFunctionNode.xml" ) );
UnivariateStatsMetaFunction function =
new UnivariateStatsMetaFunction( XMLHandler.loadXMLString( functionXml ).getFirstChild() );
assertEquals( "a", function.getSourceFieldName() );
assertTrue( function.getCalcN() );
assertTrue( function.getCalcMean() );
assertTrue( function.getCalcStdDev() );
assertTrue( function.getCalcMin() );
assertTrue( function.getCalcMax() );
assertTrue( function.getCalcMedian() );
assertEquals( 0.5, function.getCalcPercentile(), 0 );
assertTrue( function.getInterpolatePercentile() );
functionXml =
IOUtils.toString( UnivariateStatsMetaTest.class.getClassLoader().getResourceAsStream(
"org/pentaho/di/trans/steps/univariatestats/falseValuesUnivariateStatsMetaFunctionNode.xml" ) );
function = new UnivariateStatsMetaFunction( XMLHandler.loadXMLString( functionXml ).getFirstChild() );
assertTrue( Utils.isEmpty( function.getSourceFieldName() ) );
assertFalse( function.getCalcN() );
assertFalse( function.getCalcMean() );
assertFalse( function.getCalcStdDev() );
assertFalse( function.getCalcMin() );
assertFalse( function.getCalcMax() );
assertFalse( function.getCalcMedian() );
assertEquals( -1.0, function.getCalcPercentile(), 0 );
assertFalse( function.getInterpolatePercentile() );
}
@Test
public void testRepoConstructor() throws ParseException, KettleException, IOException {
String jsString =
IOUtils.toString( UnivariateStatsMetaTest.class.getClassLoader().getResourceAsStream(
"org/pentaho/di/trans/steps/univariatestats/trueValuesUnivariateStatsMetaFunctionNode.json" ) );
Repository repo = new MemoryRepository( jsString );
UnivariateStatsMetaFunction function = new UnivariateStatsMetaFunction( repo, new StringObjectId( "test" ), 0 );
assertEquals( "test", function.getSourceFieldName() );
assertTrue( function.getCalcN() );
assertTrue( function.getCalcMean() );
assertTrue( function.getCalcStdDev() );
assertTrue( function.getCalcMin() );
assertTrue( function.getCalcMax() );
assertTrue( function.getCalcMedian() );
assertEquals( 0.5, function.getCalcPercentile(), 0 );
assertTrue( function.getInterpolatePercentile() );
jsString =
IOUtils.toString( UnivariateStatsMetaTest.class.getClassLoader().getResourceAsStream(
"org/pentaho/di/trans/steps/univariatestats/falseValuesUnivariateStatsMetaFunctionNode.json" ) );
repo = new MemoryRepository( jsString );
function = new UnivariateStatsMetaFunction( repo, new StringObjectId( "test" ), 0 );
assertTrue( Utils.isEmpty( function.getSourceFieldName() ) );
assertFalse( function.getCalcN() );
assertFalse( function.getCalcMean() );
assertFalse( function.getCalcStdDev() );
assertFalse( function.getCalcMin() );
assertFalse( function.getCalcMax() );
assertFalse( function.getCalcMedian() );
assertEquals( -1.0, function.getCalcPercentile(), 0 );
assertFalse( function.getInterpolatePercentile() );
}
@Test
public void testEquals() throws IOException, KettleXMLException {
String functionXml =
IOUtils.toString( UnivariateStatsMetaTest.class.getClassLoader().getResourceAsStream(
"org/pentaho/di/trans/steps/univariatestats/trueValuesUnivariateStatsMetaFunctionNode.xml" ) );
UnivariateStatsMetaFunction function =
new UnivariateStatsMetaFunction( XMLHandler.loadXMLString( functionXml ).getFirstChild() );
UnivariateStatsMetaFunction function2 =
new UnivariateStatsMetaFunction( XMLHandler.loadXMLString( functionXml ).getFirstChild() );
assertEquals( function, function2 );
functionXml =
IOUtils.toString( UnivariateStatsMetaTest.class.getClassLoader().getResourceAsStream(
"org/pentaho/di/trans/steps/univariatestats/falseValuesUnivariateStatsMetaFunctionNode.xml" ) );
function = new UnivariateStatsMetaFunction( XMLHandler.loadXMLString( functionXml ).getFirstChild() );
assertFalse( function.equals( function2 ) );
function2 = new UnivariateStatsMetaFunction( XMLHandler.loadXMLString( functionXml ).getFirstChild() );
assertEquals( function, function2 );
}
@Test
public void testClone() {
UnivariateStatsMetaFunction function =
new UnivariateStatsMetaFunction( null, false, false, false, false, false, false, 0, false );
assertEquals( UnivariateStatsMetaFunction.class, function.clone().getClass() );
}
@Test
public void testGettersAndSetters() {
GetterSetterTester<UnivariateStatsMetaFunction> getterSetterTest =
new GetterSetterTester<UnivariateStatsMetaFunction>( UnivariateStatsMetaFunction.class );
ObjectTester<Boolean> primitiveBooleanTester =
new ObjectTesterBuilder<Boolean>().addObject( true ).addObject( false ).build();
getterSetterTest.addObjectTester( "sourceFieldName", new ObjectTesterBuilder<String>().addObject( null ).addObject(
UUID.randomUUID().toString() ).build() );
getterSetterTest.addObjectTester( "calcN", primitiveBooleanTester );
getterSetterTest.addObjectTester( "calcMean", primitiveBooleanTester );
getterSetterTest.addObjectTester( "calcStdDev", primitiveBooleanTester );
getterSetterTest.addObjectTester( "calcMin", primitiveBooleanTester );
getterSetterTest.addObjectTester( "calcMax", primitiveBooleanTester );
getterSetterTest.addObjectTester( "calcMedian", primitiveBooleanTester );
getterSetterTest.addObjectTester( "interpolatePercentile", primitiveBooleanTester );
getterSetterTest.addObjectTester( "calcPercentile", new ObjectTesterBuilder<Double>().addObject( -100.0 )
.addObject( 0.0 ).addObject( 55.5 ).addObject( 100.0 ).setValidator( new ObjectValidator<Double>() {
@Override
public void validate( Double expected, Object actual ) {
assertEquals( Double.class, actual.getClass() );
double actualValue = ( (Double) actual ).doubleValue();
if ( 0 <= expected && expected <= 100 ) {
assertEquals( expected / 100.0, actualValue, 0 );
} else {
assertEquals( -1.0, actualValue, 0 );
}
}
} ).build() );
getterSetterTest.test( new UnivariateStatsMetaFunction( null, false, false, false, false, false, false, 0, false ) );
}
}