blob: d704543915243a840a1533d0da2c5471122f1de4 [file] [log] [blame]
/*
* 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.batik.apps.rasterizer;
import org.apache.batik.test.*;
import org.apache.batik.test.svg.ImageCompareTest;
import org.apache.batik.transcoder.Transcoder;
import org.apache.batik.transcoder.image.ImageTranscoder;
import org.apache.batik.transcoder.image.JPEGTranscoder;
import org.apache.batik.transcoder.image.PNGTranscoder;
import java.awt.*;
import java.io.*;
import java.util.*;
import java.util.List;
/**
* Validates the operation of the <code>SVGRasterizer</code>.
* It validates the option setting and the manipulation
* of source and destination sources.
*
* @author <a href="mailto:vhardy@apache.org">Vincent Hardy</a>
* @version $Id$
*/
public class SVGConverterTest extends DefaultTestSuite {
public SVGConverterTest(){
///////////////////////////////////////////////////////////////////////
// Add configuration tests
///////////////////////////////////////////////////////////////////////
AbstractTest t = null;
//
// Test Trancoder usage
//
t = new TranscoderConfigTest(DestinationType.PNG,
org.apache.batik.transcoder.image.PNGTranscoder.class);
addTest(t);
t.setId("TranscoderConfigTest.PNG");
t = new TranscoderConfigTest(DestinationType.JPEG,
org.apache.batik.transcoder.image.JPEGTranscoder.class);
addTest(t);
t.setId("TranscoderConfigTest.JPEG");
t = new TranscoderConfigTest(DestinationType.TIFF,
org.apache.batik.transcoder.image.TIFFTranscoder.class);
addTest(t);
t.setId("TranscoderConfigTest.TIFF");
try {
Class pdfClass = Class.forName("org.apache.fop.svg.PDFTranscoder");
t = new TranscoderConfigTest(DestinationType.PDF, pdfClass);
t.setId("TranscoderConfigTest.PDF");
addTest(t);
} catch (Exception e) {
}
//
// Checks that the proper hints are used
//
t = new HintsConfigTest(new Object[][]{
{ImageTranscoder.KEY_AOI, new Rectangle(40, 50, 40, 80)}}){
protected void deltaConfigure(SVGConverter c){
c.setArea(new Rectangle(40, 50, 40, 80));
}
};
addTest(t);
t.setId("HintsConfigTest.KEY_AOI");
t = new HintsConfigTest(new Object[][]{
{JPEGTranscoder.KEY_QUALITY, .5f}}){
protected void deltaConfigure(SVGConverter c){
c.setQuality(.5f);
}
};
addTest(t);
t.setId("HintsConfigTest.KEY_QUALITY");
t = new HintsConfigTest(new Object[][]{
{PNGTranscoder.KEY_INDEXED, 8}}){
protected void deltaConfigure(SVGConverter c){
c.setIndexed(8);
}
};
addTest(t);
t.setId("HintsConfigTest.KEY_INDEXED");
t = new HintsConfigTest(new Object[][]{
{ImageTranscoder.KEY_BACKGROUND_COLOR, Color.pink}}){
protected void deltaConfigure(SVGConverter c){
c.setBackgroundColor(Color.pink);
}
};
addTest(t);
t.setId("HintsConfigTest.KEY_BACKGROUND_COLOR");
t = new HintsConfigTest(new Object[][]{
{ImageTranscoder.KEY_HEIGHT, 50f}}){
protected void deltaConfigure(SVGConverter c){
c.setHeight(50);
}
};
addTest(t);
t.setId("HintsConfigTest.KEY_HEIGHT");
t = new HintsConfigTest(new Object[][]{
{ImageTranscoder.KEY_WIDTH, 50f}}){
protected void deltaConfigure(SVGConverter c){
c.setWidth(50);
}
};
addTest(t);
t.setId("HintsConfigTest.KEY_WIDTH");
t = new HintsConfigTest(new Object[][]{
{ImageTranscoder.KEY_MAX_HEIGHT, 50f}}){
protected void deltaConfigure(SVGConverter c){
c.setMaxHeight(50);
}
};
addTest(t);
t.setId("HintsConfigTest.KEY_MAX_HEIGHT");
t = new HintsConfigTest(new Object[][]{
{ImageTranscoder.KEY_MAX_WIDTH, 50f}}){
protected void deltaConfigure(SVGConverter c){
c.setMaxWidth(50);
}
};
addTest(t);
t.setId("HintsConfigTest.KEY_MAX_WIDTH");
t = new HintsConfigTest(new Object[][]{
{ImageTranscoder.KEY_MEDIA, "print"}}){
protected void deltaConfigure(SVGConverter c){
c.setMediaType("print");
}
};
addTest(t);
t.setId("HintsConfigTest.KEY_MEDIA");
t = new HintsConfigTest(new Object[][]{
{ImageTranscoder.KEY_DEFAULT_FONT_FAMILY, "Times"}}){
protected void deltaConfigure(SVGConverter c){
c.setDefaultFontFamily("Times");
}
};
addTest(t);
t.setId("HintsConfigTest.KEY_DEFAULT_FONT_FAMILY");
t = new HintsConfigTest(new Object[][]{
{ImageTranscoder.KEY_ALTERNATE_STYLESHEET, "myStyleSheet"}}){
protected void deltaConfigure(SVGConverter c){
c.setAlternateStylesheet("myStyleSheet");
}
};
addTest(t);
t.setId("HintsConfigTest.KEY_ALTERNATE_STYLESHEET");
t = new HintsConfigTest(new Object[][]{
{ImageTranscoder.KEY_USER_STYLESHEET_URI,
new File(System.getProperty("user.dir"), "userStylesheet.css").toURI().toString()}}){
protected void deltaConfigure(SVGConverter c){
c.setUserStylesheet("userStylesheet.css");
}
};
addTest(t);
t.setId("HintsConfigTest.KEY_USER_STYLESHEET_URI");
t = new HintsConfigTest(new Object[][]{
{ImageTranscoder.KEY_LANGUAGE, "fr"}}){
protected void deltaConfigure(SVGConverter c){
c.setLanguage("fr");
}
};
addTest(t);
t.setId("HintsConfigTest.KEY_LANGUAGE");
t = new HintsConfigTest(new Object[][]{
{ImageTranscoder.KEY_PIXEL_UNIT_TO_MILLIMETER, .5f}}){
protected void deltaConfigure(SVGConverter c){
c.setPixelUnitToMillimeter(.5f);
}
};
addTest(t);
t.setId("HintsConfigTest.KEY_PIXEL_UNIT_TO_MILLIMETER");
t = new HintsConfigTest(new Object[][]{
{ImageTranscoder.KEY_XML_PARSER_VALIDATING, Boolean.TRUE }}){
protected void deltaConfigure(SVGConverter c){
c.setValidate(true);
}
};
addTest(t);
t.setId("HintsConfigTest.KEY_XML_PARSER_VALIDATING");
//
// Check sources
//
t = new SourcesConfigTest(new String[] { "samples/anne", "samples/batikFX", "samples/tests/spec/styling/smiley" }){
protected void setSources(SVGConverter c){
c.setSources(new String[] {"samples/anne.svg", "samples/batikFX.svg", "samples/tests/spec/styling/smiley.svg"});
}
};
addTest(t);
t.setId("SourcesConfigTest.SimpleList");
//
// Check destination
//
t = new DestConfigTest(new String[] { "samples/anne.svg" },
new String[] { "test-reports/anne.png"}){
protected void setDestination(SVGConverter c){
c.setDst(new File("test-reports/anne.png"));
}
};
addTest(t);
t.setId("DestConfigTest.DstFile");
t = new DestConfigTest(new String[] { "samples/anne.svg", "samples/tests/spec/styling/smiley.svg" },
new String[] { "test-resources/anne.png", "test-resources/smiley.png"}){
protected void setDestination(SVGConverter c){
c.setDst(new File("test-resources"));
}
};
addTest(t);
t.setId("DestConfigTest.DstDir");
//
// Check that complete process goes without error
//
t = new OperationTest(){
protected void configure(SVGConverter c){
c.setSources(new String[]{"samples/anne.svg"});
c.setDst(new File("anne.png"));
File file = new File("anne.png");
file.deleteOnExit();
}
};
addTest(t);
t.setId("OperationTest.Bug4888");
t = new OperationTest(){
protected void configure(SVGConverter c){
c.setDestinationType(DestinationType.PDF);
c.setSources(new String[]{"samples/anne.svg"});
}
};
addTest(t);
t.setId("Operationtest.PDFTranscoding");
///////////////////////////////////////////////////////////////////////
// Add configuration error test. These tests check that the expected
// error gets reported for a given mis-configuration
///////////////////////////////////////////////////////////////////////
t = new ConfigErrorTest(SVGConverter.ERROR_NO_SOURCES_SPECIFIED) {
protected void configure(SVGConverter c){
c.setSources(null);
}
};
addTest(t);
t.setId("ConfigErrorTest.ERROR_NO_SOURCES_SPECIFIED");
t = new ConfigErrorTest(SVGConverter.ERROR_CANNOT_COMPUTE_DESTINATION){
protected void configure(SVGConverter c){
// Do not set destination file or destination directory
c.setSources(new String[]{"http://xml.apache.org/batik/dummy.svg"});
}
};
addTest(t);
t.setId("ConfigErrorTest.ERROR_CANNOT_COMPUTE_DESTINATION");
t = new ConfigErrorTest(SVGConverter.ERROR_CANNOT_USE_DST_FILE){
protected void configure(SVGConverter c){
File dummy = null;
try {
dummy = File.createTempFile("dummyPNG", ".png");
} catch(IOException ioEx ){
throw new Error( ioEx.getMessage() );
}
c.setSources(new String[]{"samples/anne.svg", "samples/batikFX.svg"});
c.setDst(dummy);
dummy.deleteOnExit();
}
};
addTest(t);
t.setId("ConfigErrorTest.ERROR_CANNOT_USE_DST_FILE");
t = new ConfigErrorTest(SVGConverter.ERROR_SOURCE_SAME_AS_DESTINATION){
protected void configure(SVGConverter c){
c.setSources(new String[]{ "samples/anne.svg" });
c.setDst(new File("samples/anne.svg"));
}
};
addTest(t);
t.setId("ConfigErrorTest.ERROR_SOURCE_SAME_AS_DESTINATION");
t = new ConfigErrorTest(SVGConverter.ERROR_CANNOT_READ_SOURCE){
protected void configure(SVGConverter c){
c.setSources(new String[]{ "test-resources/org/apache/batik/apps/rasterizer/notReadable.svg" });
c.setDst(new File("test-reports"));
}
public boolean proceedWithSourceTranscoding(SVGConverterSource source,
File dest){
// Big hack to simulate a non-readable SVG file
File hackedFile = new File(((SVGConverterFileSource)source).file.getPath()){
public boolean canRead(){
System.out.println("Yahoooooooo! In canRead");
return false;
}
};
((SVGConverterFileSource)source).file = hackedFile;
return true;
}
};
addTest(t);
t.setId("ConfigErrorTest.ERROR_CANNOT_READ_SOURCE");
t = new ConfigErrorTest(SVGConverter.ERROR_CANNOT_OPEN_SOURCE){
protected void configure(SVGConverter c){
c.setSources(new String[]{ "test-resources/org/apache/batik/apps/rasterizer/notReadable.svg" });
}
public boolean proceedWithComputedTask(Transcoder transcoder,
Map hints,
List sources,
List dest){
System.out.println("==================> Hacked Starting to process Task <=========================");
SVGConverterFileSource source = (SVGConverterFileSource)sources.get(0);
source = new SVGConverterFileSource(source.file){
public InputStream openStream() throws FileNotFoundException {
throw new FileNotFoundException("Simulated FileNotFoundException");
}
};
sources.set(0, source );
return true;
}
};
addTest(t);
t.setId("ConfigErrorTest.ERROR_CANNOT_OPEN_SOURCE");
t = new ConfigErrorTest(SVGConverter.ERROR_OUTPUT_NOT_WRITEABLE){
protected void configure(SVGConverter c){
c.setSources(new String[]{ "samples/anne.svg" });
File o = new File("test-resources/org/apache/batik/apps/rasterizer/readOnly.png");
o.setReadOnly();
c.setDst(o);
}
};
addTest(t);
t.setId("ConfigErrorTest.ERROR_OUTPUT_NOT_WRITEABLE");
t = new ConfigErrorTest(SVGConverter.ERROR_UNABLE_TO_CREATE_OUTPUT_DIR){
protected void configure(SVGConverter c){
c.setDst(new File("ZYZ::/cannotCreate\000"));
}
};
addTest(t);
t.setId("ConfigErrorTest.ERROR_UNABLE_TO_CREATE_OUTPUT_DIR");
t = new ConfigErrorTest(SVGConverter.ERROR_WHILE_RASTERIZING_FILE){
protected void configure(SVGConverter c){
c.setSources(new String[]{ "test-resources/org/apache/batik/apps/rasterizer/invalidSVG.svg"});
}
};
addTest(t);
t.setId("ConfigErrorTest(SVGConverter.ERROR_WHILE_RASTERIZING_FILE");
//
// Test that files are created as expected and are producing the
// expected result.
//
// Plain file
t = new ConverterOutputTest("samples/anne.svg", // File to convert
"test-reports/anne.png", // Output
"test-references/samples/anne.png"); // reference
addTest(t);
t.setId("OutputTest.plain");
// File with reference
t = new ConverterOutputTest("samples/anne.svg#svgView(viewBox(0,0,100,200))", // File to convert
"test-reports/anne.png", // Output
"test-references/samples/anneViewBox1.png"); // reference
addTest(t);
t.setId("OutputTest.reference");
}
}
/**
* A ConfigTest builds an SVGConverter, configures it,
* sets itself as the SVGConverterController and checks that
* the computed task is as expected (i.e., right set of
* hints).
*/
abstract class AbstractConfigTest extends AbstractTest implements SVGConverterController {
/**
* The 'proceedWithComputedTask' handler was not called
*/
public static final String ERROR_NO_COMPUTED_TASK
= "ConfigTest.error.no.computed.task";
/**
* The transcoderClass is not the one expected.
*/
public static final String ERROR_UNEXPECTED_TRANSCODER_CLASS
= "ConfigTest.error.unexpected.transcoder.class";
public static final String ENTRY_KEY_EXPECTED_TRANSCODER_CLASS
= "ConfigTest.entry.key.expected.transcoder.class";
public static final String ENTRY_KEY_COMPUTED_TRANSCODER_CLASS
= "ConfigTest.entry.key.computed.trancoder.class";
/**
* Error if the hints do not match
*/
public static final String ERROR_UNEXPECTED_NUMBER_OF_HINTS
= "ConfigTest.error.unexpected.number.of.hints";
public static final String ENTRY_KEY_EXPECTED_NUMBER_OF_HINTS
= "ConfigTest.entry.key.expected.number.of.hints";
public static final String ENTRY_KEY_COMPUTED_NUMBER_OF_HINTS
= "ConfigTest.entry.key.computed.number.of.hints";
public static final String ENTRY_KEY_EXPECTED_HINTS
= "ConfigTest.entry.key.expected.hints";
public static final String ENTRY_KEY_COMPUTED_HINTS
= "ConfigTest.entry.key.computed.hints";
public static final String ERROR_UNEXPECTED_TRANSCODING_HINT
= "ConfigTest.error.unexpected.transcoding.hint";
public static final String ENTRY_KEY_EXPECTED_HINT_KEY
= "ConfigTest.entry.key.expected.hint.key";
public static final String ENTRY_KEY_COMPUTED_HINT_VALUE
= "ConfigTest.entry.key.computed.hint.value";
public static final String ENTRY_KEY_EXPECTED_HINT_VALUE
= "ConfigTest.entry.key.expected.hint.value";
/**
* Error if the sources do not match
*/
public static final String ERROR_UNEXPECTED_SOURCES_LIST
= "ConfigTest.error.unexpected.sources.list";
public static final String ENTRY_KEY_EXPECTED_NUMBER_OF_SOURCES
= "ConfigTest.entry.key.expected.number.of.sources";
public static final String ENTRY_KEY_COMPUTED_NUMBER_OF_SOURCES
= "ConfigTest.entry.key.computed.number.of.sources";
public static final String ENTRY_KEY_EXPECTED_SOURCE_AT_INDEX
= "ConfigTest.entry.key.expected.source.at.index";
public static final String ENTRY_KEY_COMPUTED_SOURCE_AT_INDEX
= "ConfigTest.entry.key.computed.source.at.index";
public static final String ENTRY_KEY_COMPUTED_SOURCES_LIST
= "ConfigTest.entry.key.computed.sources.list";
public static final String ENTRY_KEY_EXPECTED_SOURCES_LIST
= "ConfigTest.entry.key.expected.sources.list";
/**
* Error if the dest do not match
*/
public static final String ERROR_UNEXPECTED_DEST_LIST
= "ConfigTest.error.unexpected.dest.list";
public static final String ENTRY_KEY_EXPECTED_NUMBER_OF_DEST
= "ConfigTest.entry.key.expected.number.of.dest";
public static final String ENTRY_KEY_COMPUTED_NUMBER_OF_DEST
= "ConfigTest.entry.key.computed.number.of.dest";
public static final String ENTRY_KEY_EXPECTED_DEST_AT_INDEX
= "ConfigTest.entry.key.expected.dest.at.index";
public static final String ENTRY_KEY_COMPUTED_DEST_AT_INDEX
= "ConfigTest.entry.key.computed.dest.at.index";
public static final String ENTRY_KEY_COMPUTED_DEST_LIST
= "ConfigTest.entry.key.computed.dest.list";
public static final String ENTRY_KEY_EXPECTED_DEST_LIST
= "ConfigTest.entry.key.expected.dest.list";
/**
* Configuration Description
*/
static class Config {
Class transcoderClass;
HashMap hints;
List sources;
List dest;
}
protected Config expectedConfig;
protected Config computedConfig;
protected AbstractConfigTest(){
}
protected void setExpectedConfig(Config expectedConfig){
this.expectedConfig = expectedConfig;
}
protected abstract void configure(SVGConverter c);
protected String makeSourceList(List v){
int n = v.size();
StringBuffer sb = new StringBuffer( n * 8 );
for (Object aV : v) {
sb.append(aV.toString());
}
return sb.toString();
}
protected String makeHintsString( Map map){
Iterator iter = map.keySet().iterator();
StringBuffer sb = new StringBuffer();
while (iter.hasNext()){
Object key = iter.next();
sb.append(key.toString());
sb.append( '(' );
sb.append(map.get(key).toString());
sb.append(") -- ");
}
return sb.toString();
}
public String getName(){
return getId();
}
public TestReport runImpl() throws Exception {
SVGConverter c = new SVGConverter(this);
configure(c);
c.execute();
//
// Now, check that the expectedConfig and the
// computedConfig are identical
//
if (computedConfig == null){
return reportError(ERROR_NO_COMPUTED_TASK);
}
if (!expectedConfig.transcoderClass.equals
(computedConfig.transcoderClass)){
TestReport report = reportError(ERROR_UNEXPECTED_TRANSCODER_CLASS);
report.addDescriptionEntry(ENTRY_KEY_EXPECTED_TRANSCODER_CLASS,
expectedConfig.transcoderClass);
report.addDescriptionEntry(ENTRY_KEY_COMPUTED_TRANSCODER_CLASS,
computedConfig.transcoderClass);
return report;
}
// Compare sources
int en = expectedConfig.sources.size();
int cn = computedConfig.sources.size();
if (en != cn){
TestReport report = reportError(ERROR_UNEXPECTED_SOURCES_LIST);
report.addDescriptionEntry(ENTRY_KEY_EXPECTED_NUMBER_OF_SOURCES,
"" + en);
report.addDescriptionEntry(ENTRY_KEY_COMPUTED_NUMBER_OF_SOURCES,
"" + cn);
report.addDescriptionEntry(ENTRY_KEY_EXPECTED_SOURCES_LIST,
makeSourceList(expectedConfig.sources));
report.addDescriptionEntry(ENTRY_KEY_COMPUTED_SOURCES_LIST,
makeSourceList(computedConfig.sources));
return report;
}
for (int i=0; i<en; i++){
Object es = expectedConfig.sources.get(i);
Object cs = computedConfig.sources.get(i);
if (!computedConfig.sources.contains(es)){
TestReport report = reportError(ERROR_UNEXPECTED_SOURCES_LIST);
report.addDescriptionEntry(ENTRY_KEY_EXPECTED_SOURCE_AT_INDEX,
"[" + i + "] = -" + es + "- (" + es.getClass().getName() + ")");
report.addDescriptionEntry(ENTRY_KEY_COMPUTED_SOURCE_AT_INDEX,
"[" + i + "] = -" + cs + "- (" + es.getClass().getName() + ")");
report.addDescriptionEntry(ENTRY_KEY_EXPECTED_SOURCES_LIST,
makeSourceList(expectedConfig.sources));
report.addDescriptionEntry(ENTRY_KEY_COMPUTED_SOURCES_LIST,
makeSourceList(computedConfig.sources));
return report;
}
}
// Compare dest
en = expectedConfig.dest.size();
cn = computedConfig.dest.size();
if (en != cn){
TestReport report = reportError(ERROR_UNEXPECTED_DEST_LIST);
report.addDescriptionEntry(ENTRY_KEY_EXPECTED_NUMBER_OF_DEST,
"" + en);
report.addDescriptionEntry(ENTRY_KEY_COMPUTED_NUMBER_OF_DEST,
"" + cn);
report.addDescriptionEntry(ENTRY_KEY_EXPECTED_DEST_LIST,
makeSourceList(expectedConfig.dest));
report.addDescriptionEntry(ENTRY_KEY_COMPUTED_DEST_LIST,
makeSourceList(computedConfig.dest));
return report;
}
for (int i=0; i<en; i++){
Object es = expectedConfig.dest.get(i);
Object cs = computedConfig.dest.get(i);
if (!computedConfig.dest.contains(cs)){
TestReport report = reportError(ERROR_UNEXPECTED_DEST_LIST);
report.addDescriptionEntry(ENTRY_KEY_EXPECTED_DEST_AT_INDEX,
"[" + i + "] = " + es);
report.addDescriptionEntry(ENTRY_KEY_COMPUTED_DEST_AT_INDEX,
"[" + i + "] = " + cs);
report.addDescriptionEntry(ENTRY_KEY_EXPECTED_DEST_LIST,
makeSourceList(expectedConfig.dest));
report.addDescriptionEntry(ENTRY_KEY_COMPUTED_DEST_LIST,
makeSourceList(computedConfig.dest));
return report;
}
}
//
// Finally, check the hints
//
en = expectedConfig.hints.size();
cn = computedConfig.hints.size();
if (en != cn){
TestReport report = reportError(ERROR_UNEXPECTED_NUMBER_OF_HINTS);
report.addDescriptionEntry(ENTRY_KEY_EXPECTED_NUMBER_OF_HINTS,
"" + en);
report.addDescriptionEntry(ENTRY_KEY_COMPUTED_NUMBER_OF_HINTS,
"" + cn);
report.addDescriptionEntry(ENTRY_KEY_EXPECTED_HINTS,
makeHintsString(expectedConfig.hints));
report.addDescriptionEntry(ENTRY_KEY_COMPUTED_HINTS,
makeHintsString(computedConfig.hints));
return report;
}
for (Object hintKey : expectedConfig.hints.keySet()) {
Object expectedHintValue = expectedConfig.hints.get(hintKey);
Object computedHintValue = computedConfig.hints.get(hintKey);
if (!expectedHintValue.equals(computedHintValue)) {
TestReport report = reportError(ERROR_UNEXPECTED_TRANSCODING_HINT);
report.addDescriptionEntry(ENTRY_KEY_EXPECTED_HINT_KEY,
hintKey.toString());
report.addDescriptionEntry(ENTRY_KEY_EXPECTED_HINT_VALUE,
expectedHintValue.toString());
report.addDescriptionEntry(ENTRY_KEY_COMPUTED_HINT_VALUE,
"" + computedHintValue);
report.addDescriptionEntry(ENTRY_KEY_EXPECTED_HINTS,
makeHintsString(expectedConfig.hints));
report.addDescriptionEntry(ENTRY_KEY_COMPUTED_HINTS,
makeHintsString(computedConfig.hints));
return report;
}
}
return reportSuccess();
}
public boolean proceedWithComputedTask(Transcoder transcoder,
Map hints,
List sources,
List dest){
computedConfig = new Config();
computedConfig.transcoderClass = transcoder.getClass();
computedConfig.sources = new ArrayList( sources );
computedConfig.dest = new ArrayList( dest );
computedConfig.hints = new HashMap(hints);
return false; // Do not proceed with the convertion process,
// we are only checking the config in this test.
}
public boolean proceedWithSourceTranscoding(SVGConverterSource source,
File dest) {
return true;
}
public boolean proceedOnSourceTranscodingFailure(SVGConverterSource source,
File dest,
String errorCode){
return true;
}
public void onSourceTranscodingSuccess(SVGConverterSource source,
File dest){
}
}
/**
* Tests that a convertion task goes without exception.
*/
class OperationTest extends AbstractTest{
public TestReport runImpl() throws Exception {
SVGConverter c = new SVGConverter();
configure(c);
c.execute();
return reportSuccess();
}
protected void configure(SVGConverter c){
// Should be overridden by subclasses.
}
}
/**
* Provides a simple string constructor which allows the user to
* create a given test to check that a specific transcoder class is
* used for a given mime type.
*/
class TranscoderConfigTest extends AbstractConfigTest {
static final String SOURCE_FILE = "samples/anne.svg";
static final String DEST_FILE_NAME = "samples/anne";
protected DestinationType dstType;
/**
* @param dstType type of result image
* @param expectedTranscoderClass class for the Transcoder expected to perform
* the convertion.
*/
public TranscoderConfigTest(DestinationType dstType,
Class expectedTranscoderClass){
this.dstType = dstType;
Config config = new Config();
config.transcoderClass = expectedTranscoderClass;
List sources = new ArrayList();
sources.add(new SVGConverterFileSource(new File(SOURCE_FILE)));
config.sources = sources;
List dest = new ArrayList();
dest.add(new File(DEST_FILE_NAME + dstType.getExtension()));
config.dest = dest;
HashMap hints = new HashMap();
config.hints = hints;
setExpectedConfig(config);
}
/**
* Configures the test with the given mime type
*/
public void configure(SVGConverter c){
c.setSources(new String[] { SOURCE_FILE });
c.setDst(new File(DEST_FILE_NAME + dstType.getExtension()));
c.setDestinationType(dstType);
}
}
/**
* Provides a simple string array constructor which allows the user to
* create a test checking for a specific hint configuration.
*/
class HintsConfigTest extends AbstractConfigTest {
static final String SOURCE_FILE = "samples/anne.svg";
static final String DEST_FILE_NAME = "samples/anne";
static final Class EXPECTED_TRANSCODER_CLASS = org.apache.batik.transcoder.image.PNGTranscoder.class;
static final DestinationType DST_TYPE = DestinationType.PNG;
/**
*/
public HintsConfigTest(Object[][] hintsMap){
Config config = new Config();
config.transcoderClass = EXPECTED_TRANSCODER_CLASS;
List sources = new ArrayList();
sources.add(new SVGConverterFileSource(new File(SOURCE_FILE)));
config.sources = sources;
List dest = new ArrayList();
dest.add(new File(DEST_FILE_NAME + DST_TYPE.getExtension()));
config.dest = dest;
HashMap hints = new HashMap();
//
// Add hints from constructor argument
//
int n = hintsMap.length;
for (Object[] aHintsMap : hintsMap) {
hints.put(aHintsMap[0], aHintsMap[1]);
}
config.hints = hints;
setExpectedConfig(config);
}
/**
* Configures the test with the given mime type
*/
public void configure(SVGConverter c){
c.setSources(new String[] { SOURCE_FILE });
c.setDst(new File(DEST_FILE_NAME + DST_TYPE.getExtension()));
c.setDestinationType(DST_TYPE);
deltaConfigure(c);
}
protected void deltaConfigure(SVGConverter c){
}
}
/**
* Provides a simple string array constructor which allows the user to
* create a test checking for a specific source configuration.
* The constructor argument takes the list of expected files and the
* deltaConfigure method should set the sources which is expected to
* produce that list of sources. The sources should be file names
* which ommit the ".svg" extension.
*/
class SourcesConfigTest extends AbstractConfigTest {
static final Class EXPECTED_TRANSCODER_CLASS = org.apache.batik.transcoder.image.PNGTranscoder.class;
static final DestinationType DST_TYPE = DestinationType.PNG;
static final String SVG_EXTENSION = ".svg";
/**
*/
public SourcesConfigTest(Object[] expectedSources){
Config config = new Config();
config.transcoderClass = EXPECTED_TRANSCODER_CLASS;
List sources = new ArrayList();
List dest = new ArrayList();
for (Object expectedSource : expectedSources) {
sources.add(new SVGConverterFileSource(new File(expectedSource + SVG_EXTENSION)));
dest.add(new File(expectedSource + DST_TYPE.getExtension()));
}
config.sources = sources;
config.dest = dest;
HashMap hints = new HashMap();
config.hints = hints;
setExpectedConfig(config);
}
/**
* Configures the test with the given mime type
*/
public void configure(SVGConverter c){
c.setDestinationType(DST_TYPE);
setSources(c);
}
protected void setSources(SVGConverter c){
}
}
/**
* Provides a simple string array constructor which allows the user to
* create a test checking for a specific destination configuration.
* The constructor argument takes the list of sources and the list of
* expected configuration which is influenced by the 'setDestination'
* content.
*/
class DestConfigTest extends AbstractConfigTest {
static final Class EXPECTED_TRANSCODER_CLASS = org.apache.batik.transcoder.image.PNGTranscoder.class;
static final DestinationType DST_TYPE = DestinationType.PNG;
String[] sourcesStrings;
/**
*/
public DestConfigTest(String[] sourcesStrings,
String[] expectedDest){
this.sourcesStrings = sourcesStrings;
Config config = new Config();
config.transcoderClass = EXPECTED_TRANSCODER_CLASS;
List sources = new ArrayList();
List dest = new ArrayList();
for (String sourcesString : sourcesStrings) {
sources.add(new SVGConverterFileSource(new File(sourcesString)));
}
for (String anExpectedDest : expectedDest) {
dest.add(new File(anExpectedDest));
}
config.sources = sources;
config.dest = dest;
HashMap hints = new HashMap();
config.hints = hints;
setExpectedConfig(config);
}
/**
* Configures the test with the given mime type
*/
public void configure(SVGConverter c){
c.setDestinationType(DST_TYPE);
c.setSources(sourcesStrings);
setDestination(c);
}
protected void setDestination(SVGConverter c){
}
}
/**
* This test lously checks that errors are reported as expected. It
* checks that the error code given at construction time is reported
* either my an exception thrown from the execute method or during the
* processing of single files in the SVGConverterController handler.
*/
class ConfigErrorTest extends AbstractTest implements SVGConverterController{
String errorCode;
String foundErrorCode = null;
public static final String ERROR_DID_NOT_GET_ERROR
= "ConfigErrorTest.error.did.not.get.error";
public static final String ERROR_UNEXPECTED_ERROR_CODE
= "ConfigErrorTest.error.unexpected.error.code";
public static final String ENTRY_KEY_EXPECTED_ERROR_CODE
= "ConfigErrorTest.entry.key.expected.error.code";
public static final String ENTRY_KEY_GOT_ERROR_CODE
= "ConfigErrorTest.entry.key.got.error.code";
public ConfigErrorTest(String expectedErrorCode){
this.errorCode = expectedErrorCode;
}
public String getName(){
return getId();
}
public TestReport runImpl() throws Exception {
SVGConverter c = new SVGConverter(this);
c.setDestinationType(DestinationType.PNG);
c.setSources(new String[]{ "samples/anne.svg" });
configure(c);
try {
c.execute();
} catch(SVGConverterException e){
e.printStackTrace();
foundErrorCode = e.getErrorCode();
}
if (foundErrorCode == null){
TestReport report = reportError(ERROR_DID_NOT_GET_ERROR);
report.addDescriptionEntry(ENTRY_KEY_EXPECTED_ERROR_CODE,
errorCode);
return report;
}
if (foundErrorCode.equals(errorCode)){
return reportSuccess();
}
TestReport report = reportError(ERROR_UNEXPECTED_ERROR_CODE);
report.addDescriptionEntry(ENTRY_KEY_EXPECTED_ERROR_CODE,
errorCode);
report.addDescriptionEntry(ENTRY_KEY_GOT_ERROR_CODE,
foundErrorCode);
return report;
}
protected void configure(SVGConverter c){
}
public boolean proceedWithComputedTask(Transcoder transcoder,
Map hints,
List sources,
List dest){
System.out.println("==================> Starting to process Task <=========================");
return true;
}
public boolean proceedWithSourceTranscoding(SVGConverterSource source,
File dest) {
System.out.print("Transcoding " + source + " to " + dest + " ... ");
return true;
}
public boolean proceedOnSourceTranscodingFailure(SVGConverterSource source,
File dest,
String errorCode){
System.out.println(" ... FAILURE");
foundErrorCode = errorCode;
return true;
}
public void onSourceTranscodingSuccess(SVGConverterSource source,
File dest){
System.out.println(" ... SUCCESS");
}
}
/**
* This test checks that a file is indeed created and that it is identical to
* an expected reference.
*/
class ConverterOutputTest extends AbstractTest {
String svgSource;
String pngDest;
String pngRef;
public ConverterOutputTest(String svgSource,
String pngDest,
String pngRef){
this.svgSource = svgSource;
this.pngDest = pngDest;
this.pngRef = pngRef;
}
public TestReport runImpl() throws Exception {
SVGConverter c = new SVGConverter();
System.out.println("Converting : " + svgSource);
c.setSources(new String[]{svgSource});
c.setDst(new File(pngDest));
c.setDestinationType(DestinationType.PNG);
c.execute();
ImageCompareTest t = new ImageCompareTest(pngDest,
pngRef);
TestReport r = t.run();
(new File(pngDest)).delete();
return r;
}
}