/*
* 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) 2006 - 2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.reporting.engine.classic.core.bugs;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.pentaho.reporting.engine.classic.core.ClassicEngineBoot;
import org.pentaho.reporting.engine.classic.core.DefaultReportEnvironment;
import org.pentaho.reporting.engine.classic.core.MasterReport;
import org.pentaho.reporting.engine.classic.core.ParameterMapping;
import org.pentaho.reporting.engine.classic.core.SubReport;
import org.pentaho.reporting.engine.classic.core.TableDataFactory;
import org.pentaho.reporting.engine.classic.core.function.AbstractExpression;
import org.pentaho.reporting.engine.classic.core.parameters.DefaultParameterDefinition;
import org.pentaho.reporting.engine.classic.core.parameters.PlainParameter;
import org.pentaho.reporting.engine.classic.core.testsupport.DebugReportRunner;
import org.pentaho.reporting.engine.classic.core.util.TypedTableModel;
import org.pentaho.reporting.libraries.base.config.Configuration;
import org.pentaho.reporting.libraries.base.util.ObjectUtilities;
public class Prd4922IT {
@Before
public void setUp() throws Exception {
ClassicEngineBoot.getInstance().start();
}
private static class TestEnv extends DefaultReportEnvironment {
private TestEnv( final Configuration configuration ) {
super( configuration );
}
public Object getEnvironmentProperty( final String key ) {
if ( "test-column".equals( key ) ) {
return "environment";
}
return super.getEnvironmentProperty( key );
}
}
private TableDataFactory create() {
TypedTableModel model = new TypedTableModel();
model.addColumn( "test-column", String.class );
model.addRow( "table" );
return new TableDataFactory( "query", model );
}
@Test
public void testEvaluationOrderEnvBeforeParameter() {
MasterReport report = new MasterReport();
report.setReportEnvironment( new TestEnv( report.getConfiguration() ) );
DefaultParameterDefinition mdef = new DefaultParameterDefinition();
mdef.addParameterDefinition( new PlainParameter( "test-column", String.class ) );
report.setParameterDefinition( mdef );
report.getParameterValues().put( "test-column", "parameter" );
report.addExpression( new ValidateValueExpression( "parameter" ) );
DebugReportRunner.execGraphics2D( report );
}
@Test
public void testEvaluationOrderParameterBeforeTable() {
MasterReport report = new MasterReport();
DefaultParameterDefinition mdef = new DefaultParameterDefinition();
mdef.addParameterDefinition( new PlainParameter( "test-column", String.class ) );
report.setParameterDefinition( mdef );
report.getParameterValues().put( "test-column", "parameter" );
report.setDataFactory( create() );
report.setQuery( "query" );
report.addExpression( new ValidateValueExpression( "table" ) );
DebugReportRunner.execGraphics2D( report );
}
private static class SingleValueExpression extends AbstractExpression {
private String value;
private SingleValueExpression( String value ) {
setName( "test-column" );
this.value = value;
}
public Object getValue() {
return value;
}
}
@Test
public void testEvaluationOrderTableBeforeExpression() {
MasterReport report = new MasterReport();
report.setDataFactory( create() );
report.setQuery( "query" );
report.addExpression( new SingleValueExpression( "expression" ) );
report.addExpression( new ValidateValueExpression( "expression" ) );
DebugReportRunner.execGraphics2D( report );
}
public SubReport createSubReport() {
SubReport report = new SubReport();
report.addExpression( new SingleValueExpression( "subreport" ) );
report.setInputMappings( new ParameterMapping[] { new ParameterMapping( "test-column", "test-column" ) } );
report.setExportMappings( new ParameterMapping[] { new ParameterMapping( "test-column", "test-column" ) } );
return report;
}
// ignored test for now, fails to see correct value. But as we all know, export parameters are broken.
public void testEvaluationOrderExpressionBeforeSubReportImport() {
MasterReport report = new MasterReport();
report.addExpression( new SingleValueExpression( "expression" ) );
report.getReportHeader().addSubReport( createSubReport() );
Object[] result = new Object[1];
report.addExpression( new ValidateLazyValueExpression( "subreport", result ) );
DebugReportRunner.execGraphics2D( report );
Assert.assertEquals( Boolean.TRUE, result[0] );
}
private static class ValidateValueExpression extends AbstractExpression {
private String expected;
private ValidateValueExpression( String expected ) {
this.expected = expected;
setName( "validate" );
}
public Object getValue() {
Assert.assertEquals( expected, getDataRow().get( "test-column" ) );
return true;
}
}
private static class ValidateLazyValueExpression extends AbstractExpression {
private String expected;
private Object[] result;
private ValidateLazyValueExpression( String expected, Object[] result ) {
this.expected = expected;
this.result = result;
setName( "validate" );
}
public Object getValue() {
if ( ObjectUtilities.equal( expected, getDataRow().get( "test-column" ) ) ) {
result[0] = true;
}
return true;
}
}
}