Passed
Pull Request — master (#4326)
by Owen
14:19
created

SpreadsheetTest::testNotJsonEncodable()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 4
c 0
b 0
f 0
dl 0
loc 7
rs 10
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace PhpOffice\PhpSpreadsheetTests;
6
7
use PhpOffice\PhpSpreadsheet\Exception;
8
use PhpOffice\PhpSpreadsheet\Spreadsheet;
9
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
10
use PHPUnit\Framework\TestCase;
11
12
class SpreadsheetTest extends TestCase
13
{
14
    private ?Spreadsheet $spreadsheet = null;
15
16
    protected function tearDown(): void
17
    {
18
        if ($this->spreadsheet !== null) {
19
            $this->spreadsheet->disconnectWorksheets();
20
            $this->spreadsheet = null;
21
        }
22
    }
23
24
    private function getSpreadsheet(): Spreadsheet
25
    {
26
        $this->spreadsheet = $spreadsheet = new Spreadsheet();
27
        $sheet = $spreadsheet->getActiveSheet();
28
29
        $sheet->setTitle('someSheet1');
30
        $sheet = new Worksheet();
31
        $sheet->setTitle('someSheet2');
32
        $spreadsheet->addSheet($sheet);
33
        $sheet = new Worksheet();
34
        $sheet->setTitle('someSheet 3');
35
        $spreadsheet->addSheet($sheet);
36
37
        return $spreadsheet;
38
    }
39
40
    public static function dataProviderForSheetNames(): array
41
    {
42
        $array = [
43
            [0, 'someSheet1'],
44
            [0, "'someSheet1'"],
45
            [1, 'someSheet2'],
46
            [1, "'someSheet2'"],
47
            [2, 'someSheet 3'],
48
            [2, "'someSheet 3'"],
49
            [null, 'someSheet 33'],
50
        ];
51
52
        return $array;
53
    }
54
55
    #[\PHPUnit\Framework\Attributes\DataProvider('dataProviderForSheetNames')]
56
    public function testGetSheetByName(?int $index, string $sheetName): void
57
    {
58
        $spreadsheet = $this->getSpreadsheet();
59
        if ($index === null) {
60
            self::assertNull($spreadsheet->getSheetByName($sheetName));
61
        } else {
62
            self::assertSame($spreadsheet->getSheet($index), $spreadsheet->getSheetByName($sheetName));
63
        }
64
    }
65
66
    public function testAddSheetDuplicateTitle(): void
67
    {
68
        $spreadsheet = $this->getSpreadsheet();
69
        $this->expectException(Exception::class);
70
        $this->expectExceptionMessage("Workbook already contains a worksheet named 'someSheet2'. Rename this worksheet first.");
71
        $sheet = new Worksheet();
72
        $sheet->setTitle('someSheet2');
73
        $spreadsheet->addSheet($sheet);
74
    }
75
76
    public function testAddSheetDuplicateTitleWithDifferentCase(): void
77
    {
78
        $spreadsheet = $this->getSpreadsheet();
79
        $this->expectException(Exception::class);
80
        $this->expectExceptionMessage("Workbook already contains a worksheet named 'SomeSheet2'. Rename this worksheet first.");
81
        $sheet = new Worksheet();
82
        $sheet->setTitle('SomeSheet2');
83
        $spreadsheet->addSheet($sheet);
84
    }
85
86
    public function testAddSheetNoAdjustActive(): void
87
    {
88
        $spreadsheet = $this->getSpreadsheet();
89
        $spreadsheet->setActiveSheetIndex(2);
90
        self::assertEquals(2, $spreadsheet->getActiveSheetIndex());
91
        $sheet = new Worksheet();
92
        $sheet->setTitle('someSheet4');
93
        $spreadsheet->addSheet($sheet);
94
        self::assertEquals(2, $spreadsheet->getActiveSheetIndex());
95
    }
96
97
    public function testAddSheetAdjustActive(): void
98
    {
99
        $spreadsheet = $this->getSpreadsheet();
100
        $spreadsheet->setActiveSheetIndex(2);
101
        self::assertEquals(2, $spreadsheet->getActiveSheetIndex());
102
        $sheet = new Worksheet();
103
        $sheet->setTitle('someSheet0');
104
        $spreadsheet->addSheet($sheet, 0);
105
        self::assertEquals(3, $spreadsheet->getActiveSheetIndex());
106
    }
107
108
    public function testRemoveSheetIndexTooHigh(): void
109
    {
110
        $spreadsheet = $this->getSpreadsheet();
111
        $this->expectException(Exception::class);
112
        $this->expectExceptionMessage('You tried to remove a sheet by the out of bounds index: 4. The actual number of sheets is 3.');
113
        $spreadsheet->removeSheetByIndex(4);
114
    }
115
116
    public function testRemoveSheetNoAdjustActive(): void
117
    {
118
        $spreadsheet = $this->getSpreadsheet();
119
        $spreadsheet->setActiveSheetIndex(1);
120
        self::assertEquals(1, $spreadsheet->getActiveSheetIndex());
121
        $spreadsheet->removeSheetByIndex(2);
122
        self::assertEquals(1, $spreadsheet->getActiveSheetIndex());
123
    }
124
125
    public function testRemoveSheetAdjustActive(): void
126
    {
127
        $spreadsheet = $this->getSpreadsheet();
128
        $spreadsheet->setActiveSheetIndex(2);
129
        self::assertEquals(2, $spreadsheet->getActiveSheetIndex());
130
        $spreadsheet->removeSheetByIndex(1);
131
        self::assertEquals(1, $spreadsheet->getActiveSheetIndex());
132
    }
133
134
    public function testGetSheetIndexTooHigh(): void
135
    {
136
        $spreadsheet = $this->getSpreadsheet();
137
        $this->expectException(Exception::class);
138
        $this->expectExceptionMessage('Your requested sheet index: 4 is out of bounds. The actual number of sheets is 3.');
139
        $spreadsheet->getSheet(4);
140
    }
141
142
    public function testGetIndexNonExistent(): void
143
    {
144
        $spreadsheet = $this->getSpreadsheet();
145
        $this->expectException(Exception::class);
146
        $this->expectExceptionMessage('Sheet does not exist.');
147
        $sheet = new Worksheet();
148
        $sheet->setTitle('someSheet4');
149
        $spreadsheet->getIndex($sheet);
150
    }
151
152
    public function testSetIndexByName(): void
153
    {
154
        $spreadsheet = $this->getSpreadsheet();
155
        $spreadsheet->setIndexByName('someSheet1', 1);
156
        self::assertEquals('someSheet2', $spreadsheet->getSheet(0)->getTitle());
157
        self::assertEquals('someSheet1', $spreadsheet->getSheet(1)->getTitle());
158
        self::assertEquals('someSheet 3', $spreadsheet->getSheet(2)->getTitle());
159
    }
160
161
    public function testRemoveAllSheets(): void
162
    {
163
        $spreadsheet = $this->getSpreadsheet();
164
        $spreadsheet->setActiveSheetIndex(2);
165
        self::assertEquals(2, $spreadsheet->getActiveSheetIndex());
166
        $spreadsheet->removeSheetByIndex(0);
167
        self::assertEquals(1, $spreadsheet->getActiveSheetIndex());
168
        $spreadsheet->removeSheetByIndex(0);
169
        self::assertEquals(0, $spreadsheet->getActiveSheetIndex());
170
        $spreadsheet->removeSheetByIndex(0);
171
        self::assertEquals(-1, $spreadsheet->getActiveSheetIndex());
172
        $sheet = new Worksheet();
173
        $sheet->setTitle('someSheet4');
174
        $spreadsheet->addSheet($sheet);
175
        self::assertEquals(0, $spreadsheet->getActiveSheetIndex());
176
    }
177
178
    public function testBug1735(): void
179
    {
180
        $spreadsheet1 = new Spreadsheet();
181
        $spreadsheet1->createSheet()->setTitle('addedsheet');
182
        $spreadsheet1->setActiveSheetIndex(1);
183
        $spreadsheet1->removeSheetByIndex(0);
184
        $sheet = $spreadsheet1->getActiveSheet();
185
        self::assertEquals('addedsheet', $sheet->getTitle());
186
    }
187
188
    public function testSetActiveSheetIndexTooHigh(): void
189
    {
190
        $spreadsheet = $this->getSpreadsheet();
191
        $this->expectException(Exception::class);
192
        $this->expectExceptionMessage('You tried to set a sheet active by the out of bounds index: 4. The actual number of sheets is 3.');
193
        $spreadsheet->setActiveSheetIndex(4);
194
    }
195
196
    public function testSetActiveSheetNoSuchName(): void
197
    {
198
        $spreadsheet = $this->getSpreadsheet();
199
        $this->expectException(Exception::class);
200
        $this->expectExceptionMessage('Workbook does not contain sheet:unknown');
201
        $spreadsheet->setActiveSheetIndexByName('unknown');
202
    }
203
204
    public function testAddExternal(): void
205
    {
206
        $spreadsheet = $this->getSpreadsheet();
207
        $spreadsheet1 = new Spreadsheet();
208
        $sheet = $spreadsheet1->createSheet()->setTitle('someSheet19');
209
        $sheet->getCell('A1')->setValue(1);
210
        $sheet->getCell('A1')->getStyle()->getFont()->setBold(true);
211
        $sheet->getCell('B1')->getStyle()->getFont()->setSuperscript(true);
212
        $sheet->getCell('C1')->getStyle()->getFont()->setSubscript(true);
213
        self::assertCount(4, $spreadsheet1->getCellXfCollection());
214
        self::assertEquals(1, $sheet->getCell('A1')->getXfIndex());
215
        $spreadsheet->getActiveSheet()->getCell('A1')->getStyle()->getFont()->setBold(true);
216
        self::assertCount(2, $spreadsheet->getCellXfCollection());
217
        $sheet3 = $spreadsheet->addExternalSheet($sheet);
218
        self::assertCount(6, $spreadsheet->getCellXfCollection());
219
        self::assertEquals('someSheet19', $sheet3->getTitle());
220
        self::assertEquals(1, $sheet3->getCell('A1')->getValue());
221
        self::assertTrue($sheet3->getCell('A1')->getStyle()->getFont()->getBold());
222
        // Prove Xf index changed although style is same.
223
        self::assertEquals(3, $sheet3->getCell('A1')->getXfIndex());
224
    }
225
226
    public function testAddExternalDuplicateName(): void
227
    {
228
        $this->expectException(Exception::class);
229
        $this->expectExceptionMessage("Workbook already contains a worksheet named 'someSheet1'. Rename the external sheet first.");
230
        $spreadsheet = new Spreadsheet();
231
        $sheet = $spreadsheet->createSheet()->setTitle('someSheet1');
232
        $sheet->getCell('A1')->setValue(1);
233
        $sheet->getCell('A1')->getStyle()->getFont()->setBold(true);
234
        $spreadsheet->addExternalSheet($sheet);
235
    }
236
237
    public function testAddExternalColumnDimensionStyles(): void
238
    {
239
        $spreadsheet1 = new Spreadsheet();
240
        $sheet1 = $spreadsheet1->createSheet()->setTitle('sheetWithColumnDimension');
241
        $sheet1->getCell('A1')->setValue(1);
242
        $sheet1->getCell('A1')->getStyle()->getFont()->setItalic(true);
243
        $sheet1->getColumnDimension('B')->setWidth(10)->setXfIndex($sheet1->getCell('A1')->getXfIndex());
244
        $index = $sheet1->getColumnDimension('B')->getXfIndex();
245
        self::assertEquals(1, $index);
246
        self::assertCount(2, $spreadsheet1->getCellXfCollection());
247
248
        $spreadsheet2 = new Spreadsheet();
249
        $sheet2 = $spreadsheet2->createSheet()->setTitle('sheetWithTwoStyles');
250
        $sheet2->getCell('A1')->setValue(1);
251
        $sheet2->getCell('A1')->getStyle()->getFont()->setBold(true);
252
        $sheet2->getCell('B2')->getStyle()->getFont()->setSuperscript(true);
253
        $countXfs = count($spreadsheet2->getCellXfCollection());
254
        self::assertEquals(3, $countXfs);
255
256
        $sheet3 = $spreadsheet2->addExternalSheet($sheet1);
257
        self::assertCount(5, $spreadsheet2->getCellXfCollection());
258
        self::assertTrue($sheet3->getCell('A1')->getStyle()->getFont()->getItalic());
259
        self::assertTrue($sheet3->getCell('B1')->getStyle()->getFont()->getItalic());
260
        self::assertFalse($sheet3->getCell('B1')->getStyle()->getFont()->getBold());
261
        // Prove Xf index changed although style is same.
262
        self::assertEquals($countXfs + $index, $sheet3->getCell('B1')->getXfIndex());
263
        self::assertEquals($countXfs + $index, $sheet3->getColumnDimension('B')->getXfIndex());
264
    }
265
266
    public function testAddExternalRowDimensionStyles(): void
267
    {
268
        $spreadsheet1 = new Spreadsheet();
269
        $sheet1 = $spreadsheet1->createSheet()->setTitle('sheetWithColumnDimension');
270
        $sheet1->getCell('A1')->setValue(1);
271
        $sheet1->getCell('A1')->getStyle()->getFont()->setItalic(true);
272
        $sheet1->getRowDimension(2)->setXfIndex($sheet1->getCell('A1')->getXfIndex());
273
        $index = $sheet1->getRowDimension(2)->getXfIndex();
274
        self::assertEquals(1, $index);
275
        self::assertCount(2, $spreadsheet1->getCellXfCollection());
276
277
        $spreadsheet2 = new Spreadsheet();
278
        $sheet2 = $spreadsheet2->createSheet()->setTitle('sheetWithTwoStyles');
279
        $sheet2->getCell('A1')->setValue(1);
280
        $sheet2->getCell('A1')->getStyle()->getFont()->setBold(true);
281
        $sheet2->getCell('B2')->getStyle()->getFont()->setSuperscript(true);
282
        $countXfs = count($spreadsheet2->getCellXfCollection());
283
        self::assertEquals(3, $countXfs);
284
285
        $sheet3 = $spreadsheet2->addExternalSheet($sheet1);
286
        self::assertCount(5, $spreadsheet2->getCellXfCollection());
287
        self::assertTrue($sheet3->getCell('A1')->getStyle()->getFont()->getItalic());
288
        self::assertTrue($sheet3->getCell('A2')->getStyle()->getFont()->getItalic());
289
        self::assertFalse($sheet3->getCell('A2')->getStyle()->getFont()->getBold());
290
        // Prove Xf index changed although style is same.
291
        self::assertEquals($countXfs + $index, $sheet3->getCell('A2')->getXfIndex());
292
        self::assertEquals($countXfs + $index, $sheet3->getRowDimension(2)->getXfIndex());
293
    }
294
}
295