diff --git a/src/Factories/ResultsRendererFactory.php b/src/Factories/ResultsRendererFactory.php index 2c96dc85..76190854 100644 --- a/src/Factories/ResultsRendererFactory.php +++ b/src/Factories/ResultsRendererFactory.php @@ -3,6 +3,7 @@ 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; @@ -10,6 +11,7 @@ class ResultsRendererFactory { const FORMAT_JSON = 'json'; + const FORMAT_CSV = 'csv'; const FORMAT_TEXT = 'text'; /** @@ -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; } diff --git a/src/Renderers/Results/CsvResultsRenderer.php b/src/Renderers/Results/CsvResultsRenderer.php new file mode 100644 index 00000000..aacfbe44 --- /dev/null +++ b/src/Renderers/Results/CsvResultsRenderer.php @@ -0,0 +1,33 @@ +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"'; + } +} diff --git a/tests/Unit/Factories/ResultsRendererFactoryTest.php b/tests/Unit/Factories/ResultsRendererFactoryTest.php index 4e3c3577..2bf67c6a 100644 --- a/tests/Unit/Factories/ResultsRendererFactoryTest.php +++ b/tests/Unit/Factories/ResultsRendererFactoryTest.php @@ -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; @@ -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() { diff --git a/tests/Unit/Renderers/Results/CsvResultsRendererTest.php b/tests/Unit/Renderers/Results/CsvResultsRendererTest.php new file mode 100644 index 00000000..b8a469fb --- /dev/null +++ b/tests/Unit/Renderers/Results/CsvResultsRendererTest.php @@ -0,0 +1,39 @@ +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); + } +}