Skip to content

Commit edf25aa

Browse files
Merge pull request #2 from robiningelbrecht/enable-disable-at-runtime
Enable/disable at runtime
2 parents 4681dcd + c6a53f9 commit edf25aa

File tree

7 files changed

+293
-3
lines changed

7 files changed

+293
-3
lines changed

README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,16 @@ Also make sure the `color` attribute is set to `true`:
7878
</extensions>
7979
```
8080

81+
* Disable pretty print. This can be useful when you only want to prettify the output when forced via CLI (see <a href="#usage">usage</a>).
82+
83+
```xml
84+
<extensions>
85+
<bootstrap class="RobinIngelbrecht\PHPUnitPrettyPrint\PhpUnitExtension">
86+
<parameter name="enableByDefault" value="false"/>
87+
</bootstrap>
88+
</extensions>
89+
```
90+
8191
## Usage
8292

8393
```bash
@@ -118,6 +128,13 @@ Display Chuck Norris quote
118128
<img src="readme/example-quote.png" alt="Example quote">
119129
</p>
120130

131+
Enable/disable pretty print
132+
133+
```bash
134+
> vendor/bin/phpunit -d --enable-pretty-print
135+
> vendor/bin/phpunit -d --disable-pretty-print
136+
```
137+
121138
Combine multiple options
122139

123140
```bash

src/Configuration.php

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ public function useCompactMode(): bool
3131
public static function fromParameterCollection(ParameterCollection $parameters): self
3232
{
3333
if (!$useProfiling = in_array('--profiling', $_SERVER['argv'], true)) {
34-
$useProfiling = $parameters->has('displayProfiling') && $parameters->get('displayProfiling');
34+
$useProfiling = $parameters->has('displayProfiling') && !self::isFalsy($parameters->get('displayProfiling'));
3535
}
3636
if (!$useCompactMode = in_array('--compact', $_SERVER['argv'], true)) {
37-
$useCompactMode = $parameters->has('useCompactMode') && $parameters->get('useCompactMode');
37+
$useCompactMode = $parameters->has('useCompactMode') && !self::isFalsy($parameters->get('useCompactMode'));
3838
}
3939
if (!$displayQuote = in_array('--display-quote', $_SERVER['argv'], true)) {
40-
$displayQuote = $parameters->has('displayQuote') && $parameters->get('displayQuote');
40+
$displayQuote = $parameters->has('displayQuote') && !self::isFalsy($parameters->get('displayQuote'));
4141
}
4242

4343
return new self(
@@ -46,4 +46,22 @@ public static function fromParameterCollection(ParameterCollection $parameters):
4646
$useCompactMode,
4747
);
4848
}
49+
50+
public static function isFalsy(mixed $value): bool
51+
{
52+
if (is_bool($value)) {
53+
return !$value;
54+
}
55+
if ('true' === $value) {
56+
return false;
57+
}
58+
if ('false' === $value) {
59+
return true;
60+
}
61+
if (is_int($value)) {
62+
return !$value;
63+
}
64+
65+
return true;
66+
}
4967
}

src/PhpUnitExtension.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ final class PhpUnitExtension implements Extension
1313
{
1414
public function bootstrap(PHPUnitConfiguration $configuration, Facade $facade, ParameterCollection $parameters): void
1515
{
16+
if (!$this->isEnabled($parameters)) {
17+
return;
18+
}
19+
1620
$configuration = Configuration::fromParameterCollection($parameters);
1721

1822
$facade->replaceOutput();
@@ -34,4 +38,27 @@ public function bootstrap(PHPUnitConfiguration $configuration, Facade $facade, P
3438
}
3539
$facade->registerSubscriber(new ApplicationFinishedSubscriber());
3640
}
41+
42+
private function isEnabled(ParameterCollection $parameters): bool
43+
{
44+
if (!$parameters->has('enableByDefault') &&
45+
!in_array('--enable-pretty-print', $_SERVER['argv'], true) &&
46+
!in_array('--disable-pretty-print', $_SERVER['argv'], true)) {
47+
// Nothing has been set, assume the extension is enabled for backwards compatible reasons.
48+
return true;
49+
}
50+
51+
if (in_array('--enable-pretty-print', $_SERVER['argv'], true)) {
52+
return true;
53+
}
54+
if (in_array('--disable-pretty-print', $_SERVER['argv'], true)) {
55+
return false;
56+
}
57+
58+
if ($parameters->has('enableByDefault') && !Configuration::isFalsy($parameters->get('enableByDefault'))) {
59+
return true;
60+
}
61+
62+
return false;
63+
}
3764
}

tests/OutputTest.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,4 +126,29 @@ public function testPrintWithQuoteAtRuntime(): void
126126
$this->fail('Quote not found');
127127
}
128128
}
129+
130+
public function testItShouldBeEnabled(): void
131+
{
132+
$command = [
133+
'vendor/bin/phpunit',
134+
'tests/ExampleTests/TestThatPassesTest.php',
135+
'--configuration=tests/phpunit.test-disable-by-default.xml',
136+
'-d --enable-pretty-print',
137+
];
138+
exec(implode(' ', $command), $out);
139+
$output = implode(PHP_EOL, $out);
140+
$this->assertStringContainsString('Tests: 2 passed (4 assertions)', $output);
141+
}
142+
143+
public function testItShouldBeDisabled(): void
144+
{
145+
$command = [
146+
'vendor/bin/phpunit',
147+
'tests/ExampleTests/TestThatPassesTest.php',
148+
'--configuration=tests/phpunit.test-disable-by-default.xml',
149+
];
150+
exec(implode(' ', $command), $out);
151+
$output = implode(PHP_EOL, $out);
152+
$this->assertStringContainsString('OK (2 tests, 4 assertions)', $output);
153+
}
129154
}

tests/Unit/ConfigurationTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,16 @@ public function testFromParameterCollectionWithServerArguments(): void
5454
$this->assertTrue($configuration->useCompactMode());
5555
$this->assertTrue($configuration->displayQuote());
5656
}
57+
58+
public function testIsFalsy(): void
59+
{
60+
$this->assertTrue(Configuration::isFalsy(0));
61+
$this->assertTrue(Configuration::isFalsy('false'));
62+
$this->assertTrue(Configuration::isFalsy(false));
63+
$this->assertTrue(Configuration::isFalsy('test'));
64+
65+
$this->assertFalse(Configuration::isFalsy(1));
66+
$this->assertFalse(Configuration::isFalsy('true'));
67+
$this->assertFalse(Configuration::isFalsy(true));
68+
}
5769
}

tests/Unit/PhpUnitExtensionTest.php

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,4 +174,167 @@ public function testBootstrapWithDisplayQuote(): void
174174
$this->assertNotContains('COLLISION_PRINTER_COMPACT', array_keys($_SERVER));
175175
$this->assertNotContains('COLLISION_PRINTER_PROFILE', array_keys($_SERVER));
176176
}
177+
178+
public function testItShouldBeEnabledThroughCli(): void
179+
{
180+
$facade = $this->createMock(Facade::class);
181+
$configuration = (new Builder())->build([]);
182+
$parameters = ParameterCollection::fromArray([
183+
'displayProfiling' => 'true',
184+
'useCompactMode' => 'true',
185+
'displayQuote' => 'true',
186+
'enableByDefault' => 'false',
187+
]);
188+
189+
$extension = new PhpUnitExtension();
190+
191+
$facade
192+
->expects($this->once())
193+
->method('replaceOutput');
194+
195+
$facade
196+
->expects($this->once())
197+
->method('replaceProgressOutput');
198+
199+
$facade
200+
->expects($this->once())
201+
->method('replaceResultOutput');
202+
203+
$facade
204+
->expects($this->once())
205+
->method('registerSubscriber')
206+
->with(new ApplicationFinishedSubscriber());
207+
208+
$_SERVER['argv'][] = '--enable-pretty-print';
209+
210+
$extension->bootstrap(
211+
$configuration,
212+
$facade,
213+
$parameters
214+
);
215+
216+
$this->assertContains('COLLISION_PRINTER_COMPACT', array_keys($_SERVER));
217+
$this->assertContains('COLLISION_PRINTER_PROFILE', array_keys($_SERVER));
218+
}
219+
220+
public function testItShouldBeDisabledThroughCli(): void
221+
{
222+
$facade = $this->createMock(Facade::class);
223+
$configuration = (new Builder())->build([]);
224+
$parameters = ParameterCollection::fromArray([
225+
'displayProfiling' => 'true',
226+
'useCompactMode' => 'true',
227+
'displayQuote' => 'true',
228+
]);
229+
230+
$extension = new PhpUnitExtension();
231+
232+
$facade
233+
->expects($this->never())
234+
->method('replaceOutput');
235+
236+
$facade
237+
->expects($this->never())
238+
->method('replaceProgressOutput');
239+
240+
$facade
241+
->expects($this->never())
242+
->method('replaceResultOutput');
243+
244+
$facade
245+
->expects($this->never())
246+
->method('registerSubscriber')
247+
->with(new ApplicationFinishedSubscriber());
248+
249+
$_SERVER['argv'][] = '--disable-pretty-print';
250+
251+
$extension->bootstrap(
252+
$configuration,
253+
$facade,
254+
$parameters
255+
);
256+
257+
$this->assertNotContains('COLLISION_PRINTER_COMPACT', array_keys($_SERVER));
258+
$this->assertNotContains('COLLISION_PRINTER_PROFILE', array_keys($_SERVER));
259+
}
260+
261+
public function testItShouldBeEnabledWithParameter(): void
262+
{
263+
$facade = $this->createMock(Facade::class);
264+
$configuration = (new Builder())->build([]);
265+
$parameters = ParameterCollection::fromArray([
266+
'displayProfiling' => 'true',
267+
'useCompactMode' => 'true',
268+
'displayQuote' => 'true',
269+
'enableByDefault' => 'true',
270+
]);
271+
272+
$extension = new PhpUnitExtension();
273+
274+
$facade
275+
->expects($this->once())
276+
->method('replaceOutput');
277+
278+
$facade
279+
->expects($this->once())
280+
->method('replaceProgressOutput');
281+
282+
$facade
283+
->expects($this->once())
284+
->method('replaceResultOutput');
285+
286+
$facade
287+
->expects($this->once())
288+
->method('registerSubscriber')
289+
->with(new ApplicationFinishedSubscriber());
290+
291+
$extension->bootstrap(
292+
$configuration,
293+
$facade,
294+
$parameters
295+
);
296+
297+
$this->assertContains('COLLISION_PRINTER_COMPACT', array_keys($_SERVER));
298+
$this->assertContains('COLLISION_PRINTER_PROFILE', array_keys($_SERVER));
299+
}
300+
301+
public function testItShouldBeDisabledWithParameter(): void
302+
{
303+
$facade = $this->createMock(Facade::class);
304+
$configuration = (new Builder())->build([]);
305+
$parameters = ParameterCollection::fromArray([
306+
'displayProfiling' => 'true',
307+
'useCompactMode' => 'true',
308+
'displayQuote' => 'true',
309+
'enableByDefault' => 'false',
310+
]);
311+
312+
$extension = new PhpUnitExtension();
313+
314+
$facade
315+
->expects($this->never())
316+
->method('replaceOutput');
317+
318+
$facade
319+
->expects($this->never())
320+
->method('replaceProgressOutput');
321+
322+
$facade
323+
->expects($this->never())
324+
->method('replaceResultOutput');
325+
326+
$facade
327+
->expects($this->never())
328+
->method('registerSubscriber')
329+
->with(new ApplicationFinishedSubscriber());
330+
331+
$extension->bootstrap(
332+
$configuration,
333+
$facade,
334+
$parameters
335+
);
336+
337+
$this->assertNotContains('COLLISION_PRINTER_COMPACT', array_keys($_SERVER));
338+
$this->assertNotContains('COLLISION_PRINTER_PROFILE', array_keys($_SERVER));
339+
}
177340
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<phpunit
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.0/phpunit.xsd"
5+
beStrictAboutChangesToGlobalState="true"
6+
beStrictAboutOutputDuringTests="true"
7+
colors="true"
8+
defaultTestSuite="unit"
9+
cacheDirectory=".phpunit.cache">
10+
<extensions>
11+
<bootstrap class="RobinIngelbrecht\PHPUnitPrettyPrint\PhpUnitExtension">
12+
<parameter name="enableByDefault" value="false"/>
13+
</bootstrap>
14+
</extensions>
15+
16+
<testsuites>
17+
<testsuite name="unit">
18+
<directory>ExampleTests</directory>
19+
</testsuite>
20+
</testsuites>
21+
22+
<source>
23+
<include>
24+
<directory>src</directory>
25+
</include>
26+
</source>
27+
28+
</phpunit>

0 commit comments

Comments
 (0)