Failed Conditions
Push — master ( 41a944...dc488d )
by Jonathan
9s
created

ReaderTest::testAdvanceToPastEof()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace EasyCSV\Tests;
6
7
use EasyCSV\Reader;
8
use PHPUnit\Framework\TestCase;
9
use function count;
10
use function is_array;
11
12
class ReaderTest extends TestCase
13
{
14
    /** @var string[] */
15
    protected $headers = ['column1', 'column2', 'column3'];
16
17
    /** @var string[][] */
18
    protected $expectedRows = [
19
        0 =>
20
            [
21
                'column1' => '1column2value',
22
                'column2' => '1column3value',
23
                'column3' => '1column4value',
24
            ],
25
        1 =>
26
            [
27
                'column1' => '2column2value',
28
                'column2' => '2column3value',
29
                'column3' => '2column4value',
30
            ],
31
        2 =>
32
            [
33
                'column1' => '3column2value',
34
                'column2' => '3column3value',
35
                'column3' => '3column4value',
36
            ],
37
        3 =>
38
            [
39
                'column1' => '4column2value',
40
                'column2' => '4column3value',
41
                'column3' => '4column4value',
42
            ],
43
        4 =>
44
            [
45
                'column1' => '5column2value',
46
                'column2' => '5column3value',
47
                'column3' => '5column4value',
48
            ],
49
    ];
50
51
    /** @var string[] */
52
    protected $dataRow1 = [
53
        'column1' => '1column2value',
54
        'column2' => '1column3value',
55
        'column3' => '1column4value',
56
    ];
57
58
    /** @var string[] */
59
    protected $dataRow2 = [
60
        'column1' => '2column2value',
61
        'column2' => '2column3value',
62
        'column3' => '2column4value',
63
    ];
64
65
    /** @var string[] */
66
    protected $dataRow5 = [
67
        'column1' => '5column2value',
68
        'column2' => '5column3value',
69
        'column3' => '5column4value',
70
    ];
71
72
    /**
73
     * @dataProvider getReaders
74
     */
75
    public function testOneAtAtime(Reader $reader) : void
76
    {
77
        while ($row = $reader->getRow()) {
78
            $this->assertTrue(is_array($row));
79
            $this->assertEquals(3, count($row));
0 ignored issues
show
Bug introduced by
It seems like $row can also be of type true; however, parameter $var of count() does only seem to accept Countable|array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

79
            $this->assertEquals(3, count(/** @scrutinizer ignore-type */ $row));
Loading history...
80
        }
81
    }
82
83
    /**
84
     * @dataProvider getReaders
85
     */
86
    public function testLastRowIsCorrect(Reader $reader) : void
87
    {
88
        $reader->getRow();
89
        $reader->getRow();
90
        $reader->getRow();
91
        $reader->getRow();
92
        $row = $reader->getRow();
93
94
        $expected = $this->dataRow5;
95
96
        $this->assertEquals($expected, $row);
97
98
        // line number should have not advanced
99
        $this->assertEquals(5, $reader->getLineNumber());
100
    }
101
102
    /**
103
     * @dataProvider getReaders
104
     */
105
    public function testIsEofReturnsCorrectly(Reader $reader) : void
106
    {
107
        $this->assertFalse($reader->isEof());
108
109
        $reader->getAll();
110
111
        $this->assertTrue($reader->isEof());
112
        $this->assertFalse($reader->getRow());
113
    }
114
115
    /**
116
     * @dataProvider getReaders
117
     */
118
    public function testGetAll(Reader $reader) : void
119
    {
120
        $this->assertEquals(5, count($reader->getAll()));
121
    }
122
123
    /**
124
     * @dataProvider getReaders
125
     */
126
    public function testGetHeaders(Reader $reader) : void
127
    {
128
        $this->assertEquals($this->headers, $reader->getHeaders());
129
    }
130
131
    /**
132
     * @dataProvider getReaders
133
     */
134
    public function testAdvanceTo(Reader $reader) : void
135
    {
136
        $this->assertEquals(0, $reader->getLineNumber());
137
138
        // getting a row before calling advanceTo() shouldn't affect it
139
        $dataRow1 = $reader->getRow();
140
        $this->assertEquals($this->dataRow1, $dataRow1);
141
        $this->assertEquals(2, $reader->getLineNumber());
142
143
        $reader->advanceTo(3);
144
145
        $this->assertEquals(3, $reader->getLineNumber());
146
147
        $reader->advanceTo(1);
148
149
        $row = $this->dataRow1;
150
151
        $actualRow = $reader->getRow();
152
        $this->assertEquals($row, $actualRow);
153
        $this->assertEquals(2, $reader->getLineNumber());
154
155
        $reader->advanceTo(3);
156
157
        $row = [
158
            'column1' => '3column2value',
159
            'column2' => '3column3value',
160
            'column3' => '3column4value',
161
        ];
162
163
        $this->assertEquals($row, $reader->getRow());
164
        $this->assertEquals(4, $reader->getLineNumber());
165
    }
166
167
    /**
168
     * @dataProvider getReadersNoHeadersFirstRow
169
     */
170
    public function testAdvanceToNoHeadersFirstRow(Reader $reader) : void
171
    {
172
        $firstMetaRow  = [
173
            0 => 'Some Meta Data',
174
            1 => '',
175
            2 => '',
176
        ];
177
        $secondMetaRow = [
178
            0 => 'Field: Value',
179
            1 => '',
180
            2 => '',
181
        ];
182
183
        $actualRow = $reader->getRow();
184
        $this->assertEquals($firstMetaRow, $actualRow);
185
        $this->assertEquals(1, $reader->getLineNumber());
186
187
        $actualRow = $reader->getRow();
188
        $this->assertEquals($secondMetaRow, $actualRow);
189
        $this->assertEquals(2, $reader->getLineNumber());
190
191
        // give it the ol' one-two-switcharoo
192
        $reader->advanceTo(3);
193
        $advancedRow = $reader->getRow();
194
195
        $this->assertEquals(
196
            $this->headers,
197
            $advancedRow
198
        );
199
200
        $reader->advanceTo(0);
201
202
        $this->assertEquals($firstMetaRow, $reader->getRow());
203
        $this->assertEquals(1, $reader->getLineNumber());
204
205
        $this->assertEquals($secondMetaRow, $reader->getRow());
206
        $this->assertEquals(2, $reader->getLineNumber());
207
208
        $reader->advanceTo(1);
209
210
        $row = $reader->getRow();
211
        $this->assertEquals(2, $reader->getLineNumber());
212
        $this->assertEquals(
213
            $secondMetaRow,
214
            $row
215
        );
216
    }
217
218
    /**
219
     * @param mixed[] $expectedRows
220
     *
221
     * @dataProvider advanceToLastLineProvider
222
     */
223
    public function testAdvanceToLastLine(array $expectedRows, Reader $reader) : void
224
    {
225
        $reader->advanceTo(5);
226
        $this->assertSame($expectedRows, $reader->getCurrentRow());
227
    }
228
229
    /**
230
     * @dataProvider getReadersNoHeadersFirstRow
231
     * @expectedException \LogicException
232
     */
233
    public function testAdvanceToBeforeHeaderLineNoHeadersFirstRow(Reader $reader) : void
234
    {
235
        $reader->setHeaderLine(3);
236
        $reader->advanceTo(1);
237
    }
238
239
    /**
240
     * @dataProvider getReaders
241
     * @expectedException \LogicException
242
     */
243
    public function testAdvanceToHeaderLine(Reader $reader) : void
244
    {
245
        $reader->getRow();
246
        $reader->advanceTo(0);
247
    }
248
249
    /**
250
     * @dataProvider getReaders
251
     * @expectedException \LogicException
252
     */
253
    public function testAdvanceToPastEof(Reader $reader) : void
254
    {
255
        $reader->advanceTo(999);
256
    }
257
258
    /**
259
     * @dataProvider getReaders
260
     */
261
    public function testSetHeaderLine(Reader $reader) : void
262
    {
263
        $headers = $this->headers;
264
265
        $this->assertEquals($headers, $reader->getHeaders());
266
267
        $reader->setHeaderLine(0);
268
269
        $this->assertEquals($headers, $reader->getHeaders());
270
    }
271
272
    /**
273
     * @dataProvider getReadersNoHeadersFirstRow
274
     */
275
    public function testSetHeaderLineNoHeadersFirstRow(Reader $reader) : void
276
    {
277
        // set headers
278
        $reader->setHeaderLine(3);
279
280
        $this->assertEquals($this->headers, $reader->getHeaders());
281
282
        $rows = $reader->getAll();
283
284
        $this->assertCount(5, $rows);
285
        $this->assertEquals($this->expectedRows, $rows);
286
    }
287
288
    /**
289
     * @dataProvider getReaders
290
     */
291
    public function testGetLastLineNumber(Reader $reader) : void
292
    {
293
        $this->assertEquals(5, $reader->getLastLineNumber());
294
        $this->assertEquals(5, $reader->getLastLineNumber());
295
    }
296
297
    /**
298
     * @dataProvider getReadersNoHeadersFirstRow
299
     */
300
    public function testGetLastLineNumberNoHeadersFirstRow(Reader $reader) : void
301
    {
302
        $this->assertEquals(10, $reader->getLastLineNumber());
303
    }
304
305
    /**
306
     * @return Reader[]
307
     */
308
    public function getReaders() : array
309
    {
310
        $readerSemiColon = new Reader(__DIR__ . '/read_sc.csv');
311
        $readerSemiColon->setDelimiter(';');
312
313
        return [
0 ignored issues
show
Bug Best Practice introduced by
The expression return array(array(new E...rray($readerSemiColon)) returns the type array<integer,array<integer,EasyCSV\Reader>> which is incompatible with the documented return type EasyCSV\Reader[].
Loading history...
314
            [new Reader(__DIR__ . '/read.csv')],
315
            [$readerSemiColon],
316
        ];
317
    }
318
319
    /**
320
     * @return mixed[]
321
     */
322
    public function advanceToLastLineProvider() : array
323
    {
324
        $readerSemiColon = new Reader(__DIR__ . '/read_sc.csv');
325
        $readerSemiColon->setDelimiter(';');
326
327
        return [
328
            [['5column2value', '5column3value', '5column4value'], new Reader(__DIR__ . '/read.csv')],
329
            [['5column2value', '5column3value', '5column4value'], $readerSemiColon],
330
        ];
331
    }
332
333
    /**
334
     * @return mixed[]
335
     */
336
    public function getReadersNoHeadersFirstRow() : array
337
    {
338
        $readerSemiColon = new Reader(__DIR__ . '/read_header_line_sc.csv', 'r+', false);
339
        $readerSemiColon->setDelimiter(';');
340
341
        return [
342
            [new Reader(__DIR__ . '/read_header_line.csv', 'r+', false)],
343
            [$readerSemiColon],
344
        ];
345
    }
346
}
347