/*
 * 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.
 */

/* $Id$ */

package org.apache.fop.events;

import java.io.File;

import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;

import org.apache.commons.io.output.NullOutputStream;
import org.apache.fop.ResourceEventProducer;
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.area.AreaEventProducer;
import org.apache.fop.fo.FOValidationEventProducer;
import org.apache.fop.fo.flow.table.TableEventProducer;
import org.apache.fop.fonts.FontEventProducer;
import org.apache.fop.layoutmgr.BlockLevelEventProducer;
import org.apache.fop.layoutmgr.inline.InlineLevelEventProducer;
import org.apache.xmlgraphics.util.MimeConstants;
import org.junit.Test;

/**
 * Tests that the event notification system runs smoothly.
 */
public class EventProcessingTestCase {

    private final FopFactory fopFactory = FopFactory.newInstance();

    private final TransformerFactory tFactory = TransformerFactory.newInstance();

    private final File basedir;

    public EventProcessingTestCase() {
        String base = System.getProperty("basedir");
        if (base != null) {
            basedir = new File(base);
        } else {
            basedir = new File(".");
        }
    }

    private void doTest(String filename, String expectedEventID)
            throws FOPException, TransformerException {
        Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, new NullOutputStream());
        EventChecker eventChecker = new EventChecker(expectedEventID);
        fop.getUserAgent().getEventBroadcaster().addEventListener(eventChecker);
        Transformer transformer = tFactory.newTransformer();
        Source src = new StreamSource(new File(basedir, filename));
        Result res = new SAXResult(fop.getDefaultHandler());
        transformer.transform(src, res);
        eventChecker.end();
    }

    @Test
    public void testArea() throws FOPException, TransformerException {
        doTest("area.fo",
                AreaEventProducer.class.getName() + ".unresolvedIDReferenceOnPage");
    }

    @Test
    public void testResource() throws FOPException, TransformerException {
        doTest("resource.fo",
                ResourceEventProducer.class.getName() + ".imageNotFound");
    }

    @Test
    public void testValidation() throws FOPException, TransformerException {
        doTest("validation.fo",
                FOValidationEventProducer.class.getName() + ".invalidPropertyValue");
    }

    @Test
    public void testTable() throws FOPException, TransformerException {
        doTest("table.fo",
                TableEventProducer.class.getName() + ".noTablePaddingWithCollapsingBorderModel");
    }

    @Test
    public void testBlockLevel() throws FOPException, TransformerException {
        doTest("block-level.fo",
                BlockLevelEventProducer.class.getName() + ".overconstrainedAdjustEndIndent");
    }

    @Test
    public void testInlineLevel() throws FOPException, TransformerException {
        doTest("inline-level.fo",
                InlineLevelEventProducer.class.getName() + ".lineOverflows");
    }

    @Test
    public void testFont() throws FOPException, TransformerException {
        doTest("font.fo",
                FontEventProducer.class.getName() + ".fontSubstituted");
    }
}
