Passed
Pull Request — master (#4203)
by Owen
14:07
created

testWriteArrayFormulaValidation()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 47
Code Lines 40

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 40
c 2
b 0
f 0
dl 0
loc 47
rs 9.28
cc 2
nc 2
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx;
6
7
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
8
use PhpOffice\PhpSpreadsheet\Cell\DataValidation;
9
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;
10
use PhpOffice\PhpSpreadsheet\Shared\File;
11
use PhpOffice\PhpSpreadsheet\Spreadsheet;
12
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;
13
use PHPUnit\Framework\TestCase;
14
15
class ArrayFormulaValidationTest extends TestCase
16
{
17
    private string $outputFile = '';
18
19
    protected function tearDown(): void
20
    {
21
        if ($this->outputFile !== '') {
22
            unlink($this->outputFile);
23
            $this->outputFile = '';
24
        }
25
    }
26
27
    /**
28
     * @dataProvider validationProvider
29
     */
30
    public function testWriteArrayFormulaValidation(string $formula): void
31
    {
32
        $spreadsheet = new Spreadsheet();
33
        Calculation::getInstance($spreadsheet)
34
            ->setInstanceArrayReturnType(
35
                Calculation::RETURN_ARRAY_AS_ARRAY
36
            );
37
        $sheet = $spreadsheet->getActiveSheet();
38
        $sheet->setCellValue('C1', 1);
39
        $sheet->setCellValue('C2', 2);
40
        $sheet->setCellValue('C3', 3);
41
        $sheet->setCellValue('C4', 3);
42
        $sheet->setCellValue('C5', 5);
43
        $sheet->setCellValue('C6', 6);
44
        $sheet->setCellValue('B1', '=UNIQUE(C1:C6)');
45
46
        $validation = $sheet->getCell('A1')->getDataValidation();
47
        $validation->setType(DataValidation::TYPE_LIST);
48
        $validation->setErrorStyle(DataValidation::STYLE_STOP);
49
        $validation->setAllowBlank(true);
50
        $validation->setShowDropDown(true);
51
        $validation->setShowErrorMessage(true);
52
        $validation->setError('Invalid input');
53
        $validation->setFormula1($formula);
54
        $sheet->getCell('A1')->setDataValidation($validation);
55
56
        $this->outputFile = File::temporaryFilename();
57
        $writer = new XlsxWriter($spreadsheet);
58
        $writer->save($this->outputFile);
59
        $spreadsheet->disconnectWorksheets();
60
61
        $reader = new XlsxReader();
62
        $spreadsheet2 = $reader->load($this->outputFile);
63
        Calculation::getInstance($spreadsheet2)->setInstanceArrayReturnType(Calculation::RETURN_ARRAY_AS_ARRAY);
64
        $sheet2 = $spreadsheet2->getActiveSheet();
65
        $validation2 = $sheet2->getCell('A1')->getDataValidation();
66
        self::assertSame('ANCHORARRAY($B$1)', $validation2->getFormula1());
67
        $spreadsheet2->disconnectWorksheets();
68
69
        $file = 'zip://';
70
        $file .= $this->outputFile;
71
        $file .= '#xl/worksheets/sheet1.xml';
72
        $data = file_get_contents($file);
73
        if ($data === false) {
74
            self::fail('Unable to read file');
75
        } else {
76
            self::assertStringContainsString('<formula1>_xlfn.ANCHORARRAY($B$1)</formula1>', $data);
77
        }
78
    }
79
80
    public static function validationProvider(): array
81
    {
82
        return [
83
            ['ANCHORARRAY($B$1)'],
84
            ['$B$1#'],
85
        ];
86
    }
87
}
88