Completed
Branch output_parsers_refactor (69b7d7)
by Alessandro
02:50
created

FinalPrinter::printAllFailuresOutput()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 3

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 8
ccs 7
cts 7
cp 1
rs 9.4285
cc 3
eloc 4
nc 3
nop 0
crap 3
1
<?php
2
3
namespace Paraunit\Printer;
4
5
use Paraunit\Lifecycle\EngineEvent;
6
use Paraunit\Parser\OutputContainerBearerInterface;
7
use Paraunit\Parser\ProcessOutputParser;
8
use Paraunit\Process\ProcessResultInterface;
9
use Symfony\Component\Console\Output\OutputInterface;
10
11
/**
12
 * Class FinalPrinter.
13
 */
14
class FinalPrinter
15
{
16
    /** @var  ProcessOutputParser */
17
    private $processOutputParser;
18
    
19
    /** @var  OutputInterface */
20
    private $output;
21
22
    /**
23
     * FinalPrinter constructor.
24
     * @param ProcessOutputParser $processOutputParser
25
     */
26 7
    public function __construct(ProcessOutputParser $processOutputParser)
27
    {
28 7
        $this->processOutputParser = $processOutputParser;
29 7
    }
30
31
    /**
32
     * @param EngineEvent $engineEvent
33
     */
34 7
    public function onEngineEnd(EngineEvent $engineEvent)
35
    {
36 7
        if (!$engineEvent->has('start') || !$engineEvent->has('end') || !$engineEvent->has('process_completed')) {
37
            throw new \BadMethodCallException('missing argument/s');
38
        }
39
40 7
        $this->output = $engineEvent->getOutputInterface();
41 7
        $elapsedTime = $engineEvent->get('start')->diff($engineEvent->get('end'));
42 7
        $completedProcesses =  $engineEvent->get('process_completed');
43
44 7
        $this->output->writeln('');
45 7
        $this->output->writeln('');
46 7
        $this->output->writeln($elapsedTime->format('Execution time -- %H:%I:%S '));
47
48 7
        $this->output->writeln('');
49 7
        $this->output->write('Executed: ');
50 7
        $this->output->write(count($completedProcesses).' test classes, ');
51
52 7
        $testsCount = 0;
53 7
        foreach ($completedProcesses as $process) {
54 7
            $testsCount += count($process->getTestResults());
55 7
        }
56
57 7
        $this->output->writeln($testsCount.' tests');
58
59 7
        $this->printAllFailuresOutput();
60 7
        $this->printAllFilesRecap();
61
62 7
        $this->output->writeln('');
63 7
    }
64
65 7
    private function printAllFailuresOutput()
66
    {
67 7
        foreach ($this->processOutputParser->getParsers() as $parser) {
68 7
            if ($parser instanceof OutputContainerBearerInterface) {
69 7
                $this->printFailuresOutput($parser->getOutputContainer());
70 7
            }
71 7
        }
72 7
    }
73
74
    /**
75
     * @param OutputContainer $outputContainer
76
     */
77 7
    private function printFailuresOutput(OutputContainer $outputContainer)
78
    {
79 7
        $buffer = $outputContainer->getOutputBuffer();
80 7
        if (count($buffer)) {
81 4
            $tag = $outputContainer->getTag();
82 4
            $this->output->writeln('');
83 4
            $this->output->writeln(sprintf('<%s>%s output:</%s>', $tag, $outputContainer->getTitle(), $tag));
84
85 4
            $i = 1;
86
87 4
            foreach ($buffer as $line) {
88 4
                $this->output->writeln('');
89 4
                $this->output->writeln(
90 4
                    sprintf('<%s>%d)</%s> %s', $tag, $i++, $tag, $line)
91 4
                );
92 4
            }
93 4
        }
94 7
    }
95
96 7
    private function printAllFilesRecap()
97
    {
98 7
        foreach ($this->processOutputParser->getParsers() as $parser) {
99 7
            if ($parser instanceof OutputContainerBearerInterface) {
100 7
                $this->printFileRecap($parser->getOutputContainer());
101 7
            }
102 7
        }
103 7
    }
104
105
    /**
106
     * @param OutputContainer $outputContainer
107
     */
108 7
    private function printFileRecap(OutputContainer $outputContainer)
109
    {
110 7
        if ($outputContainer->countFiles()) {
111 6
            $tag = $outputContainer->getTag();
112 6
            $this->output->writeln('');
113 6
            $this->output->writeln(
114 6
                sprintf(
115 6
                    '<%s>%d files with %s:</%s>',
116 6
                    $tag,
117 6
                    $outputContainer->countFiles(),
118 6
                    strtoupper($outputContainer->getTitle()),
119
                    $tag
120 6
                )
121 6
            );
122
123 6
            foreach ($outputContainer->getFileNames() as $fileName) {
124 6
                $this->output->writeln(sprintf(' <%s>%s</%s>', $tag, $fileName, $tag));
125 6
            }
126 6
        }
127 7
    }
128
}
129