Completed
Pull Request — master (#214)
by Mikhail
02:13
created

BaseRunner::addCoverageFromFile()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 13
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 4.25

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 13
ccs 6
cts 8
cp 0.75
rs 9.2
cc 4
eloc 7
nc 3
nop 1
crap 4.25
1
<?php
2
3
namespace ParaTest\Runners\PHPUnit;
4
5
use ParaTest\Coverage\CoverageMerger;
6
use ParaTest\Logging\LogInterpreter;
7
use ParaTest\Logging\JUnit\Writer;
8
9
abstract class BaseRunner
10
{
11
    const PHPUNIT_FATAL_ERROR = 255;
12
13
    /**
14
     * @var Options
15
     */
16
    protected $options;
17
18
    /**
19
     * @var \ParaTest\Logging\LogInterpreter
20
     */
21
    protected $interpreter;
22
23
    /**
24
     * @var ResultPrinter
25
     */
26
    protected $printer;
27
28
    /**
29
     * A collection of pending ExecutableTest objects that have
30
     * yet to run
31
     *
32
     * @var array
33
     */
34
    protected $pending = array();
35
36
    /**
37
     * A collection of ExecutableTest objects that have processes
38
     * currently running
39
     *
40
     * @var array
41
     */
42
    protected $running = array();
43
44
    /**
45
     * A tallied exit code that returns the highest exit
46
     * code returned out of the entire collection of tests
47
     *
48
     * @var int
49
     */
50
    protected $exitcode = -1;
51
52
    /**
53
     * CoverageMerger to hold track of the accumulated coverage
54
     *
55
     * @var CoverageMerger
56
     */
57
    protected $coverage = null;
58
59
60 8
    public function __construct($opts = array())
61
    {
62 8
        $this->options = new Options($opts);
63 8
        $this->interpreter = new LogInterpreter();
64 8
        $this->printer = new ResultPrinter($this->interpreter);
65 8
    }
66
67 2
    public function run()
68
    {
69 2
        $this->verifyConfiguration();
70 2
        $this->initCoverage();
71 2
        $this->load();
72 2
        $this->printer->start($this->options);
73 2
    }
74
75
    /**
76
     * Ensures a valid configuration was supplied. If not
77
     * causes ParaTest to print the error message and exit immediately
78
     * with an exit code of 1
79
     */
80 2
    protected function verifyConfiguration()
81
    {
82 2
        if (isset($this->options->filtered['configuration']) && !file_exists($this->options->filtered['configuration']->getPath())) {
0 ignored issues
show
Documentation introduced by
The property $filtered is declared protected in ParaTest\Runners\PHPUnit\Options. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
83
            $this->printer->println(sprintf('Could not read "%s".', $this->options->filtered['configuration']));
0 ignored issues
show
Documentation introduced by
The property $filtered is declared protected in ParaTest\Runners\PHPUnit\Options. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
84
            exit(1);
0 ignored issues
show
Coding Style Compatibility introduced by
The method verifyConfiguration() contains an exit expression.

An exit expression should only be used in rare cases. For example, if you write a short command line script.

In most cases however, using an exit expression makes the code untestable and often causes incompatibilities with other libraries. Thus, unless you are absolutely sure it is required here, we recommend to refactor your code to avoid its usage.

Loading history...
85
        }
86 2
    }
87
88
    /**
89
     * Builds the collection of pending ExecutableTest objects
90
     * to run. If functional mode is enabled $this->pending will
91
     * contain a collection of TestMethod objects instead of Suite
92
     * objects
93
     */
94 2
    protected function load()
95
    {
96 2
        $loader = new SuiteLoader($this->options);
97 2
        $loader->load($this->options->path);
0 ignored issues
show
Documentation introduced by
The property $path is declared protected in ParaTest\Runners\PHPUnit\Options. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
98 2
        $executables = $this->options->functional ? $loader->getTestMethods() : $loader->getSuites();
0 ignored issues
show
Documentation introduced by
The property $functional is declared protected in ParaTest\Runners\PHPUnit\Options. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
99 2
        $this->pending = array_merge($this->pending, $executables);
100 2
        foreach ($this->pending as $pending) {
101 2
            $this->printer->addTest($pending);
102 2
        }
103 2
    }
104
105
    /**
106
     * Returns the highest exit code encountered
107
     * throughout the course of test execution
108
     *
109
     * @return int
110
     */
111 1
    public function getExitCode()
112
    {
113 1
        return $this->exitcode;
114
    }
115
116
    /**
117
     * Write output to JUnit format if requested
118
     */
119 2
    protected function log()
120
    {
121 2
        if (!isset($this->options->filtered['log-junit'])) {
0 ignored issues
show
Documentation introduced by
The property $filtered is declared protected in ParaTest\Runners\PHPUnit\Options. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
122 1
            return;
123
        }
124 1
        $output = $this->options->filtered['log-junit'];
0 ignored issues
show
Documentation introduced by
The property $filtered is declared protected in ParaTest\Runners\PHPUnit\Options. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
125 1
        $writer = new Writer($this->interpreter, $this->options->path);
0 ignored issues
show
Documentation introduced by
The property $path is declared protected in ParaTest\Runners\PHPUnit\Options. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
126 1
        $writer->write($output);
127 1
    }
128
129
    /**
130
     * Write coverage to file if requested
131
     */
132 2
    protected function logCoverage()
133
    {
134 2
        if (!$this->hasCoverage()) {
135
            return;
136
        }
137
138 2
        $filteredOptions = $this->options->filtered;
0 ignored issues
show
Documentation introduced by
The property $filtered is declared protected in ParaTest\Runners\PHPUnit\Options. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
139
140 2
        $reporter = $this->getCoverage()->getReporter();
141
142 2
        if (isset($filteredOptions['coverage-clover'])) {
143 2
            $reporter->clover($filteredOptions['coverage-clover']);
144
        }
145
146 2
        if (isset($filteredOptions['coverage-html'])) {
147
            $reporter->html($filteredOptions['coverage-html']);
148
        }
149
150 2
        $reporter->php($filteredOptions['coverage-php']);
151 2
    }
152
153 2
    protected function initCoverage()
154
    {
155 2
        if (!isset($this->options->filtered['coverage-php'])) {
0 ignored issues
show
Documentation introduced by
The property $filtered is declared protected in ParaTest\Runners\PHPUnit\Options. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
156
            return;
157
        }
158
159 2
        $this->coverage = new CoverageMerger();
160 2
    }
161
162
    /**
163
     * @return bool
164
     */
165 2
    protected function hasCoverage()
166
    {
167 2
        return $this->getCoverage() !== null;
168
    }
169
170
    /**
171
     * @return CoverageMerger
172
     */
173 2
    protected function getCoverage()
174
    {
175 2
        return $this->coverage;
176
    }
177
178
}
179