SubStreamTest   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 70
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 0
Metric Value
dl 0
loc 70
rs 10
c 0
b 0
f 0
wmc 6
lcom 1
cbo 1

4 Methods

Rating   Name   Duplication   Size   Complexity  
A setUp() 0 8 2
A offsetProvider() 0 14 1
A testSubStream() 0 17 2
A testReadWithoutSeek() 0 14 1
1
<?php
2
3
namespace iqb\stream;
4
5
use iqb\ErrorMessage;
6
use PHPUnit\Framework\TestCase;
7
8
class SubStreamTest extends TestCase
9
{
10
    private $string;
11
    private $memoryStream;
12
    private $filename = __DIR__ . '/ipsum.txt';
13
14
15
    public function setUp()
16
    {
17
        $this->string = \file_get_contents($this->filename);
18
        $this->memoryStream = \fopen('php://memory', 'r+');
19
        if (\strlen($this->string) !== ($bytesWritten = \fwrite($this->memoryStream, $this->string))) {
20
            throw new \RuntimeException('Setup failed!: ' . $bytesWritten);
21
        }
22
    }
23
24
25
    public function offsetProvider()
26
    {
27
        $length = \filesize($this->filename);
28
29
        return [
30
            "SubStream for 0:$length" => [0, $length, 0, $length, 31, 32],
31
            "SubStream for 10:" . ($length-10) => [10, $length-10, 10, $length-10, 31, 32],
32
            "SubStream for " . ($length-53) . ':53' => [$length-53, 53, 0, 55, 31, 32],
33
34
            // Different seek variants
35
            "SubStream for " . ($length-350) . ':256 and SEEK_CUR' => [$length-350, 256, 0, 256, 1, 32, \SEEK_CUR],
36
            "SubStream for " . ($length-350) . ':256 and SEEK_END' => [$length-350, 256, -256, 0, 1, 32, \SEEK_END],
37
        ];
38
    }
39
40
41
    /**
42
     * @dataProvider offsetProvider
43
     */
44
    public function testSubStream(int $offset, int $length, int $iterationStart, int $iterationLimit, int $iterationStep, int $probeLength, int $seekMode = \SEEK_SET)
45
    {
46
        $subStream = \fopen(SUBSTREAM_SCHEME . '://' . $offset . ':' . $length . '/' . (int)$this->memoryStream, 'r');
47
        $this->assertTrue(\is_resource($subStream));
48
49
        $referenceName = \tempnam(\sys_get_temp_dir(), 'phpunit_substream_ref');
50
        $referenceStream = \fopen($referenceName, 'r+');
51
        $this->assertSame($length, \fwrite($referenceStream, \substr($this->string, $offset, $length)));
52
        \fclose($referenceStream);
53
        $referenceStream = \fopen($referenceName, 'r');
54
55
        for ($i=$iterationStart; $i<$iterationLimit; $i+=$iterationStep) {
56
            \fseek($referenceStream, $i, $seekMode);
57
            \fseek($subStream, $i, $seekMode);
58
            $this->assertEquals($string = \fread($referenceStream, $probeLength), \fread($subStream, $probeLength), "Iteration: $i");
59
        }
60
    }
61
62
63
    public function testReadWithoutSeek()
64
    {
65
        $offset = 500;
66
        $length = 1000;
67
68
        $subStream = \fopen(SUBSTREAM_SCHEME . '://' . $offset . ':' . $length . '/' . (int)$this->memoryStream, 'r');
69
        $this->assertTrue(\is_resource($subStream));
70
71
        $referenceStream = \fopen('php://memory', 'r+');
72
        $this->assertSame($length, \fwrite($referenceStream, \substr($this->string, $offset, $length)));
73
        \fseek($referenceStream, 0);
74
75
        $this->assertEquals(\fread($subStream, 2*$length), \fread($referenceStream, 2*$length));
76
    }
77
}
78