/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.pdfbox.pdmodel.interactive.form;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget;
/**
* This will test the functionality of choice fields in PDFBox.
*/
public class TestListBox extends TestCase
{
/**
* Constructor.
*
* @param name The name of the test to run.
*/
public TestListBox( String name )
{
super( name );
}
/**
* This will get the suite of test that this class holds.
*
* @return All of the tests that this class holds.
*/
public static Test suite()
{
return new TestSuite( TestListBox.class );
}
/**
* infamous main method.
*
* @param args The command line arguments.
*/
public static void main( String[] args )
{
String[] arg = {TestListBox.class.getName() };
junit.textui.TestRunner.main( arg );
}
/**
* This will test the radio button PDModel.
*
* @throws IOException If there is an error creating the field.
*/
public void testChoicePDModel() throws IOException
{
/*
* Set up two data list which will be used for the tests
*/
// export values
List<String> exportValues = new ArrayList<>();
exportValues.add("export01");
exportValues.add("export02");
exportValues.add("export03");
// display values, not sorted on purpose as this
// will be used to test the sort option of the list box
List<String> displayValues = new ArrayList<>();
displayValues.add("display02");
displayValues.add("display01");
displayValues.add("display03");
PDDocument doc = null;
try
{
doc = new PDDocument();
PDPage page = new PDPage(PDRectangle.A4);
doc.addPage(page);
PDAcroForm form = new PDAcroForm( doc );
// Adobe Acrobat uses Helvetica as a default font and
// stores that under the name '/Helv' in the resources dictionary
PDFont font = PDType1Font.HELVETICA;
PDResources resources = new PDResources();
resources.put(COSName.getPDFName("Helv"), font);
// Add and set the resources and default appearance at the form level
form.setDefaultResources(resources);
// Acrobat sets the font size on the form level to be
// auto sized as default. This is done by setting the font size to '0'
String defaultAppearanceString = "/Helv 0 Tf 0 g";
form.setDefaultAppearance(defaultAppearanceString);
PDChoice choice = new PDListBox(form);
choice.setDefaultAppearance("/Helv 12 Tf 0g");
// Specify the annotation associated with the field
PDAnnotationWidget widget = choice.getWidgets().get(0);
PDRectangle rect = new PDRectangle(50, 750, 200, 50);
widget.setRectangle(rect);
widget.setPage(page);
// Add the annotation to the page
page.getAnnotations().add(widget);
// test that there are no nulls returned for an empty field
// only specific methods are tested here
assertNotNull(choice.getOptions());
assertNotNull(choice.getValue());
/*
* Tests for setting the export values
*/
// setting/getting option values - the dictionaries Opt entry
choice.setOptions(exportValues);
assertEquals(exportValues,choice.getOptionsDisplayValues());
assertEquals(exportValues,choice.getOptionsExportValues());
// assert that the option values have been correctly set
COSArray optItem = (COSArray) choice.getCOSObject().getItem(COSName.OPT);
assertNotNull(choice.getCOSObject().getItem(COSName.OPT));
assertEquals(optItem.size(),exportValues.size());
assertEquals(exportValues.get(0), optItem.getString(0));
// assert that the option values can be retrieved correctly
List<String> retrievedOptions = choice.getOptions();
assertEquals(retrievedOptions.size(),exportValues.size());
assertEquals(retrievedOptions, exportValues);
/*
* Tests for setting the field values
*/
// assert that the field value can be set
choice.setValue("export01");
assertEquals(choice.getValue().get(0),"export01");
// ensure that the choice field doesn't allow multiple selections
choice.setMultiSelect(false);
// without multiselect setting multiple items shall fail
try
{
choice.setValue(exportValues);
fail( "Missing IllegalArgumentException" );
}
catch( IllegalArgumentException e )
{
assertEquals("The list box does not allow multiple selections.",e.getMessage() );
}
// ensure that the choice field does allow multiple selections
choice.setMultiSelect(true);
// now this call must suceed
choice.setValue(exportValues);
// assert that the option values have been correctly set
COSArray valueItems = (COSArray) choice.getCOSObject().getItem(COSName.V);
assertNotNull(valueItems);
assertEquals(valueItems.size(),exportValues.size());
assertEquals(exportValues.get(0), valueItems.getString(0));
// assert that the index values have been correctly set
COSArray indexItems = (COSArray) choice.getCOSObject().getItem(COSName.I);
assertNotNull(indexItems);
assertEquals(indexItems.size(),exportValues.size());
// setting a single value shall remove the indices
choice.setValue("export01");
indexItems = (COSArray) choice.getCOSObject().getItem(COSName.I);
assertNull(indexItems);
// assert that the Opt entry is removed
choice.setOptions(null);
assertNull(choice.getCOSObject().getItem(COSName.OPT));
// if there is no Opt entry an empty List shall be returned
assertEquals(choice.getOptions(), Collections.<String>emptyList());
/*
* Test for setting export and display values
*/
// setting display and export value
choice.setOptions(exportValues, displayValues);
assertEquals(displayValues,choice.getOptionsDisplayValues());
assertEquals(exportValues,choice.getOptionsExportValues());
/*
* Testing the sort option
*/
assertEquals(choice.getOptionsDisplayValues().get(0),"display02");
choice.setSort(true);
choice.setOptions(exportValues, displayValues);
assertEquals(choice.getOptionsDisplayValues().get(0),"display01");
/*
* Setting options with an empty list
*/
// assert that the Opt entry is removed
choice.setOptions(null, displayValues);
assertNull(choice.getCOSObject().getItem(COSName.OPT));
// if there is no Opt entry an empty list shall be returned
assertEquals(choice.getOptions(), Collections.<String>emptyList());
assertEquals(choice.getOptionsDisplayValues(), Collections.<String>emptyList());
assertEquals(choice.getOptionsExportValues(), Collections.<String>emptyList());
// test that an IllegalArgumentException is thrown when export and display
// value lists have different sizes
exportValues.remove(1);
try
{
choice.setOptions(exportValues, displayValues);
fail( "Missing exception" );
}
catch( IllegalArgumentException e )
{
assertEquals(
"The number of entries for exportValue and displayValue shall be the same.",
e.getMessage() );
}
}
finally
{
if( doc != null )
{
doc.close();
}
}
}
}