org.apache.qpid.disttest.charting.chartbuilder.ChartProductionTest.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.qpid.disttest.charting.chartbuilder.ChartProductionTest.java

Source

/*
 * 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.qpid.disttest.charting.chartbuilder;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.io.File;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.title.ShortTextTitle;
import org.jfree.data.general.Dataset;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.apache.qpid.disttest.charting.ChartType;
import org.apache.qpid.disttest.charting.definition.ChartingDefinition;
import org.apache.qpid.disttest.charting.definition.SeriesDefinition;
import org.apache.qpid.disttest.charting.seriesbuilder.DatasetHolder;
import org.apache.qpid.disttest.charting.seriesbuilder.SeriesBuilder;
import org.apache.qpid.disttest.charting.seriesbuilder.SeriesRow;
import org.apache.qpid.disttest.charting.writer.ChartWriter;
import org.apache.qpid.test.utils.QpidTestCase;
import org.apache.qpid.test.utils.TestFileUtils;

/**
 * Tests the production of the different chart types.  To manually
 * verify the generated output, set the system property {@link #RETAIN_TEST_CHARTS}
 * to prevent the automatic deletion of the test chart directory.
 */
public class ChartProductionTest extends QpidTestCase {
    private static final Logger _logger = LoggerFactory.getLogger(ChartProductionTest.class);
    private static final String TEST_CHARTTITLE = "TEST_CHARTTITLE";
    private static final String TEST_CHARTSUBTITLE = "TEST_CHARTSUBTITLE";
    private static final String TEST_XAXIS = "TEST_XAXIS";
    private static final String TEST_YAXIS = "TEST_YAXIS";

    private static final String TEST_SERIESLEGEND = "TEST_SERIESLEGEND";

    private static final SeriesRow[] SIMPLE_SERIES_ROWS = new SeriesRow[] { new SeriesRow(1d, 1d),
            new SeriesRow(2d, 2d), new SeriesRow(3d, 3d), new SeriesRow(4d, 4d), new SeriesRow(5d, 5d),
            new SeriesRow(6d, 6d), };

    private static final String RETAIN_TEST_CHARTS = "retainTestCharts";

    private SeriesDefinition _seriesDefinition = mock(SeriesDefinition.class);
    private ChartingDefinition _chartingDefinition = mock(ChartingDefinition.class);
    private ChartWriter _writer = new ChartWriter();

    @Override
    protected void setUp() throws Exception {
        super.setUp();

        when(_seriesDefinition.getSeriesLegend()).thenReturn(TEST_SERIESLEGEND);
        when(_seriesDefinition.getStrokeWidth()).thenReturn(null);
        when(_seriesDefinition.getSeriesColourName()).thenReturn("blue");

        when(_chartingDefinition.getChartStemName()).thenReturn(getName());
        when(_chartingDefinition.getChartTitle()).thenReturn(TEST_CHARTTITLE);
        when(_chartingDefinition.getChartSubtitle()).thenReturn(TEST_CHARTSUBTITLE);
        when(_chartingDefinition.getXAxisTitle()).thenReturn(TEST_XAXIS);
        when(_chartingDefinition.getYAxisTitle()).thenReturn(TEST_YAXIS);
        when(_chartingDefinition.getSeriesDefinitions()).thenReturn(Collections.singletonList(_seriesDefinition));

        File chartDir = TestFileUtils.createTestDirectory("charts", false);
        if (!System.getProperties().containsKey(RETAIN_TEST_CHARTS)) {
            chartDir.deleteOnExit();
        } else {
            _logger.info("Charting directory for manual observation " + chartDir);
        }

        _writer.setOutputDirectory(chartDir);
    }

    public void testBarChart() throws Exception {
        ChartBuilder builder = ChartBuilderFactory.createChartBuilder(ChartType.BAR,
                new SampleSeriesBuilder(SIMPLE_SERIES_ROWS));
        assertChartTitlesAndWriteToFile(builder);
    }

    public void testBar3DChart() throws Exception {
        ChartBuilder builder = ChartBuilderFactory.createChartBuilder(ChartType.BAR3D, new SampleSeriesBuilder());
        assertChartTitlesAndWriteToFile(builder);
    }

    public void testLineChart() throws Exception {
        ChartBuilder builder = ChartBuilderFactory.createChartBuilder(ChartType.LINE, new SampleSeriesBuilder());
        assertChartTitlesAndWriteToFile(builder);
    }

    public void testLine3DChart() throws Exception {
        ChartBuilder builder = ChartBuilderFactory.createChartBuilder(ChartType.LINE3D, new SampleSeriesBuilder());
        assertChartTitlesAndWriteToFile(builder);
    }

    public void testXYLineChart() throws Exception {
        ChartBuilder builder = ChartBuilderFactory.createChartBuilder(ChartType.XYLINE, new SampleSeriesBuilder());
        assertChartTitlesAndWriteToFile(builder);
    }

    public void testXYLineChartWithColourAndWidth() throws Exception {
        when(_seriesDefinition.getStrokeWidth()).thenReturn(3);
        when(_seriesDefinition.getSeriesColourName()).thenReturn("dark_orange");

        ChartBuilder builder = ChartBuilderFactory.createChartBuilder(ChartType.XYLINE, new SampleSeriesBuilder());
        assertChartTitlesAndWriteToFile(builder);
    }

    public void testXYLineChartWithYAxisBounds() throws Exception {
        when(_chartingDefinition.getYAxisLowerBound()).thenReturn(-10);
        when(_chartingDefinition.getYAxisUpperBound()).thenReturn(20);

        ChartBuilder builder = ChartBuilderFactory.createChartBuilder(ChartType.XYLINE, new SampleSeriesBuilder());
        assertChartTitlesAndWriteToFile(builder);
    }

    public void testTimeSeriesLineChart() throws Exception {
        when(_seriesDefinition.getShape()).thenReturn("cross");

        SeriesRow[] timelineSeriesRows = new SeriesRow[] { new SeriesRow(new Date(1), 1d),
                new SeriesRow(new Date(2), 2d), new SeriesRow(new Date(3), 3d), new SeriesRow(new Date(4), 4d),
                new SeriesRow(new Date(5), 5d), new SeriesRow(new Date(6), 6d), new SeriesRow(new Date(7), 4d), };
        ChartBuilder builder = ChartBuilderFactory.createChartBuilder(ChartType.TIMELINE,
                new SampleSeriesBuilder(timelineSeriesRows));

        assertChartTitlesAndWriteToFile(builder);
    }

    public void testStatisticalBarChart() throws Exception {
        SeriesRow[] statisticalSeriesRows = new SeriesRow[] { new SeriesRow(1d, 1d, 0.5d),
                new SeriesRow(2d, 2d, 0.4d), new SeriesRow(4d, 4d, 0.3d), new SeriesRow(5d, 5d, 0.2d),
                new SeriesRow(6d, 6d, 0.1d) };

        ChartBuilder builder = ChartBuilderFactory.createChartBuilder(ChartType.STATISTICAL_BAR,
                new SampleSeriesBuilder(statisticalSeriesRows));

        assertChartTitlesAndWriteToFile(builder);
    }

    private void assertChartTitlesAndWriteToFile(ChartBuilder builder) {
        JFreeChart chart = builder.buildChart(_chartingDefinition);
        assertEquals(TEST_CHARTTITLE, chart.getTitle().getText());
        assertEquals(TEST_CHARTSUBTITLE, ((ShortTextTitle) chart.getSubtitle(1)).getText());
        assertEquals(TEST_SERIESLEGEND, chart.getPlot().getLegendItems().get(0).getLabel());

        if (chart.getPlot() instanceof XYPlot) {
            assertEquals(1, chart.getXYPlot().getDatasetCount());
        } else {
            assertEquals(1, chart.getCategoryPlot().getDatasetCount());
        }

        _writer.writeChartToFileSystem(chart, _chartingDefinition);
    }

    private class SampleSeriesBuilder implements SeriesBuilder {
        private DatasetHolder _datasetHolder;
        private SeriesRow[] _sampleSeriesRows = SIMPLE_SERIES_ROWS;

        public SampleSeriesBuilder() {
        }

        public SampleSeriesBuilder(SeriesRow[] sampleSeriesRows) {
            _sampleSeriesRows = sampleSeriesRows;
        }

        @Override
        public Dataset build(List<SeriesDefinition> seriesDefinitions) {
            for (Iterator<SeriesDefinition> iterator = seriesDefinitions.iterator(); iterator.hasNext();) {
                SeriesDefinition seriesDefinition = iterator.next();
                _datasetHolder.beginSeries(seriesDefinition);
                for (SeriesRow seriesRow : _sampleSeriesRows) {
                    _datasetHolder.addDataPointToSeries(seriesDefinition, seriesRow);
                }
                _datasetHolder.endSeries(seriesDefinition);
            }
            return _datasetHolder.getPopulatedDataset();
        }

        @Override
        public void setDatasetHolder(DatasetHolder dataPointCallback) {
            _datasetHolder = dataPointCallback;
        }
    }
}