/*!
* 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) 2005-2015 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.reporting.engine.classic.extensions.modules.sbarcodes;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
import java.util.ArrayList;
import java.util.List;
import net.sourceforge.barbecue.Barcode;
import net.sourceforge.barbecue.linear.codabar.CodabarBarcode;
import net.sourceforge.barbecue.linear.code128.Code128Barcode;
import net.sourceforge.barbecue.linear.code39.Code39Barcode;
import net.sourceforge.barbecue.linear.ean.BooklandBarcode;
import net.sourceforge.barbecue.linear.ean.EAN13Barcode;
import net.sourceforge.barbecue.linear.ean.UCCEAN128Barcode;
import net.sourceforge.barbecue.linear.postnet.PostNetBarcode;
import net.sourceforge.barbecue.linear.twoOfFive.Int2of5Barcode;
import net.sourceforge.barbecue.linear.twoOfFive.Std2of5Barcode;
import net.sourceforge.barbecue.linear.upc.UPCABarcode;
import net.sourceforge.barbecue.twod.pdf417.PDF417Barcode;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
import org.krysalis.barcode4j.BarcodeGenerator;
import org.krysalis.barcode4j.HumanReadablePlacement;
import org.krysalis.barcode4j.impl.ConfigurableBarcodeGenerator;
import org.krysalis.barcode4j.impl.code128.EAN128;
import org.krysalis.barcode4j.impl.datamatrix.DataMatrix;
import org.krysalis.barcode4j.impl.fourstate.RoyalMailCBC;
import org.krysalis.barcode4j.impl.fourstate.USPSIntelligentMail;
import org.krysalis.barcode4j.impl.upcean.EAN8;
import org.krysalis.barcode4j.impl.upcean.UPCE;
import org.krysalis.barcode4j.tools.UnitConv;
public class SimpleBarcodesUtilityTest {
private static final double BAR_HEIGHT = 500.0;
private static final String INCORRECT_DATA = "123";
private static final String INCORRECT_TYPE = "incorrect_type";
private final List<BarcodeTypeInfo> barcodeTypes = new ArrayList<SimpleBarcodesUtilityTest.BarcodeTypeInfo>() {
private static final long serialVersionUID = 2821772403284540156L;
{
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_CODE39, Code39Barcode.class ) );
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_CODE39EXT, Code39Barcode.class ) );
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_CODABAR, CodabarBarcode.class ) );
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_EAN13, EAN13Barcode.class ) );
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_UPCA, UPCABarcode.class ) );
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_ISBN, BooklandBarcode.class ) );
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_CODE128, Code128Barcode.class ) );
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_CODE128A, Code128Barcode.class ) );
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_CODE128B, Code128Barcode.class ) );
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_CODE128C, Code128Barcode.class ) );
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_UCCEAN128, UCCEAN128Barcode.class, false ) );
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_2OF5, Std2of5Barcode.class ) );
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_2OF5INT, Int2of5Barcode.class ) );
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_POSTNET, PostNetBarcode.class ) );
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_PDF417, PDF417Barcode.class ) );
}
};
private final List<BarcodeTypeInfo> barcode4JTypes = new ArrayList<SimpleBarcodesUtilityTest.BarcodeTypeInfo>() {
private static final long serialVersionUID = -2161436323390551096L;
{
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_DATAMATRIX, DataMatrix.class, false ) );
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_EAN8, EAN8.class ) );
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_EAN128, EAN128.class ) );
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_UPCE, UPCE.class ) );
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_ROYALMAIL, RoyalMailCBC.class ) );
add( new BarcodeTypeInfo( SimpleBarcodesUtility.BARCODE_USPSINTELLIGENTMAIL, USPSIntelligentMail.class ) );
}
};
@Test( expected = IllegalArgumentException.class )
public void testCreateBarcodeWithoutData() {
SimpleBarcodesUtility.createBarcode( null, null, false );
}
@Test( expected = IllegalArgumentException.class )
public void testCreateBarcodeWithoutType() {
SimpleBarcodesUtility.createBarcode( INCORRECT_DATA, null, false );
}
@Test
public void testCreateBarcode() {
Barcode barcode = SimpleBarcodesUtility.createBarcode( INCORRECT_DATA, INCORRECT_TYPE, false );
assertThat( barcode, is( nullValue() ) );
for ( BarcodeTypeInfo info : barcodeTypes ) {
barcode = SimpleBarcodesUtility.createBarcode( info.getValue(), info.getType(), false );
assertThat( barcode, is( instanceOf( info.getClazz() ) ) );
if ( info.isCheckIncorrect() ) {
barcode = SimpleBarcodesUtility.createBarcode( StringUtils.EMPTY, info.getType(), false );
assertThat( barcode, is( nullValue() ) );
}
}
}
@Test
public void testCreateBarcode4J() {
BarcodeGenerator barcodeGen = SimpleBarcodesUtility.createBarcode4J( INCORRECT_TYPE, true, false, BAR_HEIGHT );
assertThat( barcodeGen, is( nullValue() ) );
for ( BarcodeTypeInfo info : barcode4JTypes ) {
barcodeGen = SimpleBarcodesUtility.createBarcode4J( info.getType(), true, true, null );
assertThat( barcodeGen, is( instanceOf( info.getClazz() ) ) );
if ( info.isCheckIncorrect() ) {
barcodeGen = SimpleBarcodesUtility.createBarcode4J( info.getType(), false, true, BAR_HEIGHT );
assertThat( barcodeGen, is( instanceOf( info.getClazz() ) ) );
assertThat( barcodeGen, is( instanceOf( ConfigurableBarcodeGenerator.class ) ) );
ConfigurableBarcodeGenerator commonGen = (ConfigurableBarcodeGenerator) barcodeGen;
assertThat( commonGen.getBean(), is( notNullValue() ) );
assertThat( commonGen.getBean().getMsgPosition(), is( equalTo( HumanReadablePlacement.HRP_NONE ) ) );
double expectedHeight = UnitConv.pt2mm( BAR_HEIGHT );
assertThat( commonGen.getBean().getBarHeight(), is( equalTo( expectedHeight ) ) );
}
}
}
private class BarcodeTypeInfo {
private String type;
private Class<?> clazz;
private String value;
private boolean isCheckIncorrect = true;
public BarcodeTypeInfo( String type, Class<?> clazz ) {
this.type = type;
this.clazz = clazz;
this.value = SimpleBarcodesUtility.getBarcodeSampleData( type );
}
public BarcodeTypeInfo( String type, Class<?> clazz, boolean isCheckIncorrect ) {
this( type, clazz );
this.isCheckIncorrect = isCheckIncorrect;
}
public String getType() {
return type;
}
public Class<?> getClazz() {
return clazz;
}
public String getValue() {
return value;
}
public boolean isCheckIncorrect() {
return isCheckIncorrect;
}
}
}