Passed
Pull Request — master (#3311)
by Mark
13:26
created

StructuredReferenceFormulaTest   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 65
Duplicated Lines 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
wmc 4
eloc 37
c 3
b 0
f 0
dl 0
loc 65
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A testStructuredReferenceHiddenHeaders() 0 20 1
A testStructuredReferences() 0 10 1
A testStructuredReferenceInvalidColumn() 0 13 1
A structuredReferenceProvider() 0 11 1
1
<?php
2
3
namespace PhpOffice\PhpSpreadsheetTests\Calculation;
4
5
use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
6
use PhpOffice\PhpSpreadsheet\IOFactory;
7
use PhpOffice\PhpSpreadsheet\Worksheet\Table;
8
use PHPUnit\Framework\TestCase;
9
10
class StructuredReferenceFormulaTest extends TestCase
11
{
12
    /**
13
     * @dataProvider structuredReferenceProvider
14
     */
15
    public function testStructuredReferences(float $expectedValue, string $cellAddress): void
16
    {
17
        $inputFileType = 'Xlsx';
18
        $inputFileName = __DIR__ . '/../../data/Calculation/TableFormulae.xlsx';
19
20
        $reader = IOFactory::createReader($inputFileType);
21
        $spreadsheet = $reader->load($inputFileName);
22
23
        $calculatedCellValue = $spreadsheet->getActiveSheet()->getCell($cellAddress)->getCalculatedValue();
24
        self::assertEqualsWithDelta($expectedValue, $calculatedCellValue, 1.0e-14, "Failed calculation for cell {$cellAddress}");
25
    }
26
27
    public function testStructuredReferenceHiddenHeaders(): void
28
    {
29
        $inputFileType = 'Xlsx';
30
        $inputFileName = __DIR__ . '/../../data/Calculation/TableFormulae.xlsx';
31
32
        $reader = IOFactory::createReader($inputFileType);
33
        $spreadsheet = $reader->load($inputFileName);
34
        /** @var Table $table */
35
        $table = $spreadsheet->getActiveSheet()->getTableByName('DeptSales');
36
37
        $cellAddress = 'G8';
38
        $spreadsheet->getActiveSheet()->getCell($cellAddress)->setValue('=DeptSales[[#Headers][Region]]');
39
        $result = $spreadsheet->getActiveSheet()->getCell($cellAddress)->getCalculatedValue();
40
        self::assertSame('Region', $result);
41
42
        $spreadsheet->getCalculationEngine()->flushInstance(); // @phpstan-ignore-line
43
        $table->setShowHeaderRow(false);
44
45
        $result = $spreadsheet->getActiveSheet()->getCell($cellAddress)->getCalculatedValue();
46
        self::assertSame(ExcelError::REF(), $result);
47
    }
48
49
    public function testStructuredReferenceInvalidColumn(): void
50
    {
51
        $inputFileType = 'Xlsx';
52
        $inputFileName = __DIR__ . '/../../data/Calculation/TableFormulae.xlsx';
53
54
        $reader = IOFactory::createReader($inputFileType);
55
        $spreadsheet = $reader->load($inputFileName);
56
57
        $cellAddress = 'E2';
58
        $spreadsheet->getActiveSheet()->getCell($cellAddress)->setValue('=[@Sales Amount]*[@[%age Commission]]');
59
60
        $result = $spreadsheet->getActiveSheet()->getCell($cellAddress)->getCalculatedValue();
61
        self::assertSame(ExcelError::REF(), $result);
62
    }
63
64
    public function structuredReferenceProvider(): array
65
    {
66
        return [
67
            [26.0, 'E2'],
68
            [99.0, 'E3'],
69
            [141.0, 'E4'],
70
            [49.2, 'E5'],
71
            [120.0, 'E6'],
72
            [135.0, 'E7'],
73
            [570.2, 'E8'],
74
            [3970.0, 'C8'],
75
        ];
76
    }
77
}
78