Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
6 / 6
CRAP
100.00% covered (success)
100.00%
1 / 1
BufferedIo
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
6 / 6
7
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
2
 stdin
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 output
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 errorOutput
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 contents
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 hasColorSupport
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3declare(strict_types=1);
4
5namespace Celema\Console;
6
7use Override;
8
9/**
10 * An Io that captures everything in memory instead of writing to the
11 * terminal.
12 *
13 * Made for command tests: pass it to the command (or the Runner) and assert
14 * on `output()` and `errorOutput()`. Colors are always disabled, so
15 * assertions need no escape-code stripping. The `$input` string feeds
16 * `ask()` and `confirm()`, one line per prompt.
17 *
18 * @api
19 */
20final class BufferedIo extends Io
21{
22    private mixed $inputBuffer = null;
23
24    public function __construct(string $input = '')
25    {
26        parent::__construct('php://memory', 'php://memory');
27
28        if ($input !== '') {
29            $stream = $this->stdin();
30            fwrite($stream, $input);
31            rewind($stream);
32        }
33    }
34
35    #[Override]
36    protected function stdin(): mixed
37    {
38        // The parent opens its input target read-only, which php://memory
39        // honors, so the buffer needs its own read-write stream.
40        return $this->inputBuffer ??= fopen('php://memory', mode: 'w+');
41    }
42
43    public function output(): string
44    {
45        return $this->contents($this->stdout());
46    }
47
48    public function errorOutput(): string
49    {
50        return $this->contents($this->stderr());
51    }
52
53    private function contents(mixed $stream): string
54    {
55        $position = (int) ftell($stream);
56        rewind($stream);
57        $contents = (string) stream_get_contents($stream);
58        fseek($stream, $position);
59
60        return $contents;
61    }
62
63    #[Override]
64    protected function hasColorSupport(mixed $stream): bool
65    {
66        return false;
67    }
68}

Branches

Below are the source code lines that represent each code branch as identified by Xdebug. Please note a branch is not necessarily coterminous with a line, a line may contain multiple branches and therefore show up more than once. Please also be aware that some branches may be implicit rather than explicit, e.g. an if statement always has an else as part of its logical flow even if you didn't write one.

BufferedIo->__construct
24    public function __construct(string $input = '')
25    {
26        parent::__construct('php://memory', 'php://memory');
27
28        if ($input !== '') {
29            $stream = $this->stdin();
30            fwrite($stream, $input);
31            rewind($stream);
32        }
33    }
33    }
BufferedIo->contents
53    private function contents(mixed $stream): string
54    {
55        $position = (int) ftell($stream);
56        rewind($stream);
57        $contents = (string) stream_get_contents($stream);
58        fseek($stream, $position);
59
60        return $contents;
61    }
BufferedIo->errorOutput
50        return $this->contents($this->stderr());
51    }
BufferedIo->hasColorSupport
64    protected function hasColorSupport(mixed $stream): bool
65    {
66        return false;
67    }
BufferedIo->output
45        return $this->contents($this->stdout());
46    }
BufferedIo->stdin
40        return $this->inputBuffer ??= fopen('php://memory', mode: 'w+');
41    }