Merge pull request #1 from civicrm/master
[civicrm-core.git] / Civi / CiUtil / Command / CompareCommand.php
1 <?php
2 namespace Civi\CiUtil\Command;
3
4 /**
5 * Class CompareCommand
6 *
7 * @package Civi\CiUtil\Command
8 */
9 class CompareCommand {
10
11 /**
12 * @param $argv
13 */
14 public static function main($argv) {
15 if (empty($argv[1])) {
16 echo "summary: Compares the output of different test runs\n";
17 echo "usage: phpunit-compare [--out=txt|csv] [--phpunit-json|--jenkins-xml] <file1> <file2>...\n";
18 exit(1);
19 }
20
21 $parser = ['\Civi\CiUtil\PHPUnitParser', 'parseJsonResults'];
22 $printerType = 'txt';
23 // array('file' => string, 'results' => array)
24 $suites = [];
25 for ($i = 1; $i < count($argv); $i++) {
26 switch ($argv[$i]) {
27 case '--phpunit-json':
28 $parser = ['\Civi\CiUtil\PHPUnitParser', 'parseJsonResults'];
29 break;
30
31 case '--jenkins-xml':
32 $parser = ['\Civi\CiUtil\JenkinsParser', 'parseXmlResults'];
33 break;
34
35 case '--csv':
36 $parser = ['\Civi\CiUtil\CSVParser', 'parseResults'];
37 break;
38
39 case '--out=txt':
40 $printerType = 'txt';
41 break;
42
43 case '--out=csv':
44 $printerType = 'csv';
45 break;
46
47 default:
48 $suites[] = [
49 'file' => $argv[$i],
50 'results' => call_user_func($parser, file_get_contents($argv[$i])),
51 ];
52 }
53 }
54
55 // array(string $name)
56 $tests = [];
57 foreach ($suites as $suite) {
58 $tests = array_unique(array_merge(
59 $tests,
60 array_keys($suite['results'])
61 ));
62 }
63 sort($tests);
64
65 if ($printerType == 'csv') {
66 $printer = new \Civi\CiUtil\CsvPrinter('php://stdout', \Civi\CiUtil\Arrays::collect($suites, 'file'));
67 }
68 else {
69 $printer = new \Civi\CiUtil\ComparisonPrinter(\Civi\CiUtil\Arrays::collect($suites, 'file'));
70 }
71 foreach ($tests as $test) {
72 $values = [];
73 foreach ($suites as $suite) {
74 $values[] = isset($suite['results'][$test]) ? $suite['results'][$test] : 'MISSING';
75 }
76
77 if (count(array_unique($values)) > 1) {
78 $printer->printRow($test, $values);
79 }
80 }
81 }
82
83 }