public function setLibrary($library) { $this->logger->debug("Altamira library set to " . $library . "!"); $this->library = $library; if ($library == \Altamira\JsWriter\Flot::LIBRARY) { ChartRenderer::pushRenderer('\\Altamira\\ChartRenderer\\DefaultRenderer'); ChartRenderer::pushRenderer('\\Altamira\\ChartRenderer\\TitleRenderer'); } }
<?php include __DIR__ . '/autoload.php'; ini_set('display_errors', 'on'); error_reporting(E_ALL); use Altamira\Chart; use Altamira\ChartIterator; use Altamira\Series; use Altamira\ChartRenderer; use Altamira\Config; use Altamira\ChartDatum\TwoDimensionalPointFactory; \Altamira\Config::setConfigFile('altamira-config.ini'); $library = isset($_GET['library']) ? $_GET['library'] : \Altamira\JsWriter\JqPlot::LIBRARY; if ($library == \Altamira\JsWriter\Flot::LIBRARY) { ChartRenderer::pushRenderer('Altamira\\ChartRenderer\\DefaultRenderer'); ChartRenderer::pushRenderer('Altamira\\ChartRenderer\\TitleRenderer'); } $chart = new Chart('chart1', $library); $series1Points = TwoDimensionalPointFactory::getFromYValues(array(2, 8, 5, 3, 8, 9, 7, 8, 4, 2, 1, 6)); $series2Points = TwoDimensionalPointFactory::getFromYValues(array(7, 3, 7, 8, 2, 3, 1, 2, 5, 7, 8, 3)); $chart->addSeries($chart->createSeries($series1Points, 'Sales'))->addSeries($chart->createSeries($series2Points, 'Returns'))->setTitle('Basic Line Chart')->setAxisOptions('y', 'formatString', '$%d')->setAxisOptions('x', 'tickInterval', 1)->setAxisOptions('x', 'min', 0)->setLegend(array('on' => true))->setAxisOptions('x', 'min', 0)->setAxisOptions('x', 'max', 14)->setAxisOptions('y', 'min', 0)->setAxisOptions('y', 'max', 10); $seriesPoints = TwoDimensionalPointFactory::getFromNested(array(array('1/4/1990', 850), array('2/27/1991', 427), array('1/6/1994', 990), array('8/6/1994', 127), array('12/25/1995', 325))); $chart2 = new Chart('chart2', $library); $series = $chart2->createSeries($seriesPoints, 'Measured Readings'); $series->useLabels(array('a', 'b', 'c', 'd', 'e'))->setLabelSetting('location', 'w')->setLabelSetting('xpadding', 8)->setLabelSetting('ypadding', 8); $chart2->setTitle('Line Chart With Highlights and Labels')->addSeries($series)->useDates()->useHighlighting(); $chart3 = new Chart('chart3', $library); $seriesA = $chart3->createSeries(TwoDimensionalPointFactory::getFromYValues(array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)), 'First'); $seriesB = $chart3->createSeries(TwoDimensionalPointFactory::getFromYValues(array(1, 10, 2, 9, 3, 8, 4, 7, 5, 6)), 'Second'); $seriesC = $chart3->createSeries(TwoDimensionalPointFactory::getFromYValues(array(10, 7, 6, 5, 3, 1, 3, 5, 6, 7)), 'Third'); // These styles are only supported by Flot
/** * @covers \Altamira\ChartRenderer::__construct * @covers \Altamira\ChartRenderer::getInstance * @covers \Altamira\ChartRenderer::pushRenderer * @covers \Altamira\ChartRenderer::render * @covers \Altamira\ChartRenderer::reset * @covers \Altamira\ChartRenderer::unshiftRenderer */ public function testChartRenderer() { $method = new ReflectionMethod('\\Altamira\\ChartRenderer', '__construct'); $this->assertTrue($method->isProtected(), '\\Altamira\\ChartRenderer should implement singleton design pattern'); $styleOptions = array('float' => 'left', 'border' => '1px solid #cccccc'); $mockChart = $this->getMock('\\Altamira\\Chart', array('getLibrary', 'getName', 'getTitle'), array('Mock Chart')); $mockChart->expects($this->any())->method('getLibrary')->will($this->returnValue('flot')); $mockChart->expects($this->any())->method('getName')->will($this->returnValue('foo')); $mockChart->expects($this->any())->method('getTitle')->will($this->returnValue('foo')); $expectedStyle = 'float: left; border: 1px solid #cccccc; '; $defaultOutput = \Altamira\ChartRenderer::render($mockChart, $styleOptions); $expectedOutput = <<<ENDOUTPUT <div class="flot" id="foo" style="{$expectedStyle}"></div> ENDOUTPUT; $this->assertEquals($expectedOutput, $defaultOutput, '\\Altamira\\ChartRenderer::render() should render the chart using only \\Altamira\\ChartRenderer\\DefaultRenderer by default'); $getInstanceMethod = new ReflectionMethod('\\Altamira\\ChartRenderer', 'getInstance'); $getInstanceMethod->setAccessible(true); $instance = $getInstanceMethod->invoke(null); $this->assertEquals($instance, \Altamira\ChartRenderer::pushRenderer('\\Altamira\\ChartRenderer\\TitleRenderer'), '\\Altamira\\ChartRenderer::pushRenderer should provide a fluent interface'); $exception = null; try { \Altamira\ChartRenderer::pushRenderer('\\Altamira\\Chart'); } catch (Exception $exception) { } $this->assertInstanceOf('UnexpectedValueException', $exception); $exception = null; try { \Altamira\ChartRenderer::unshiftRenderer('\\Altamira\\Chart'); } catch (Exception $exception) { } $this->assertInstanceOf('UnexpectedValueException', $exception); $rendererChain = new ReflectionProperty('\\Altamira\\ChartRenderer', 'rendererChain'); $rendererChain->setAccessible('true'); $this->assertEquals(array('\\Altamira\\ChartRenderer\\DefaultRenderer', '\\Altamira\\ChartRenderer\\TitleRenderer'), $rendererChain->getValue($instance), '\\Altamira\\ChartRenderer::pushRenderer should add the renderer to the end of the renderer chain'); $fullExpectedOutput = <<<ENDOUTPUT <div class="altamira-chart-title"> <h3>foo</h3> <div class="flot" id="foo" style="{$expectedStyle}"></div></div> ENDOUTPUT; $this->assertEquals($fullExpectedOutput, \Altamira\ChartRenderer::render($mockChart, $styleOptions), '\\Alamira\\ChartRenderer::render() should take a nested approach to parsing, ' . 'prerendering from the top of the stack to the bottom, and postrendering from the bottom to the top.'); \Altamira\ChartRenderer::reset(); $this->assertEmpty($rendererChain->getValue($instance), '\\Altamira\\ChartRenderer::reset() should empty the renderer chain'); \Altamira\ChartRenderer::unshiftRenderer('\\Altamira\\ChartRenderer\\DefaultRenderer'); \Altamira\ChartRenderer::unshiftRenderer('\\Altamira\\ChartRenderer\\TitleRenderer'); $this->assertEquals(array('\\Altamira\\ChartRenderer\\TitleRenderer', '\\Altamira\\ChartRenderer\\DefaultRenderer'), $rendererChain->getValue($instance), '\\Altamira\\ChartRenderer::pushRenderer should add the renderer to the beginning of the renderer chain'); $method = new ReflectionMethod('\\Altamira\\ChartRenderer', 'getInstance'); $method->setAccessible(true); $property = new ReflectionProperty('\\Altamira\\ChartRenderer', 'instance'); $mockChartRenderer = $this->getMockBuilder('\\Altamira\\ChartRenderer')->disableOriginalConstructor()->getMock(); $property->setAccessible(true); $property->setValue(null); $this->assertInstanceOf('\\Altamira\\ChartRenderer', $method->invoke($mockChartRenderer)); $property = new ReflectionProperty('\\Altamira\\ChartRenderer', 'rendererChain'); $property->setAccessible(true); $property->setValue(array()); \Altamira\ChartRenderer::render($mockChart); $this->assertNotEmpty($property->getValue(), '\\Altamira\\ChartRenderer should push a default renderer by default if it has no renderers set'); }