/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2000 - 2015 Pentaho Corporation, Simba Management Limited and Contributors... All rights reserved.
*/
package org.pentaho.reporting.engine.classic.core.modules.gui.base.parameters;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import java.awt.Color;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import javax.swing.text.JTextComponent;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.pentaho.reporting.engine.classic.core.util.beans.BeanException;
@SuppressWarnings( "rawtypes" )
public class TextComponentEditHandlerTest {
@Test
public void testCreateFormat() {
String formatString = null;
Locale locale = new Locale( "test_test" );
TimeZone timeZone = TimeZone.getDefault();
Class parameterType = null;
Format format = TextComponentEditHandler.createFormat( formatString, locale, timeZone, parameterType );
assertThat( format, is( nullValue() ) );
formatString = "0.0.0";
format = TextComponentEditHandler.createFormat( formatString, locale, timeZone, parameterType );
assertThat( format, is( nullValue() ) );
parameterType = Number.class;
format = TextComponentEditHandler.createFormat( formatString, locale, timeZone, parameterType );
assertThat( format, is( nullValue() ) );
formatString = "#,###,##0.00";
format = TextComponentEditHandler.createFormat( formatString, locale, timeZone, parameterType );
assertThat( format, is( instanceOf( DecimalFormat.class ) ) );
parameterType = Date.class;
formatString = "o";
format = TextComponentEditHandler.createFormat( formatString, locale, timeZone, parameterType );
assertThat( format, is( nullValue() ) );
formatString = "dd.MM.yyyy";
format = TextComponentEditHandler.createFormat( formatString, locale, timeZone, parameterType );
assertThat( format, is( instanceOf( SimpleDateFormat.class ) ) );
}
@Test
public void testCreateTimeZone() {
TimeZone defaultTimeZone = mock( TimeZone.class );
TimeZone timezone = TextComponentEditHandler.createTimeZone( null, defaultTimeZone );
assertThat( timezone, is( equalTo( defaultTimeZone ) ) );
timezone = TextComponentEditHandler.createTimeZone( "server", defaultTimeZone );
assertThat( timezone, is( equalTo( defaultTimeZone ) ) );
timezone = TextComponentEditHandler.createTimeZone( "client", defaultTimeZone );
assertThat( timezone, is( equalTo( defaultTimeZone ) ) );
timezone = TextComponentEditHandler.createTimeZone( "utc", defaultTimeZone );
assertThat( timezone, is( not( equalTo( defaultTimeZone ) ) ) );
assertThat( timezone.getID(), is( equalTo( "UTC" ) ) );
timezone = TextComponentEditHandler.createTimeZone( "GMT", defaultTimeZone );
assertThat( timezone, is( not( equalTo( defaultTimeZone ) ) ) );
assertThat( timezone.getID(), is( equalTo( "GMT" ) ) );
}
@Test
public void testRun() throws BeanException {
String value = "test val";
Class type = String.class;
String keyName = "key";
JTextComponent textComponent = mock( JTextComponent.class );
ParameterUpdateContext updateContext = mock( ParameterUpdateContext.class );
// Format formatter = new DecimalFormat( "#,###,##0.00" );
doReturn( value ).when( textComponent ).getText();
doReturn( Color.YELLOW ).when( textComponent ).getBackground();
TextComponentEditHandler handler =
spy( new TextComponentEditHandler( type, keyName, textComponent, updateContext, null ) );
handler.run();
verify( textComponent ).setBackground( Color.YELLOW );
verify( updateContext ).setParameterValue( keyName, value, false );
doThrow( BeanException.class ).when( handler ).convertValue( value );
handler.run();
verify( textComponent ).setBackground( Color.RED );
}
@Test( expected = BeanException.class)
public void testConvertValueWithFormatter() throws BeanException {
Class type = String.class;
String keyName = "key";
JTextComponent textComponent = mock( JTextComponent.class );
ParameterUpdateContext updateContext = mock( ParameterUpdateContext.class );
Format formatter = new DecimalFormat( "#,###,##0.00" );
TextComponentEditHandler handler =
new TextComponentEditHandler( type, keyName, textComponent, updateContext, formatter );
Object result = handler.convertValue( null );
assertThat( result, is( nullValue() ) );
result = handler.convertValue( "512,000.897" );
assertThat( (String) result, is( equalTo( "512000.897" ) ) );
handler.convertValue( "error" );
}
@Test
public void testConvertStringValueWithoutFormatter() throws BeanException {
Class type = String.class;
String keyName = "key";
JTextComponent textComponent = mock( JTextComponent.class );
ParameterUpdateContext updateContext = mock( ParameterUpdateContext.class );
TextComponentEditHandler handler = new TextComponentEditHandler( type, keyName, textComponent, updateContext, null );
Object result = handler.convertValue( "test val" );
assertThat( (String) result, is( equalTo( "test val" ) ) );
}
@Test
public void testConvertNumberValueWithoutFormatter() throws BeanException {
Class type = Number.class;
String keyName = "key";
JTextComponent textComponent = mock( JTextComponent.class );
ParameterUpdateContext updateContext = mock( ParameterUpdateContext.class );
TextComponentEditHandler handler = new TextComponentEditHandler( type, keyName, textComponent, updateContext, null );
Object result = handler.convertValue( "123" );
assertThat( result, is( instanceOf( BigDecimal.class ) ) );
}
}