Skip to content

Commit

Permalink
Added Csv Result renderer
Browse files Browse the repository at this point in the history
  • Loading branch information
bgpearson committed Jan 31, 2018
1 parent 76c63f2 commit 40d4bb1
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/Factories/ResultsRendererFactory.php
Expand Up @@ -3,13 +3,15 @@
namespace Churn\Factories;

use Churn\Renderers\Results\ConsoleResultsRenderer;
use Churn\Renderers\Results\CsvResultsRenderer;
use Churn\Renderers\Results\JsonResultsRenderer;
use Churn\Renderers\Results\ResultsRendererInterface;
use InvalidArgumentException;

class ResultsRendererFactory
{
const FORMAT_JSON = 'json';
const FORMAT_CSV = 'csv';
const FORMAT_TEXT = 'text';

/**
Expand All @@ -20,6 +22,10 @@ class ResultsRendererFactory
*/
public function getRenderer(string $format): ResultsRendererInterface
{
if ($format === self::FORMAT_CSV) {
return new CsvResultsRenderer;
}

if ($format === self::FORMAT_JSON) {
return new JsonResultsRenderer;
}
Expand Down
33 changes: 33 additions & 0 deletions src/Renderers/Results/CsvResultsRenderer.php
@@ -0,0 +1,33 @@
<?php declare(strict_types = 1);

namespace Churn\Renderers\Results;

use Churn\Results\ResultCollection;
use Symfony\Component\Console\Output\OutputInterface;

class CsvResultsRenderer implements ResultsRendererInterface
{
/**
* Renders the results.
* @param OutputInterface $output Output Interface.
* @param ResultCollection $results Result Collection.
* @return void
*/
public function render(OutputInterface $output, ResultCollection $results)
{
$output->writeln($this->getHeader());

foreach ($results->toArray() as $result) {
$output->writeln(implode(';', [ '"'.$result[0].'"', $result[1], $result[2], $result[3] ]));
};
}

/**
* Get the header.
* @return string
*/
private function getHeader(): string
{
return '"File";"Times Changed";"Complexity";"Score"';
}
}
7 changes: 7 additions & 0 deletions tests/Unit/Factories/ResultsRendererFactoryTest.php
Expand Up @@ -4,6 +4,7 @@

use Churn\Factories\ResultsRendererFactory;
use Churn\Renderers\Results\ConsoleResultsRenderer;
use Churn\Renderers\Results\CsvResultsRenderer;
use Churn\Renderers\Results\JsonResultsRenderer;
use Churn\Tests\BaseTestCase;
use InvalidArgumentException;
Expand All @@ -27,6 +28,12 @@ public function it_returns_the_json_renderer_when_provided_json_format()
$this->assertInstanceOf(JsonResultsRenderer::class, $this->factory->getRenderer('json'));
}

/** @test **/
public function it_returns_the_csv_renderer_when_provided_csv_format()
{
$this->assertInstanceOf(CsvResultsRenderer::class, $this->factory->getRenderer('csv'));
}

/** @test **/
public function it_returns_the_console_renderer_when_provided_text_format()
{
Expand Down
39 changes: 39 additions & 0 deletions tests/Unit/Renderers/Results/CsvResultsRendererTest.php
@@ -0,0 +1,39 @@
<?php

use Churn\Renderers\Results\CsvResultsRenderer;
use Churn\Results\Result;
use Mockery as m;
use Churn\Tests\BaseTestCase;
use Churn\Results\ResultCollection;
use Symfony\Component\Console\Output\OutputInterface;

class CsvResultsRendererTest extends BaseTestCase
{
/** @test **/
public function it_can_be_instantiated()
{
$this->assertInstanceOf(CsvResultsRenderer::class, new CsvResultsRenderer);
}

/** @test **/
public function it_can_render_the_results_as_json()
{
$resultCollection = new ResultCollection([
new Result(['file' => 'filename1.php', 'commits' => 5, 'complexity' => 7]),
new Result(['file' => 'filename2.php', 'commits' => 3, 'complexity' => 4]),
new Result(['file' => 'filename3.php', 'commits' => 1, 'complexity' => 5]),
new Result(['file' => 'filename4.php', 'commits' => 1, 'complexity' => 1]),
new Result(['file' => 'filename5.php', 'commits' => 8, 'complexity' => 1]),
]);

$output = m::mock(OutputInterface::class);
$output->shouldReceive('writeln')->once()->with('"File";"Times Changed";"Complexity";"Score"');
$output->shouldReceive('writeln')->once()->with('"filename1.php";5;7;0.625');
$output->shouldReceive('writeln')->once()->with('"filename2.php";3;4;0.242');
$output->shouldReceive('writeln')->once()->with('"filename3.php";1;5;0.08');
$output->shouldReceive('writeln')->once()->with('"filename4.php";1;1;-0.225');
$output->shouldReceive('writeln')->once()->with('"filename5.php";8;1;0.143');

(new CsvResultsRenderer)->render($output, $resultCollection);
}
}

0 comments on commit 40d4bb1

Please sign in to comment.