Failed Conditions
Pull Request — master (#3876)
by Abdul Malik
22:45 queued 13:31
created

ReferenceHelper3Test::testCompletelyRelative()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 39
Code Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 30
c 1
b 0
f 0
dl 0
loc 39
rs 9.44
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace PhpOffice\PhpSpreadsheetTests;
6
7
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
0 ignored issues
show
Bug introduced by
The type PhpOffice\PhpSpreadsheet\Calculation\Calculation was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
8
use PhpOffice\PhpSpreadsheet\NamedRange;
9
use PhpOffice\PhpSpreadsheet\Spreadsheet;
10
use PHPUnit\Framework\TestCase;
11
12
class ReferenceHelper3Test extends TestCase
13
{
14
    public function testIssue3661(): void
15
    {
16
        $spreadsheet = new Spreadsheet();
17
        $sheet = $spreadsheet->getActiveSheet();
18
        $sheet->setTitle('Data');
19
20
        $spreadsheet->addNamedRange(new NamedRange('FIRST', $sheet, '=$A1'));
21
        $spreadsheet->addNamedRange(new NamedRange('SECOND', $sheet, '=$B1'));
22
        $spreadsheet->addNamedRange(new NamedRange('THIRD', $sheet, '=$C1'));
23
24
        $sheet->fromArray([
25
            [1, 2, 3, '=FIRST', '=SECOND', '=THIRD', '=10*$A1'],
26
            [4, 5, 6, '=FIRST', '=SECOND', '=THIRD'],
27
            [7, 8, 9, '=FIRST', '=SECOND', '=THIRD'],
28
        ]);
29
30
        $sheet->insertNewRowBefore(1, 4);
31
        $sheet->insertNewColumnBefore('A', 1);
32
        self::assertSame(1, $sheet->getCell('E5')->getCalculatedValue());
33
        self::assertSame(5, $sheet->getCell('F6')->getCalculatedValue());
34
        self::assertSame(9, $sheet->getCell('G7')->getCalculatedValue());
35
        self::assertSame('=10*$B5', $sheet->getCell('H5')->getValue());
36
        self::assertSame(10, $sheet->getCell('H5')->getCalculatedValue());
37
        $firstColumn = $spreadsheet->getNamedRange('FIRST');
38
        /** @var NamedRange $firstColumn */
39
        self::assertSame('=$B1', $firstColumn->getRange());
40
        $spreadsheet->disconnectWorksheets();
41
    }
42
43
    public function testCompletelyRelative(): void
44
    {
45
        $spreadsheet = new Spreadsheet();
46
        $sheet = $spreadsheet->getActiveSheet();
47
        $sheet->setTitle('Data');
48
49
        $spreadsheet->addNamedRange(new NamedRange('CellAbove', $sheet, '=A1048576'));
50
        $spreadsheet->addNamedRange(new NamedRange('CellBelow', $sheet, '=A2'));
51
        $spreadsheet->addNamedRange(new NamedRange('CellToLeft', $sheet, '=XFD1'));
52
        $spreadsheet->addNamedRange(new NamedRange('CellToRight', $sheet, '=B1'));
53
54
        $sheet->fromArray([
55
            [null, 'Above', null, null, 'Above', null, null, 'Above', null, null, 'Above', null],
56
            ['Left', '=CellAbove', 'Right', 'Left', '=CellBelow', 'Right', 'Left', '=CellToLeft', 'Right', 'Left', '=CellToRight', 'Right'],
57
            [null, 'Below', null, null, 'Below', null, null, 'Below', null, null, 'Below', null],
58
        ], null, 'A1', true);
59
        self::assertSame('Above', $sheet->getCell('B2')->getCalculatedValue());
60
        self::assertSame('Below', $sheet->getCell('E2')->getCalculatedValue());
61
        self::assertSame('Left', $sheet->getCell('H2')->getCalculatedValue());
62
        self::assertSame('Right', $sheet->getCell('K2')->getCalculatedValue());
63
64
        Calculation::getInstance($spreadsheet)->flushInstance();
65
        self::assertNull($sheet->getCell('L7')->getCalculatedValue(), 'value in L7 after flush is null');
66
        // Reset it once more
67
        Calculation::getInstance($spreadsheet)->flushInstance();
68
        // shift 5 rows down and 1 column to the right
69
        $sheet->insertNewRowBefore(1, 5);
70
        $sheet->insertNewColumnBefore('A', 1);
71
72
        self::assertSame('Above', $sheet->getCell('C7')->getCalculatedValue()); // Above
73
        self::assertSame('Below', $sheet->getCell('F7')->getCalculatedValue());
74
        self::assertSame('Left', $sheet->getCell('I7')->getCalculatedValue());
75
        self::assertSame('Right', $sheet->getCell('L7')->getCalculatedValue());
76
77
        $sheet2 = $spreadsheet->createSheet();
78
        $sheet2->setCellValue('L6', 'NotThisCell');
79
        $sheet2->setCellValue('L7', '=CellAbove');
80
        self::assertSame('Above', $sheet2->getCell('L7')->getCalculatedValue(), 'relative value uses cell on worksheet where name is defined');
81
        $spreadsheet->disconnectWorksheets();
82
    }
83
84
    private static bool $sumFormulaWorking = false;
85
86
    public function testSumAboveCell(): void
87
    {
88
        $spreadsheet = new Spreadsheet();
89
        $sheet = $spreadsheet->getActiveSheet();
90
        $spreadsheet->addNamedRange(new NamedRange('AboveCell', $sheet, 'A1048576'));
91
        $sheet->setCellValue('C2', 123);
92
        $sheet->setCellValue('C3', '=AboveCell');
93
        $sheet->fromArray([
94
            ['Column 1', 'Column 2'],
95
            [2, 1],
96
            [4, 3],
97
            [6, 5],
98
            [8, 7],
99
            [10, 9],
100
            [12, 11],
101
            [14, 13],
102
            [16, 15],
103
            ['=SUM(A2:AboveCell)', '=SUM(B2:AboveCell)'],
104
        ], null, 'A1', true);
105
        self::assertSame(123, $sheet->getCell('C3')->getCalculatedValue());
106
        if (self::$sumFormulaWorking) {
107
            self::assertSame(72, $sheet->getCell('A10')->getCalculatedValue());
108
        } else {
109
            $spreadsheet->disconnectWorksheets();
110
            self::markTestIncomplete('PhpSpreadsheet does not handle this correctly');
111
        }
112
        $spreadsheet->disconnectWorksheets();
113
    }
114
}
115