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

ArrayFormulaPrefixTest::setUp()   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
c 0
b 0
f 0
dl 0
loc 3
rs 10
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx;
6
7
use PhpOffice\PhpSpreadsheet\Cell\DataType;
8
use PhpOffice\PhpSpreadsheet\Spreadsheet;
9
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
10
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
11
12
class ArrayFormulaPrefixTest extends AbstractFunctional
13
{
14
    /**
15
     * Test to ensure that xlfn prefix is being added to functions
16
     * included in an array formula, if appropriate.
17
     *
18
     * @throws \PhpOffice\PhpSpreadsheet\Exception
19
     */
20
    public function testWriteArrayFormulaTextJoin(): void
21
    {
22
        $spreadsheet = new Spreadsheet();
23
        $worksheet = $spreadsheet->getActiveSheet();
24
25
        //Write data
26
        $worksheet->getCell('A1')->setValue('Some Text');
27
        $worksheet->getCell('A2')->setValue('Some More Text');
28
        $worksheet->getCell('A3')->setValue(14.56);
29
        $worksheet->getCell('A4')->setValue(17.24);
30
        $worksheet->getCell('A5')->setValue(9.4);
31
        $worksheet->getCell('A6')->setValue(5);
32
33
        //Write formula
34
        $cell = $worksheet->getCell('A7');
35
        $cell->setValueExplicit('=TEXTJOIN("",TRUE,IF(ISNUMBER(A1:A6), A1:A6,""))', DataType::TYPE_FORMULA);
36
        /** @var array<string, string> */
37
        $attrs = $cell->getFormulaAttributes();
38
        $attrs['t'] = 'array';
39
        $cell->setFormulaAttributes($attrs);
40
41
        $writer = new Xlsx($spreadsheet);
42
        $writerWorksheet = new Xlsx\Worksheet($writer);
43
        $data = $writerWorksheet->writeWorksheet($worksheet, []);
44
45
        $expected = <<<XML
46
            <f t="array" ref="A7" aca="1" ca="1">_xlfn.TEXTJOIN(&quot;&quot;,TRUE,IF(ISNUMBER(A1:A6), A1:A6,&quot;&quot;))</f>
47
            XML;
48
        self::assertStringContainsString($expected, $data);
49
    }
50
51
    /**
52
     * Certain functions do not have the xlfn prefix applied.  Test an array formula
53
     * that includes those functions to see if they are written properly.
54
     *
55
     * @throws \PhpOffice\PhpSpreadsheet\Exception
56
     */
57
    public function testWriteArrayFormulaWithoutPrefix(): void
58
    {
59
        $spreadsheet = new Spreadsheet();
60
        $worksheet = $spreadsheet->getActiveSheet();
61
62
        //Write data
63
        $worksheet->getCell('A1')->setValue('orange');
64
        $worksheet->getCell('A2')->setValue('green');
65
        $worksheet->getCell('A3')->setValue('blue');
66
        $worksheet->getCell('A4')->setValue('yellow');
67
        $worksheet->getCell('A5')->setValue('pink');
68
        $worksheet->getCell('A6')->setValue('red');
69
70
        //Write formula
71
        $cell = $worksheet->getCell('A7');
72
        $cell->setValueExplicit('=SUM(LEN(A1:A6))', DataType::TYPE_FORMULA);
73
        /** @var array<string, string> */
74
        $attrs = $cell->getFormulaAttributes();
75
        $attrs['t'] = 'array';
76
        $cell->setFormulaAttributes($attrs);
77
78
        $writer = new Xlsx($spreadsheet);
79
        $writerWorksheet = new Xlsx\Worksheet($writer);
80
        $data = $writerWorksheet->writeWorksheet($worksheet, []);
81
82
        $expected = <<<XML
83
            <f t="array" ref="A7" aca="1" ca="1">SUM(LEN(A1:A6))</f>
84
            XML;
85
        self::assertStringContainsString($expected, $data);
86
    }
87
}
88