ReaderTest::testGetHeaders()   A
last analyzed

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 LogicException;
9
use PHPUnit\Framework\TestCase;
10
use function count;
11
use function is_array;
12
13
class ReaderTest extends TestCase
14
{
15
    /** @var string[] */
16
    protected $headers = ['column1', 'column2', 'column3'];
17
18
    /** @var string[][] */
19
    protected $expectedRows = [
20
        0 =>
21
            [
22
                'column1' => '1column2value',
23
                'column2' => '1column3value',
24
                'column3' => '1column4value',
25
            ],
26
        1 =>
27
            [
28
                'column1' => '2column2value',
29
                'column2' => '2column3value',
30
                'column3' => '2column4value',
31
            ],
32
        2 =>
33
            [
34
                'column1' => '3column2value',
35
                'column2' => '3column3value',
36
                'column3' => '3column4value',
37
            ],
38
        3 =>
39
            [
40
                'column1' => '4column2value',
41
                'column2' => '4column3value',
42
                'column3' => '4column4value',
43
            ],
44
        4 =>
45
            [
46
                'column1' => '5column2value',
47
                'column2' => '5column3value',
48
                'column3' => '5column4value',
49
            ],
50
    ];
51
52
    /** @var string[][] */
53
    protected $expectedNoHeaderRows = [
54
        0 =>
55
            [
56
                'column1' => '1column2value',
57
                'column2' => '1column3value',
58
                'column3' => '1column4value',
59
            ],
60
        1 =>
61
            [
62
                'column1' => '2column2value',
63
                'column2' => '2column3value',
64
                'column3' => '2column4value',
65
            ],
66
        2 =>
67
            [
68
                'column1' => '3column2value',
69
                'column2' => '3column3value',
70
                'column3' => '3column4value',
71
            ],
72
        3 =>
73
            [
74
                'column1' => '',
75
                'column2' => '',
76
                'column3' => '',
77
            ],
78
        4 =>
79
            [
80
                'column1' => '4column2value',
81
                'column2' => '4column3value',
82
                'column3' => '4column4value',
83
            ],
84
        5 =>
85
            [
86
                'column1' => '5column2value',
87
                'column2' => '5column3value',
88
                'column3' => '5column4value',
89
            ],
90
    ];
91
92
    /** @var string[] */
93
    protected $dataRow1 = [
94
        'column1' => '1column2value',
95
        'column2' => '1column3value',
96
        'column3' => '1column4value',
97
    ];
98
99
    /** @var string[] */
100
    protected $dataRow2 = [
101
        'column1' => '2column2value',
102
        'column2' => '2column3value',
103
        'column3' => '2column4value',
104
    ];
105
106
    /** @var string[] */
107
    protected $dataRow5 = [
108
        'column1' => '5column2value',
109
        'column2' => '5column3value',
110
        'column3' => '5column4value',
111
    ];
112
113
    /**
114
     * @dataProvider getReaders
115
     */
116
    public function testOneAtAtime(Reader $reader) : void
117
    {
118
        while ($row = $reader->getRow()) {
119
            $this->assertTrue(is_array($row));
120
            $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

120
            $this->assertEquals(3, count(/** @scrutinizer ignore-type */ $row));
Loading history...
121
        }
122
    }
123
124
    /**
125
     * @dataProvider getReaders
126
     */
127
    public function testLastRowIsCorrect(Reader $reader) : void
128
    {
129
        $reader->getRow();
130
        $reader->getRow();
131
        $reader->getRow();
132
        $reader->getRow();
133
        $row = $reader->getRow();
134
135
        $expected = $this->dataRow5;
136
137
        $this->assertEquals($expected, $row);
138
139
        // line number should have not advanced
140
        $this->assertEquals(5, $reader->getLineNumber());
141
    }
142
143
    /**
144
     * @dataProvider getReaders
145
     */
146
    public function testIsEofReturnsCorrectly(Reader $reader) : void
147
    {
148
        $this->assertFalse($reader->isEof());
149
150
        $reader->getAll();
151
152
        $this->assertTrue($reader->isEof());
153
        $this->assertFalse($reader->getRow());
154
    }
155
156
    /**
157
     * @dataProvider getReaders
158
     */
159
    public function testGetAll(Reader $reader) : void
160
    {
161
        $this->assertEquals(5, count($reader->getAll()));
162
    }
163
164
    /**
165
     * @dataProvider getReaders
166
     */
167
    public function testGetHeaders(Reader $reader) : void
168
    {
169
        $this->assertEquals($this->headers, $reader->getHeaders());
170
    }
171
172
    /**
173
     * @dataProvider getReaders
174
     */
175
    public function testAdvanceTo(Reader $reader) : void
176
    {
177
        $this->assertEquals(0, $reader->getLineNumber());
178
179
        // getting a row before calling advanceTo() shouldn't affect it
180
        $dataRow1 = $reader->getRow();
181
        $this->assertEquals($this->dataRow1, $dataRow1);
182
        $this->assertEquals(2, $reader->getLineNumber());
183
184
        $reader->advanceTo(3);
185
186
        $this->assertEquals(3, $reader->getLineNumber());
187
188
        $reader->advanceTo(1);
189
190
        $row = $this->dataRow1;
191
192
        $actualRow = $reader->getRow();
193
        $this->assertEquals($row, $actualRow);
194
        $this->assertEquals(2, $reader->getLineNumber());
195
196
        $reader->advanceTo(3);
197
198
        $row = [
199
            'column1' => '3column2value',
200
            'column2' => '3column3value',
201
            'column3' => '3column4value',
202
        ];
203
204
        $this->assertEquals($row, $reader->getRow());
205
        $this->assertEquals(4, $reader->getLineNumber());
206
    }
207
208
    /**
209
     * @dataProvider getReadersNoHeadersFirstRow
210
     */
211
    public function testAdvanceToNoHeadersFirstRow(Reader $reader) : void
212
    {
213
        $firstMetaRow  = [
214
            0 => 'Some Meta Data',
215
            1 => '',
216
            2 => '',
217
        ];
218
        $secondMetaRow = [
219
            0 => 'Field: Value',
220
            1 => '',
221
            2 => '',
222
        ];
223
224
        $actualRow = $reader->getRow();
225
        $this->assertEquals($firstMetaRow, $actualRow);
226
        $this->assertEquals(1, $reader->getLineNumber());
227
228
        $actualRow = $reader->getRow();
229
        $this->assertEquals($secondMetaRow, $actualRow);
230
        $this->assertEquals(2, $reader->getLineNumber());
231
232
        // give it the ol' one-two-switcharoo
233
        $reader->advanceTo(3);
234
        $advancedRow = $reader->getRow();
235
236
        $this->assertEquals(
237
            $this->headers,
238
            $advancedRow
239
        );
240
241
        $reader->advanceTo(0);
242
243
        $this->assertEquals($firstMetaRow, $reader->getRow());
244
        $this->assertEquals(1, $reader->getLineNumber());
245
246
        $this->assertEquals($secondMetaRow, $reader->getRow());
247
        $this->assertEquals(2, $reader->getLineNumber());
248
249
        $reader->advanceTo(1);
250
251
        $row = $reader->getRow();
252
        $this->assertEquals(2, $reader->getLineNumber());
253
        $this->assertEquals(
254
            $secondMetaRow,
255
            $row
256
        );
257
    }
258
259
    /**
260
     * @param mixed[] $expectedRows
261
     *
262
     * @dataProvider advanceToLastLineProvider
263
     */
264
    public function testAdvanceToLastLine(array $expectedRows, Reader $reader) : void
265
    {
266
        $reader->advanceTo(5);
267
        $this->assertSame($expectedRows, $reader->getCurrentRow());
268
    }
269
270
    /**
271
     * @dataProvider getReadersNoHeadersFirstRow
272
     */
273
    public function testAdvanceToBeforeHeaderLineNoHeadersFirstRow(Reader $reader) : void
274
    {
275
        $this->expectException(LogicException::class);
276
277
        $reader->setHeaderLine(3);
278
        $reader->advanceTo(1);
279
    }
280
281
    /**
282
     * @dataProvider getReaders
283
     */
284
    public function testAdvanceToHeaderLine(Reader $reader) : void
285
    {
286
        $this->expectException(LogicException::class);
287
288
        $reader->getRow();
289
        $reader->advanceTo(0);
290
    }
291
292
    /**
293
     * @dataProvider getReaders
294
     */
295
    public function testAdvanceToPastEof(Reader $reader) : void
296
    {
297
        $this->expectException(LogicException::class);
298
299
        $reader->advanceTo(999);
300
    }
301
302
    /**
303
     * @dataProvider getReaders
304
     */
305
    public function testSetHeaderLine(Reader $reader) : void
306
    {
307
        $headers = $this->headers;
308
309
        $this->assertEquals($headers, $reader->getHeaders());
310
311
        $reader->setHeaderLine(0);
312
313
        $this->assertEquals($headers, $reader->getHeaders());
314
    }
315
316
    /**
317
     * @dataProvider getReadersNoHeadersFirstRow
318
     */
319
    public function testSetHeaderLineNoHeadersFirstRow(Reader $reader) : void
320
    {
321
        // set headers
322
        $reader->setHeaderLine(3);
323
324
        $this->assertEquals($this->headers, $reader->getHeaders());
325
326
        $rows = $reader->getAll();
327
328
        $this->assertCount(6, $rows);
329
        $this->assertEquals($this->expectedNoHeaderRows, $rows);
330
    }
331
332
    /**
333
     * @dataProvider getReaders
334
     */
335
    public function testGetLastLineNumber(Reader $reader) : void
336
    {
337
        $this->assertEquals(5, $reader->getLastLineNumber());
338
        $this->assertEquals(5, $reader->getLastLineNumber());
339
    }
340
341
    /**
342
     * @dataProvider getReadersNoHeadersFirstRow
343
     */
344
    public function testGetLastLineNumberNoHeadersFirstRow(Reader $reader) : void
345
    {
346
        $this->assertEquals(10, $reader->getLastLineNumber());
347
    }
348
349
    /**
350
     * @return Reader[]
351
     */
352
    public function getReaders() : array
353
    {
354
        $readerSemiColon = new Reader(__DIR__ . '/read_sc.csv');
355
        $readerSemiColon->setDelimiter(';');
356
357
        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...
358
            [new Reader(__DIR__ . '/read.csv')],
359
            [$readerSemiColon],
360
        ];
361
    }
362
363
    /**
364
     * @return mixed[]
365
     */
366
    public function advanceToLastLineProvider() : array
367
    {
368
        $readerSemiColon = new Reader(__DIR__ . '/read_sc.csv');
369
        $readerSemiColon->setDelimiter(';');
370
371
        return [
372
            [['5column2value', '5column3value', '5column4value'], new Reader(__DIR__ . '/read.csv')],
373
            [['5column2value', '5column3value', '5column4value'], $readerSemiColon],
374
        ];
375
    }
376
377
    /**
378
     * @return mixed[]
379
     */
380
    public function getReadersNoHeadersFirstRow() : array
381
    {
382
        $readerSemiColon = new Reader(__DIR__ . '/read_header_line_sc.csv', 'r+', false);
383
        $readerSemiColon->setDelimiter(';');
384
385
        return [
386
            [new Reader(__DIR__ . '/read_header_line.csv', 'r+', false)],
387
            [$readerSemiColon],
388
        ];
389
    }
390
}
391