<?php
/**
 * ezcGraphLabeledAxisTest 
 * 
 * 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 Graph
 * @version //autogen//
 * @subpackage Tests
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 */

require_once dirname( __FILE__ ) . '/test_case.php';

/**
 * Tests for ezcGraph class.
 * 
 * @package Graph
 * @subpackage Tests
 */
class ezcGraphLabeledAxisTest extends ezcGraphTestCase
{
    protected $basePath;

    protected $tempDir;

	public static function suite()
	{
		return new PHPUnit_Framework_TestSuite( "ezcGraphLabeledAxisTest" );
	}

    protected function setUp()
    {
        static $i = 0;

        $this->tempDir = $this->createTempDir( __CLASS__ . sprintf( '_%03d_', ++$i ) ) . '/';
        $this->basePath = dirname( __FILE__ ) . '/data/';
    }

    protected function tearDown()
    {
        if ( !$this->hasFailed() )
        {
            $this->removeTempDir();
        }
    }

    protected function getRandomData( $count, $min = 0, $max = 1000, $randomize = 23 )
    {
        $data = parent::getRandomData( $count, $min, $max, $randomize );

        foreach ( $data as $k => $v )
        {
            $data[(string) ($k + 2000)] = $v;
            unset( $data[$k] );
        }

        return $data;
    }

    public function testFactoryLabeledAxis()
    {
        $chart = new ezcGraphLineChart();

        $this->assertTrue(
            $chart->xAxis instanceof ezcGraphChartElementLabeledAxis
        );
    }

    public function testAutomaticLabelingSingle()
    {
        $chart = new ezcGraphLineChart();
        $chart->data['sample'] = new ezcGraphArrayDataSet( array( 2000 => 20, 70, 12, 130 ) );
        $chart->render( 500, 200 );

        $this->assertSame(
            array(
                '2000',
                '2001',
                '2002',
                '2003',
            ),
            $this->readAttribute( $chart->xAxis, 'labels' )
        );
    }

    public function testAutomaticLabelingMultiple()
    {
        $chart = new ezcGraphLineChart();
        $chart->data['sample'] = new ezcGraphArrayDataSet( array( 2000 => 1045, 1300, 1012, 1450 ) );
        $chart->data['sample2'] = new ezcGraphArrayDataSet( array( 2002 => 1270, 1170, 1610, 1370 ) );
        $chart->render( 500, 200 );

        $this->assertSame(
            array(
                '2000',
                '2001',
                '2002',
                '2003',
                '2004',
                '2005',
            ),
            $this->readAttribute( $chart->xAxis, 'labels' )
        );
    }

    public function testAutomaticLabelingMultiple2()
    {
        $chart = new ezcGraphLineChart();
        $chart->data['sample'] = new ezcGraphArrayDataSet( array( 1 => 1, 3 => 3, 5 => 5, 8 => 8 ) );
        $chart->data['sample2'] = new ezcGraphArrayDataSet( array( 1, 2, 3, 4, 5, 6, 7, 8 ) );
        $chart->render( 500, 200 );

        $this->assertEquals(
            array( 0, 1, 2, 3, 4, 5, 6, 7, 8 ),
            $this->readAttribute( $chart->xAxis, 'labels' )
        );
    }

    public function testAutomaticLabelingMultipleMixed()
    {
        $chart = new ezcGraphLineChart();
        $chart->data['sample'] = new ezcGraphArrayDataSet( array( 2000 => 1045, 2001 => 1300, 2004 => 1012, 2006 => 1450 ) );
        $chart->data['sample2'] = new ezcGraphArrayDataSet( array( 2001 => 1270, 1170, 1610, 1370, 1559 ) );
        $chart->render( 500, 200 );

        $this->assertSame(
            array(
                '2000',
                '2001',
                '2002',
                '2003',
                '2004',
                '2005',
                '2006',
            ),
            $this->readAttribute( $chart->xAxis, 'labels' )
        );
    }

    public function testPositionLeft()
    {
        $chart = new ezcGraphLineChart();
        $chart->data['sample'] = new ezcGraphArrayDataSet( array( 2000 => 1045, 1300, 1012, 1450 ) );
        $chart->xAxis->position = ezcGraph::LEFT;
        $chart->render( 500, 200 );

        $this->assertEquals(
            .0,
            $chart->xAxis->getCoordinate( false ),
            'Wrong initial axis position. ',
            .05
        );

        $this->assertEquals(
            .0,
            $chart->xAxis->getCoordinate( '2000' ),
            'Wrong minimal value. ',
            .05
        );

        $this->assertEquals(
            .33,
            $chart->xAxis->getCoordinate( 2001 ),
            'Wrong mid value. ',
            .05
        );

        $this->assertEquals(
            1.,
            $chart->xAxis->getCoordinate( '2003' ),
            'Wrong maximum value. ',
            .05
        );

        $this->assertEquals(
            .0,
            $chart->xAxis->getCoordinate( '1991' ),
            'Wrong return for unknown value. ',
            .05
        );
    }

    public function testPositionRight()
    {
        $chart = new ezcGraphLineChart();
        $chart->data['sample'] = new ezcGraphArrayDataSet( array( 2000 => 1045, 1300, 1012, 1450 ) );
        $chart->xAxis->position = ezcGraph::RIGHT;
        $chart->render( 500, 200 );

        $this->assertEquals(
            1.,
            $chart->xAxis->getCoordinate( false ),
            'Wrong initial axis position. ',
            .05
        );

        $this->assertEquals(
            1.,
            $chart->xAxis->getCoordinate( '2000' ),
            'Wrong minimal value. ',
            .05
        );

        $this->assertEquals(
            .66,
            $chart->xAxis->getCoordinate( 2001 ),
            'Wrong mid value. ',
            .05
        );

        $this->assertEquals(
            .0,
            $chart->xAxis->getCoordinate( '2003' ),
            'Wrong maximum value. ',
            .05
        );

        $this->assertEquals(
            1.,
            $chart->xAxis->getCoordinate( '1991' ),
            'Wrong return for unknown value. ',
            .05
        );
    }

    public function testPositionTop()
    {
        $chart = new ezcGraphLineChart();
        $chart->data['sample'] = new ezcGraphArrayDataSet( array( 2000 => 1045, 1300, 1012, 1450 ) );
        $chart->xAxis->position = ezcGraph::TOP;
        $chart->render( 500, 200 );

        $this->assertEquals(
            .0,
            $chart->xAxis->getCoordinate( false ),
            'Wrong initial axis position. ',
            .05
        );

        $this->assertEquals(
            .0,
            $chart->xAxis->getCoordinate( '2000' ),
            'Wrong minimal value. ',
            .05
        );

        $this->assertEquals(
            .33,
            $chart->xAxis->getCoordinate( 2001 ),
            'Wrong mid value. ',
            .05
        );

        $this->assertEquals(
            1.,
            $chart->xAxis->getCoordinate( '2003' ),
            'Wrong maximum value. ',
            .05
        );

        $this->assertEquals(
            .0,
            $chart->xAxis->getCoordinate( '1991' ),
            'Wrong return for unknown value. ',
            .05
        );
    }

    public function testPositionBottom()
    {
        $chart = new ezcGraphLineChart();
        $chart->data['sample'] = new ezcGraphArrayDataSet( array( 2000 => 1045, 1300, 1012, 1450 ) );
        $chart->xAxis->position = ezcGraph::BOTTOM;
        $chart->render( 500, 200 );

        $this->assertEquals(
            1.,
            $chart->xAxis->getCoordinate( false ),
            'Wrong initial axis position. ',
            .05
        );

        $this->assertEquals(
            1.,
            $chart->xAxis->getCoordinate( '2000' ),
            'Wrong minimal value. ',
            .05
        );

        $this->assertEquals(
            .66,
            $chart->xAxis->getCoordinate( 2001 ),
            'Wrong mid value. ',
            .05
        );

        $this->assertEquals(
            .0,
            $chart->xAxis->getCoordinate( '2003' ),
            'Wrong maximum value. ',
            .05
        );

        $this->assertEquals(
            1.,
            $chart->xAxis->getCoordinate( '1991' ),
            'Wrong return for unknown value. ',
            .05
        );
    }

    public function testAutomaticLabelingWithLotsOfLabels()
    {
        $chart = new ezcGraphLineChart();
        $chart->data['sample'] = new ezcGraphArrayDataSet( array( 2000 => 1045, 1300, 1012, 1450, 341, 421, 452, 1203, 540, 1104, 1503, 1204, 1402, 652, 972, 230, 1502, 1305, 983, 872, 934, 1423 ) );
        $chart->render( 500, 200 );

        $this->assertEquals(
            array(
                2000,
                2003,
                2006,
                2009,
                2012,
                2015,
                2018,
                2021,
            ),
            $this->readAttribute( $chart->xAxis, 'displayedLabels' )
        );
    }

    public function testAutomaticLabelingWithLotsOfLabels2()
    {
        $labelCount = 31;
        $data = $this->getRandomData( $labelCount, 500, 2000, 2 );

        $chart = new ezcGraphLineChart();
        $chart->data['sample'] = new ezcGraphArrayDataSet( $data );
        $chart->render( 500, 200 );

        $this->assertEquals(
            array(
                2000,
                2003,
                2006,
                2009,
                2012,
                2015,
                2018,
                2021,
                2024,
                2027,
                2030,
            ),
            $this->readAttribute( $chart->xAxis, 'displayedLabels' )
        );
    }

    public function testAutomaticLabelingWithLotsOfLabels3()
    {
        $labelCount = 32;
        $data = $this->getRandomData( $labelCount, 500, 2000, 2 );

        $chart = new ezcGraphLineChart();
        $chart->data['sample'] = new ezcGraphArrayDataSet( $data );
        $chart->render( 500, 200 );

        $this->assertEquals(
            array(
                2000,
                2004,
                2007,
                2011,
                2014,
                2018,
                2021,
                2025,
                2028,
                2031,
            ),
            $this->readAttribute( $chart->xAxis, 'displayedLabels' )
        );
    }

    public function testAutomaticLabelingWithLotsOfLabels4()
    {
        $labelCount = 165;
        $data = $this->getRandomData( $labelCount, 500, 2000, 2 );

        $chart = new ezcGraphLineChart();
        $chart->data['sample'] = new ezcGraphArrayDataSet( $data );
        $chart->render( 500, 200 );

        $this->assertEquals(
            array(
                2000,
                2041,
                2082,
                2123,
                2164,
            ),
            $this->readAttribute( $chart->xAxis, 'displayedLabels' )
        );
    }

    public function testProvidedLabelsIdentity()
    {
        $chart = new ezcGraphLineChart();
        $chart->xAxis->provideLabels( array( 2000, 2001, 2002 ) );
        $chart->data['sample'] = new ezcGraphArrayDataSet( array( 
            2000 => 42,
            2001 => 23,
            2002 => 5,
        ) );
        $chart->render( 500, 200 );

        $this->assertEquals(
            array(
                2000,
                2001,
                2002,
            ),
            $this->readAttribute( $chart->xAxis, 'displayedLabels' )
        );
    }

    public function testProvidedLabelsReordered()
    {
        $chart = new ezcGraphLineChart();
        $chart->xAxis->provideLabels( array( 2002, 2001, 2000 ) );
        $chart->data['sample'] = new ezcGraphArrayDataSet( array( 
            2000 => 42,
            2001 => 23,
            2002 => 5,
        ) );
        $chart->render( 500, 200 );

        $this->assertEquals(
            array(
                2002,
                2001,
                2000,
            ),
            $this->readAttribute( $chart->xAxis, 'displayedLabels' )
        );
    }

    public function testProvidedLabelsAdditionalLabels()
    {
        $chart = new ezcGraphLineChart();
        $chart->xAxis->provideLabels( array( 2000, 2001, 2003, 2004, 2005 ) );
        $chart->data['sample'] = new ezcGraphArrayDataSet( array( 
            2001 => 23,
            2002 => 5,
            2004 => 42,
        ) );
        $chart->render( 500, 200 );

        $this->assertEquals(
            array(
                2000,
                2001,
                2002,
                2003,
                2004,
                2005,
            ),
            $this->readAttribute( $chart->xAxis, 'displayedLabels' )
        );
    }

    public function testGetLabel()
    {
        $chart = new ezcGraphLineChart();
        $chart->data['sample'] = new ezcGraphArrayDataSet( array( 2000 => 1045, 1300, 1012, 1450 ) );
        $chart->render( 500, 200 );

        $this->assertSame(
            '2001',
            $chart->xAxis->getLabel( 1 ),
            'Wrong label returned for step.'
        );
    }

    public function testGetNonexistantLabel()
    {
        $chart = new ezcGraphLineChart();
        $chart->data['sample'] = new ezcGraphArrayDataSet( array( 2000 => 1045, 1300, 1012, 1450 ) );
        $chart->render( 500, 200 );

        $this->assertSame(
            false,
            $chart->xAxis->getLabel( 5 ),
            'Wrong label returned for nonexisting step.'
        );
    }

    public function testRenderUnregularLabeling()
    {
        $filename = $this->tempDir . __FUNCTION__ . '.svg';

        $labelCount = 32;
        $data = $this->getRandomData( $labelCount, 500, 2000, 2 );

        $chart = new ezcGraphLineChart();
        $chart->data['sample'] = new ezcGraphArrayDataSet( $data );

        $chart->render( 500, 200, $filename );

        $this->compare(
            $filename,
            $this->basePath . 'compare/' . __CLASS__ . '_' . __FUNCTION__ . '.svg'
        );
    }

    public function testChartElementNumericAxisPropertyLabelCount()
    {
        $options = new ezcGraphChartElementLabeledAxis();

        $this->assertSame(
            null,
            $options->labelCount,
            'Wrong default value for property labelCount in class ezcGraphChartElementNumericAxis'
        );

        $options->labelCount = 10;
        $this->assertSame(
            10,
            $options->labelCount,
            'Setting property value did not work for property labelCount in class ezcGraphChartElementNumericAxis'
        );

        try
        {
            $options->labelCount = 1;
        }
        catch ( ezcBaseValueException $e )
        {
            return true;
        }

        $this->fail( 'Expected ezcBaseValueException.' );
    }

    public function testRenderManualLabelCount1()
    {
        $filename = $this->tempDir . __FUNCTION__ . '.svg';

        $labelCount = 4;
        $data = $this->getRandomData( $labelCount, 500, 2000, 2 );

        $chart = new ezcGraphLineChart();
        $chart->data['sample'] = new ezcGraphArrayDataSet( $data );

        // Set manual label count
        $chart->xAxis->labelCount = 3;

        $chart->render( 500, 200, $filename );

        $this->compare(
            $filename,
            $this->basePath . 'compare/' . __CLASS__ . '_' . __FUNCTION__ . '.svg'
        );
    }

    public function testRenderManualLabelCount2()
    {
        $filename = $this->tempDir . __FUNCTION__ . '.svg';

        $labelCount = 4;
        $data = $this->getRandomData( $labelCount, 500, 2000, 2 );

        $chart = new ezcGraphLineChart();
        $chart->data['sample'] = new ezcGraphArrayDataSet( $data );

        // Set manual label count
        $chart->xAxis->labelCount = 10;

        $chart->render( 500, 200, $filename );

        $this->compare(
            $filename,
            $this->basePath . 'compare/' . __CLASS__ . '_' . __FUNCTION__ . '.svg'
        );
    }

    public function testRenderManualLabelCount3()
    {
        $filename = $this->tempDir . __FUNCTION__ . '.svg';

        $labelCount = 35;
        $data = $this->getRandomData( $labelCount, 500, 2000, 2 );

        $chart = new ezcGraphLineChart();
        $chart->data['sample'] = new ezcGraphArrayDataSet( $data );

        // Set manual label count
        $chart->xAxis->labelCount = 7;

        $chart->render( 500, 200, $filename );

        $this->compare(
            $filename,
            $this->basePath . 'compare/' . __CLASS__ . '_' . __FUNCTION__ . '.svg'
        );
    }

    public function testRenderedLabels()
    {
        try
        {
            $chart = new ezcGraphLineChart();
            $chart->data['sample'] = new ezcGraphArrayDataSet( array( 2000 => 1045, 2001 => 1300, 2004 => 1012 ) );
            $chart->render( 500, 200 );
        }
        catch ( ezcGraphFontRenderingException $e )
        {
            // Ignore
        }

        $steps = $chart->xAxis->getSteps();

        $expectedLabels = array(
            '2000', '2001', '2004'
        );

        foreach ( $steps as $nr => $step )
        {
            $this->assertSame(
                $step->label,
                $expectedLabels[$nr],
                'Label not as expected'
            );
        }
    }

    public function testRenderedLabelsWithLabelFormattingCallback()
    {
        try
        {
            $chart = new ezcGraphLineChart();

            $chart->xAxis->labelCallback = create_function(
                '$label',
                'return "*$label*";'
            );

            $chart->data['sample'] = new ezcGraphArrayDataSet( array( 2000 => 1045, 2001 => 1300, 2004 => 1012 ) );
            $chart->render( 500, 200 );
        }
        catch ( ezcGraphFontRenderingException $e )
        {
            // Ignore
        }

        $steps = $chart->xAxis->getSteps();

        $expectedLabels = array(
            '*2000*', '*2001*', '*2004*'
        );

        foreach ( $steps as $nr => $step )
        {
            $this->assertSame(
                $step->label,
                $expectedLabels[$nr],
                'Label not as expected'
            );
        }
    }
}

?>
