heiglandreas/JUnitDiff

View on GitHub
src/Command/CompareCommand.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php
/**
 * Copyright (c) Andreas Heigl<andreas@heigl.org>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 *
 * @author    Andreas Heigl<andreas@heigl.org>
 * @copyright Andreas Heigl
 * @license   http://www.opensource.org/licenses/mit-license.php MIT-License
 * @since     14.06.2016
 * @link      http://github.com/heiglandreas/org.heigl.junitdiff
 */

namespace Org_Heigl\JUnitDiff\Command;

use Org_Heigl\JUnitDiff\JUnitMerger;
use Org_Heigl\JUnitDiff\JUnitParser;
use Org_Heigl\JUnitDiff\MergeResult;
use Org_Heigl\JUnitDiff\Style\DiffStyle;
use Org_Heigl\JUnitDiff\Writer\FileSummary;
use Org_Heigl\JUnitDiff\Writer\Legend;
use Org_Heigl\JUnitDiff\Writer\Standard;
use Org_Heigl\JUnitDiff\Writer\Quiet;
use Org_Heigl\JUnitDiff\Writer\Summary;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\Output;
use Symfony\Component\Console\Output\OutputInterface;

class CompareCommand extends Command
{
    protected function configure()
    {
        $this->setName('compare')
             ->setDescription('Compares two JUnit log files')
             ->setDefinition([
                 new InputArgument('base', InputArgument::REQUIRED, 'Base file for the comparison'),
                 new InputArgument('current', InputArgument::REQUIRED, 'Current file to compare against the base file')
             ])
             ->setHelp('');
    }


    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $style = new DiffStyle($input, $output);
        $style->title($this->getApplication()->getLongVersion());


        $parser = new JUnitParser();
        $merger = new JUnitMerger(new MergeResult($style));
        try {
            $mergeResult = $merger->merge(
                $parser->parseFile($input->getArgument('base')),
                $parser->parseFile($input->getArgument('current'))
            );
        } catch (\Exception $e) {
            $style->error($e->getMessage());
            return;
        }

        if ($output->getVerbosity() >= Output::VERBOSITY_NORMAL) {
            $writer = new Standard($style, $output->getVerbosity());
            $writer->write($mergeResult);
        }

        if ($output->getVerbosity() >= Output::VERBOSITY_VERBOSE) {
            $writer = new Legend(
                $style,
                basename($input->getArgument('base')),
                basename($input->getArgument('current'))
            );
            $writer->write($mergeResult);
        }

        if ($output->getVerbosity() >= Output::VERBOSITY_QUIET) {
            $writer = new FileSummary(
                $style,
                basename($input->getArgument('base')),
                basename($input->getArgument('current'))
            );

            $writer->write($mergeResult);
        }

        if ($output->getVerbosity() >= Output::VERBOSITY_QUIET) {
            $writer = new Summary(
                $style,
                basename($input->getArgument('base')),
                basename($input->getArgument('current'))
            );
            $writer->write($mergeResult);
        }
    }
}