Completed
Push — master ( ba1ce8...40abd1 )
by Adrien
22s queued 19s
created

DefinedNameFormulaTest::testEmptyNamedFormula()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 4
nc 1
nop 0
dl 0
loc 6
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace PhpOffice\PhpSpreadsheetTests;
4
5
use PhpOffice\PhpSpreadsheet\DefinedName;
6
use PhpOffice\PhpSpreadsheet\NamedFormula;
7
use PhpOffice\PhpSpreadsheet\Spreadsheet;
8
use PHPUnit\Framework\TestCase;
9
10
class DefinedNameFormulaTest extends TestCase
11
{
12
    /**
13
     * @dataProvider providerRangeOrFormula
14
     */
15
    public function testRangeOrFormula(string $value, bool $expectedResult): void
16
    {
17
        $actualResult = DefinedName::testIfFormula($value);
18
        self::assertSame($expectedResult, $actualResult);
19
    }
20
21
    public function testAddDefinedNames(): void
22
    {
23
        $spreadSheet = new Spreadsheet();
24
        $workSheet = $spreadSheet->getActiveSheet();
25
26
        $definedNamesForTest = $this->providerRangeOrFormula();
27
        foreach ($definedNamesForTest as $key => $definedNameData) {
28
            [$value] = $definedNameData;
29
            $name = str_replace([' ', '-'], '_', $key);
30
            $spreadSheet->addDefinedName(DefinedName::createInstance($name, $workSheet, $value));
31
        }
32
33
        $allDefinedNames = $spreadSheet->getDefinedNames();
34
        self::assertSame(count($definedNamesForTest), count($allDefinedNames));
35
    }
36
37
    public function testGetNamedRanges(): void
38
    {
39
        $spreadSheet = new Spreadsheet();
40
        $workSheet = $spreadSheet->getActiveSheet();
41
42
        $rangeOrFormula = [];
43
        $definedNamesForTest = $this->providerRangeOrFormula();
44
        foreach ($definedNamesForTest as $key => $definedNameData) {
45
            [$value, $isFormula] = $definedNameData;
46
            $rangeOrFormula[] = !$isFormula;
47
            $name = str_replace([' ', '-'], '_', $key);
48
            $spreadSheet->addDefinedName(DefinedName::createInstance($name, $workSheet, $value));
49
        }
50
51
        $allNamedRanges = $spreadSheet->getNamedRanges();
52
        self::assertSame(count(array_filter($rangeOrFormula)), count($allNamedRanges));
53
    }
54
55
    public function testGetScopedNamedRange(): void
56
    {
57
        $rangeName = 'NAMED_RANGE';
58
        $globalRangeValue = 'A1';
59
        $localRangeValue = 'A2';
60
61
        $spreadSheet = new Spreadsheet();
62
        $workSheet = $spreadSheet->getActiveSheet();
63
64
        $spreadSheet->addDefinedName(DefinedName::createInstance($rangeName, $workSheet, $globalRangeValue));
65
        $spreadSheet->addDefinedName(DefinedName::createInstance($rangeName, $workSheet, $localRangeValue, true));
66
67
        $localScopedRange = $spreadSheet->getNamedRange($rangeName, $workSheet);
68
        self::assertSame($localRangeValue, $localScopedRange->getValue());
69
    }
70
71
    public function testGetGlobalNamedRange(): void
72
    {
73
        $rangeName = 'NAMED_RANGE';
74
        $globalRangeValue = 'A1';
75
        $localRangeValue = 'A2';
76
77
        $spreadSheet = new Spreadsheet();
78
        $workSheet1 = $spreadSheet->getActiveSheet();
79
        $spreadSheet->createSheet(1);
80
        $workSheet2 = $spreadSheet->getSheet(1);
81
82
        $spreadSheet->addDefinedName(DefinedName::createInstance($rangeName, $workSheet1, $globalRangeValue));
83
        $spreadSheet->addDefinedName(DefinedName::createInstance($rangeName, $workSheet1, $localRangeValue, true));
84
85
        $localScopedRange = $spreadSheet->getNamedRange($rangeName, $workSheet2);
86
        self::assertSame($globalRangeValue, $localScopedRange->getValue());
87
    }
88
89
    public function testGetNamedFormulae(): void
90
    {
91
        $spreadSheet = new Spreadsheet();
92
        $workSheet = $spreadSheet->getActiveSheet();
93
94
        $rangeOrFormula = [];
95
        $definedNamesForTest = $this->providerRangeOrFormula();
96
        foreach ($definedNamesForTest as $key => $definedNameData) {
97
            [$value, $isFormula] = $definedNameData;
98
            $rangeOrFormula[] = $isFormula;
99
            $name = str_replace([' ', '-'], '_', $key);
100
            $spreadSheet->addDefinedName(DefinedName::createInstance($name, $workSheet, $value));
101
        }
102
103
        $allNamedFormulae = $spreadSheet->getNamedFormulae();
104
        self::assertSame(count(array_filter($rangeOrFormula)), count($allNamedFormulae));
105
    }
106
107
    public function testGetScopedNamedFormula(): void
108
    {
109
        $formulaName = 'GERMAN_VAT_RATE';
110
        $globalFormulaValue = '=19.0%';
111
        $localFormulaValue = '=16.0%';
112
113
        $spreadSheet = new Spreadsheet();
114
        $workSheet = $spreadSheet->getActiveSheet();
115
116
        $spreadSheet->addDefinedName(DefinedName::createInstance($formulaName, $workSheet, $globalFormulaValue));
117
        $spreadSheet->addDefinedName(DefinedName::createInstance($formulaName, $workSheet, $localFormulaValue, true));
118
119
        $localScopedFormula = $spreadSheet->getNamedFormula($formulaName, $workSheet);
120
        self::assertSame($localFormulaValue, $localScopedFormula->getValue());
121
    }
122
123
    public function testGetGlobalNamedFormula(): void
124
    {
125
        $formulaName = 'GERMAN_VAT_RATE';
126
        $globalFormulaValue = '=19.0%';
127
        $localFormulaValue = '=16.0%';
128
129
        $spreadSheet = new Spreadsheet();
130
        $workSheet1 = $spreadSheet->getActiveSheet();
131
        $spreadSheet->createSheet(1);
132
        $workSheet2 = $spreadSheet->getSheet(1);
133
134
        $spreadSheet->addDefinedName(DefinedName::createInstance($formulaName, $workSheet1, $globalFormulaValue));
135
        $spreadSheet->addDefinedName(DefinedName::createInstance($formulaName, $workSheet1, $localFormulaValue, true));
136
137
        $localScopedFormula = $spreadSheet->getNamedFormula($formulaName, $workSheet2);
138
        self::assertSame($globalFormulaValue, $localScopedFormula->getValue());
139
    }
140
141
    public function providerRangeOrFormula(): array
142
    {
143
        return [
144
            'simple range' => ['A1', false],
145
            'simple absolute range' => ['$A$1', false],
146
            'simple integer value' => ['42', true],
147
            'simple float value' => ['12.5', true],
148
            'simple string value' => ['"HELLO WORLD"', true],
149
            'range with a worksheet name' => ['Sheet2!$A$1', false],
150
            'range with a quoted worksheet name' => ["'Work Sheet #2'!\$A\$1:\$E\$1", false],
151
            'range with a quoted worksheet name containing quotes' => ["'Mark''s WorkSheet'!\$A\$1:\$E\$1", false],
152
            'range with a utf-8 worksheet name' => ['Γειά!$A$1', false],
153
            'range with a quoted utf-8 worksheet name' => ["'Γειά σου Κόσμε'!\$A\$1", false],
154
            'range with a quoted worksheet name with quotes in a formula' => ["'Mark''s WorkSheet'!\$A\$1+5", true],
155
            'range with a quoted worksheet name in a formula' => ["5*'Work Sheet #2'!\$A\$1", true],
156
            'multiple ranges with quoted worksheet names with quotes in a formula' => ["'Mark''s WorkSheet'!\$A\$1+'Mark''s WorkSheet'!\$B\$2", true],
157
            'named range in a formula' => ['NAMED_RANGE_VALUE+12', true],
158
            'named range and range' => ['NAMED_RANGE_VALUE_1,Sheet2!$A$1', false],
159
            'range with quoted utf-8 worksheet name and a named range' => ["NAMED_RANGE_VALUE_1,'Γειά σου Κόσμε'!\$A\$1", false],
160
            'composite named range' => ['NAMED_RANGE_VALUE_1,NAMED_RANGE_VALUE_2 NAMED_RANGE_VALUE_3', false],
161
            'named ranges in a formula' => ['NAMED_RANGE_VALUE_1/NAMED_RANGE_VALUE_2', true],
162
            'utf-8 named range' => ['Γειά', false],
163
            'utf-8 named range in a formula' => ['2*Γειά', true],
164
            'utf-8 named ranges' => ['Γειά,σου Κόσμε', false],
165
            'utf-8 named ranges in a formula' => ['Здравствуй+мир', true],
166
        ];
167
    }
168
169
    public function testEmptyNamedFormula(): void
170
    {
171
        $this->expectException(\PhpOffice\PhpSpreadsheet\Exception::class);
172
        $spreadSheet = new Spreadsheet();
173
        $workSheet1 = $spreadSheet->getActiveSheet();
174
        new NamedFormula('namedformula', $workSheet1);
175
    }
176
177
    public function testChangeFormula(): void
178
    {
179
        $spreadSheet = new Spreadsheet();
180
        $workSheet1 = $spreadSheet->getActiveSheet();
181
        $namedFormula = new NamedFormula('namedformula', $workSheet1, '=1');
182
        self::assertEquals('=1', $namedFormula->getFormula());
183
        $namedFormula->setFormula('=2');
184
        self::assertEquals('=2', $namedFormula->getFormula());
185
        $namedFormula->setFormula('');
186
        self::assertEquals('=2', $namedFormula->getFormula());
187
    }
188
}
189