Passed
Pull Request — master (#4368)
by Owen
14:06
created

ColumnCellIteratorTest::isCellNull()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace PhpOffice\PhpSpreadsheetTests\Worksheet;
6
7
use PhpOffice\PhpSpreadsheet\Cell\Cell;
8
use PhpOffice\PhpSpreadsheet\Exception as Except;
9
use PhpOffice\PhpSpreadsheet\Spreadsheet;
10
use PhpOffice\PhpSpreadsheet\Worksheet\ColumnCellIterator;
11
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
12
use PHPUnit\Framework\TestCase;
13
14
class ColumnCellIteratorTest extends TestCase
15
{
16
    private const CELL_VALUES
17
        = [
18
            [110, 210, 310, 410, 510, 610, 710],
19
            [120, 220, 320, 420, 520, 620],
20
            [130, 230, 330, 430, 530, 630],
21
            [140, 240, 340, 440, 540, 640],
22
            [150, 250, 350, 450, 550, 650],
23
            [160, null, 360, null, 560],
24
        ];
25
26
    // Phpstan does not think RowCellIterator can return null
27
    private static function isCellNull(?Cell $item): bool
28
    {
29
        return $item === null;
30
    }
31
32
    private static function getPopulatedSheet(Spreadsheet $spreadsheet): Worksheet
33
    {
34
        $sheet = $spreadsheet->getActiveSheet();
35
        $sheet->fromArray(self::CELL_VALUES);
36
37
        return $sheet;
38
    }
39
40
    public function testIteratorFullRange(): void
41
    {
42
        $spreadsheet = new Spreadsheet();
43
        $sheet = self::getPopulatedSheet($spreadsheet);
44
        $iterator = new ColumnCellIterator($sheet, 'A');
45
        $ColumnCellIndexResult = 1;
46
        self::assertEquals($ColumnCellIndexResult, $iterator->key());
47
48
        $values = [];
49
        foreach ($iterator as $key => $ColumnCell) {
50
            self::assertFalse(self::isCellNull($ColumnCell));
51
            $values[] = $ColumnCell->getValue();
52
            self::assertEquals($ColumnCellIndexResult++, $key);
53
        }
54
        $transposed = array_map(null, ...self::CELL_VALUES);
55
        self::assertSame($transposed[0], $values);
56
        $spreadsheet->disconnectWorksheets();
57
    }
58
59
    public function testIteratorStartEndRange(): void
60
    {
61
        $spreadsheet = new Spreadsheet();
62
        $sheet = self::getPopulatedSheet($spreadsheet);
63
        $iterator = new ColumnCellIterator($sheet, 'A', 2, 4);
64
        $ColumnCellIndexResult = 2;
65
        self::assertEquals($ColumnCellIndexResult, $iterator->key());
66
67
        $values = [];
68
        foreach ($iterator as $key => $ColumnCell) {
69
            self::assertFalse(self::isCellNull($ColumnCell));
70
            $values[] = $ColumnCell->getValue();
71
            self::assertEquals($ColumnCellIndexResult++, $key);
72
        }
73
        self::assertSame([120, 130, 140], $values);
74
        $spreadsheet->disconnectWorksheets();
75
    }
76
77
    public function testIteratorSeekAndPrev(): void
78
    {
79
        $spreadsheet = new Spreadsheet();
80
        $sheet = self::getPopulatedSheet($spreadsheet);
81
        $iterator = new ColumnCellIterator($sheet, 'A', 2, 4);
82
        $columnIndexResult = 4;
83
        $iterator->seek(4);
84
        self::assertEquals($columnIndexResult, $iterator->key());
85
86
        $values = [];
87
        while ($iterator->valid()) {
88
            $current = $iterator->current();
89
            self::assertNotNull($current);
90
            $cell = $current->getCoordinate();
91
            $values[] = $sheet->getCell($cell)->getValue();
92
            $iterator->prev();
93
        }
94
        self::assertSame([140, 130, 120], $values);
95
        $spreadsheet->disconnectWorksheets();
96
    }
97
98
    public function testSeekOutOfRange(): void
99
    {
100
        $spreadsheet = new Spreadsheet();
101
        $sheet = self::getPopulatedSheet($spreadsheet);
102
        $this->expectException(Except::class);
103
        $this->expectExceptionMessage('Row 1 is out of range');
104
        $iterator = new ColumnCellIterator($sheet, 'A', 2, 4);
105
        $iterator->seek(1);
106
        $spreadsheet->disconnectWorksheets();
107
    }
108
109
    public function testSeekNotExisting(): void
110
    {
111
        $spreadsheet = new Spreadsheet();
112
        $sheet = $spreadsheet->getActiveSheet();
113
        $this->expectException(Except::class);
114
        $this->expectExceptionMessage('Cell does not exist');
115
116
        $iterator = new ColumnCellIterator($sheet, 'A', 2, 4);
117
        $iterator->setIterateOnlyExistingCells(true);
118
        $iterator->seek(2);
119
    }
120
121
    public function testPrevOutOfRange(): void
122
    {
123
        $spreadsheet = new Spreadsheet();
124
        $sheet = self::getPopulatedSheet($spreadsheet);
125
        $iterator = new ColumnCellIterator($sheet, 'A', 2, 4);
126
        $iterator->prev();
127
        self::assertFalse($iterator->valid());
128
        $spreadsheet->disconnectWorksheets();
129
    }
130
}
131