/*********************************************************************************************** * File Info: $Id: TestDataGenerator.java,v 1.4 2004/05/26 01:58:43 nathaniel_auvil Exp $ * Copyright (C) 2000 * Author: Nathaniel G. Auvil * Contributor(s): * * Copyright 2002 (C) Nathaniel G. Auvil. All Rights Reserved. * * Redistribution and use of this software and associated documentation * ("Software"), with or without modification, are permitted provided * that the following conditions are met: * * 1. Redistributions of source code must retain copyright * statements and notices. Redistributions must also contain a * copy of this document. * * 2. Redistributions in binary form must reproduce the * above copyright notice, this list of conditions and the * following disclaimer in the documentation and/or other * materials provided with the distribution. * * 3. The name "jCharts" or "Nathaniel G. Auvil" must not be used to * endorse or promote products derived from this Software without * prior written permission of Nathaniel G. Auvil. For written * permission, please contact nathaniel_auvil@users.sourceforge.net * * 4. Products derived from this Software may not be called "jCharts" * nor may "jCharts" appear in their names without prior written * permission of Nathaniel G. Auvil. jCharts is a registered * trademark of Nathaniel G. Auvil. * * 5. Due credit should be given to the jCharts Project * (http://jcharts.sourceforge.net/). * * THIS SOFTWARE IS PROVIDED BY Nathaniel G. Auvil AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * jCharts OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. ************************************************************************************************/ package org.krysalis.jcharts.test; import org.krysalis.jcharts.properties.*; import org.krysalis.jcharts.properties.util.ChartStroke; import org.krysalis.jcharts.properties.util.ChartFont; import org.krysalis.jcharts.chartData.ScatterPlotDataSet; import com.google.code.appengine.awt.*; final public class TestDataGenerator { private final static Font[] ALL_FONTS=GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts(); /***************************************************************************************** * Random font generator based on the available Fonts on this machine. * * @param minSize * @param maxSize * @return Font ******************************************************************************************/ public static Font getRandomFont( double minSize, double maxSize ) { Font font=ALL_FONTS[ (int) TestDataGenerator.getRandomNumber( ALL_FONTS.length ) ]; font=font.deriveFont( (float) TestDataGenerator.getRandomNumber( minSize, maxSize ) ); return font; } /***************************************************************************************** * Random number generator. * * @param maxValue * @return double ******************************************************************************************/ public static double getRandomNumber( double maxValue ) { return Math.random() * maxValue; } /***************************************************************************************** * Random number generator in specified range. * * @param minValue * @param maxValue * @return double ******************************************************************************************/ protected static double getRandomNumber( double minValue, double maxValue ) { return ( minValue + ( Math.random() * ( maxValue - minValue ) ) ); } /***************************************************************************************** * Random number generator in specified range. Will include zeros a small percentage of * the time for testing. * * @param minValue * @param maxValue * @return double ******************************************************************************************/ protected static double getRandomNumberIncludingZero( double minValue, double maxValue ) { if( ( TestDataGenerator.getRandomNumber( 1 ) > 0.8d ) ) { return 0.0d; } else { return getRandomNumber( minValue, maxValue ); } } /***************************************************************************************** * Random numbers generator in specified range. * * @param numToGenerate the number of doubles to generate * @param minValue * @param maxValue * @return double[] ******************************************************************************************/ public static double[] getRandomNumbers( int numToGenerate, double minValue, double maxValue ) { double[] data=new double[ numToGenerate ]; for( int i=0; i < numToGenerate; i++ ) { data[ i ]=getRandomNumber( minValue, maxValue ); } return data; } /***************************************************************************************** * Random numbers generator in specified range. * * @param numberOfDataSets to generate * @param numToGenerate the number of doubles to generate * @param minValue * @param maxValue * @return double[] ******************************************************************************************/ public static double[][] getRandomNumbers( int numberOfDataSets, int numToGenerate, double minValue, double maxValue ) { double[][] data=new double[ numberOfDataSets ][ numToGenerate ]; for( int j=0; j < numberOfDataSets; j++ ) { for( int i=0; i < numToGenerate; i++ ) { data[ j ][ i ]=getRandomNumberIncludingZero( minValue, maxValue ); } } return data; } /***************************************************************************************** * Random numbers generator in specified range. * * @param numToGenerate the number of doubles to generate * @param xMinValue * @param xMaxValue * @param yMinValue * @param yMaxValue * @return Point.Double[] ******************************************************************************************/ public static Point.Double[] getRandomPoints( int numToGenerate, double xMinValue, double xMaxValue, double yMinValue, double yMaxValue ) { Point.Double[] points= new Point.Double[ numToGenerate ]; for( int j=0; j < numToGenerate; j++ ) { points[ j ]= ScatterPlotDataSet.createPoint2DDouble(); points[ j ].setLocation( getRandomNumber( xMinValue, xMaxValue ), getRandomNumber( yMinValue, yMaxValue ) ); } return points; } /***************************************************************************************** * Random Paint generator. * * @return Paint ******************************************************************************************/ protected static Paint getRandomPaint() { if( getRandomNumber( 1 ) > 0.5 ) { return getRandomColor(); } else { float width=(float) TestDataGenerator.getRandomNumber( 10, 800 ); float height=(float) TestDataGenerator.getRandomNumber( 10, 600 ); float x=(float) TestDataGenerator.getRandomNumber( 0, 800 ); float y=(float) TestDataGenerator.getRandomNumber( 0, 600 ); return new GradientPaint( x, y, getRandomColor(), width, height, getRandomColor() ); } } /***************************************************************************************** * Random Color generator. * * @return Paint[] ******************************************************************************************/ public static Paint[] getRandomPaints( int numToCreate ) { Paint paints[]=new Paint[ numToCreate ]; for( int i=0; i < numToCreate; i++ ) { paints[ i ]=getRandomPaint(); } return paints; } /***************************************************************************************** * Random Color generator. * * @return Color ******************************************************************************************/ protected static Color getRandomColor() { int transparency=(int) getRandomNumber( 100, 375 ); if( transparency > 255 ) { transparency=255; } return new Color( (int) getRandomNumber( 255 ), (int) getRandomNumber( 255 ), (int) getRandomNumber( 255 ), transparency ); } /***************************************************************************************** * Random String generator. * * @param maxStringLength * @param canBeNull * @return String ******************************************************************************************/ protected static String getRandomString( int maxStringLength, boolean canBeNull ) { if( canBeNull ) { if( TestDataGenerator.getRandomNumber( 10 ) <= 1 ) { return null; } } int tempVal; int stringLength=1 + (int) getRandomNumber( maxStringLength ); StringBuffer stringBuffer=new StringBuffer( stringLength ); while( stringLength-- > 0 ) { tempVal=65 + (int) getRandomNumber( 58 ); while( tempVal > 90 && tempVal < 97 ) { tempVal=65 + (int) getRandomNumber( 58 ); } stringBuffer.append( (char) tempVal ); } return stringBuffer.toString(); } /***************************************************************************************** * Random String generator. * * @return String[] ******************************************************************************************/ protected static String[] getRandomStrings( int numToCreate, int maxStringLength, boolean canBeNull ) { if( canBeNull ) { if( (int) TestDataGenerator.getRandomNumber( 10 ) <= 1 ) { return null; } } String strings[]=new String[ numToCreate ]; for( int i=0; i < numToCreate; i++ ) { strings[ i ]=getRandomString( maxStringLength, false ); } return strings; } /****************************************************************************************** * Takes the passed AxisProperties and randomizes it. * * @param axisProperties ******************************************************************************************/ protected static void randomizeAxisProperties( AxisProperties axisProperties ) { DataAxisProperties dataAxisProperties; LabelAxisProperties labelAxisProperties; if( axisProperties.isPlotHorizontal() ) { dataAxisProperties= (DataAxisProperties) axisProperties.getXAxisProperties(); labelAxisProperties= (LabelAxisProperties) axisProperties.getYAxisProperties(); } else { dataAxisProperties= (DataAxisProperties) axisProperties.getYAxisProperties(); labelAxisProperties= (LabelAxisProperties) axisProperties.getXAxisProperties(); } dataAxisProperties.setNumItems( (int) TestDataGenerator.getRandomNumber( 2, 15 ) ); dataAxisProperties.setRoundToNearest( (int) TestDataGenerator.getRandomNumber( -5, 3 ) ); dataAxisProperties.setUseDollarSigns( TestDataGenerator.getRandomNumber( 1 ) > 0.5d ); dataAxisProperties.setUseCommas( TestDataGenerator.getRandomNumber( 1 ) > 0.5d ); //axisProperties.setShowAxisTitle( AxisProperties.X_AXIS, TestDataGenerator.getRandomNumber( 1 ) > 0.5d ); //axisProperties.setShowAxisTitle( AxisProperties.Y_AXIS, TestDataGenerator.getRandomNumber( 1 ) > 0.5d ); //axisProperties.setShowGridLine( AxisProperties.X_AXIS, (int) TestDataGenerator.getRandomNumber( 3 ) ); //axisProperties.setShowGridLine( AxisProperties.X_AXIS, AxisProperties.GRID_LINES_ONLY_WITH_LABELS ); //axisProperties.setShowGridLine( AxisProperties.Y_AXIS, (int) TestDataGenerator.getRandomNumber( 3 ) ); dataAxisProperties.setShowEndBorder( TestDataGenerator.getRandomNumber( 1 ) > 0.5d ); labelAxisProperties.setShowEndBorder( TestDataGenerator.getRandomNumber( 1 ) > 0.5d ); // axisProperties.setShowTicks( AxisProperties.X_AXIS, (int) TestDataGenerator.getRandomNumber( 3 ) ); //axisProperties.setShowTicks( AxisProperties.X_AXIS, AxisProperties.TICKS_ONLY_WITH_LABELS ); //axisProperties.setShowTicks( AxisProperties.Y_AXIS, (int) TestDataGenerator.getRandomNumber( 3 ) ); //axisProperties.setShowZeroLine( TestDataGenerator.getRandomNumber( 1 ) > 0.5d ); //axisProperties.setZeroLinePaint( TestDataGenerator.getRandomPaint() ); // axisProperties.setScaleFont( TestDataGenerator.getRandomFont( 12.0, 15.0 ) ); //axisProperties.setScaleFontColor( TestDataGenerator.getRandomPaint() ); //axisProperties.setAxisTitleFont( TestDataGenerator.getRandomFont( 6.0, 20.0 ) ); axisProperties.getXAxisProperties().setAxisStroke( new ChartStroke( new BasicStroke( 1.5f ), TestDataGenerator.getRandomPaint() ) ); axisProperties.getYAxisProperties().setAxisStroke( new ChartStroke( new BasicStroke( 1.5f ), TestDataGenerator.getRandomPaint() ) ); //axisProperties.setBackgroundPaint( TestDataGenerator.getRandomPaint() ); } /****************************************************************************************** * Takes the passed Legend and randomizes it. * * @param legendProperties ******************************************************************************************/ protected static void randomizeLegend( LegendProperties legendProperties ) { Font font; int fontSize; int numColumns=(int) TestDataGenerator.getRandomNumber( 1, 6 ); if( numColumns == 6 ) { numColumns=LegendAreaProperties.COLUMNS_AS_MANY_AS_NEEDED; } legendProperties.setNumColumns( numColumns ); legendProperties.setPlacement( (int) TestDataGenerator.getRandomNumber( 4 ) ); fontSize=(int) TestDataGenerator.getRandomNumber( 6, 20 ); font=ALL_FONTS[ (int) TestDataGenerator.getRandomNumber( ALL_FONTS.length ) ]; font=font.deriveFont( (float) fontSize ); legendProperties.setChartFont( new ChartFont( font, TestDataGenerator.getRandomPaint() ) ); //---random between null and having a color. if( (int) TestDataGenerator.getRandomNumber( 2 ) == 0 ) { legendProperties.setBorderStroke( null ); } else { legendProperties.setBorderStroke( ChartStroke.DEFAULT_LEGEND_OUTLINE ); } //---random between null and having a color. if( (int) TestDataGenerator.getRandomNumber( 2 ) == 0 ) { legendProperties.setBackgroundPaint( null ); } else { legendProperties.setBackgroundPaint( TestDataGenerator.getRandomPaint() ); } } }