Passed
Pull Request — master (#4302)
by Owen
13:55
created

Issue641Test::testIssue641()   B

Complexity

Conditions 6
Paths 24

Size

Total Lines 66
Code Lines 45

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 45
c 1
b 0
f 0
dl 0
loc 66
rs 8.5777
cc 6
nc 24
nop 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
declare(strict_types=1);
4
5
namespace PhpOffice\PhpSpreadsheetTests\Worksheet;
6
7
use PhpOffice\PhpSpreadsheet\Spreadsheet;
8
use PHPUnit\Framework\TestCase;
9
10
class Issue641Test extends TestCase
11
{
12
    /**
13
     * Problem cloning sheet referred to in formulas.
14
     */
15
    public function testIssue641(): void
16
    {
17
        $xlsx = new Spreadsheet();
18
        $xlsx->removeSheetByIndex(0);
19
        $availableWs = [];
20
21
        $worksheet = $xlsx->createSheet();
22
        $worksheet->setTitle('Condensed A');
23
        $worksheet->getCell('A1')->setValue("=SUM('Detailed A'!A1:A10)");
24
        $worksheet->getCell('A2')->setValue(mt_rand(1, 30));
25
        $availableWs[] = 'Condensed A';
26
27
        $worksheet = $xlsx->createSheet();
28
        $worksheet->setTitle('Condensed B');
29
        $worksheet->getCell('A1')->setValue("=SUM('Detailed B'!A1:A10)");
30
        $worksheet->getCell('A2')->setValue(mt_rand(1, 30));
31
        $availableWs[] = 'Condensed B';
32
33
        // at this point the value in worksheet 'Condensed B' cell A1 is
34
        // =SUM('Detailed B'!A1:A10)
35
36
        // worksheet in question is cloned and totals are attached
37
        $totalWs1 = clone $xlsx->getSheet($xlsx->getSheetCount() - 1);
38
        $totalWs1->setTitle('Condensed Total');
39
        $xlsx->addSheet($totalWs1);
40
        $formula = '=';
41
        foreach ($availableWs as $ws) {
42
            $formula .= sprintf("+'%s'!A2", $ws);
43
        }
44
        $totalWs1->getCell('A1')->setValue("=SUM('Detailed Total'!A1:A10)");
45
        $totalWs1->getCell('A2')->setValue($formula);
46
47
        $availableWs = [];
48
49
        $worksheet = $xlsx->createSheet();
50
        $worksheet->setTitle('Detailed A');
51
        for ($step = 1; $step <= 10; ++$step) {
52
            $worksheet->getCell("A{$step}")->setValue(mt_rand(1, 30));
53
        }
54
        $availableWs[] = 'Detailed A';
55
56
        $worksheet = $xlsx->createSheet();
57
        $worksheet->setTitle('Detailed B');
58
        for ($step = 1; $step <= 10; ++$step) {
59
            $worksheet->getCell("A{$step}")->setValue(mt_rand(1, 30));
60
        }
61
        $availableWs[] = 'Detailed B';
62
63
        $totalWs2 = clone $xlsx->getSheet($xlsx->getSheetCount() - 1);
64
        $totalWs2->setTitle('Detailed Total');
65
        $xlsx->addSheet($totalWs2);
66
67
        for ($step = 1; $step <= 10; ++$step) {
68
            $formula = '=';
69
            foreach ($availableWs as $ws) {
70
                $formula .= sprintf("+'%s'!A%s", $ws, $step);
71
            }
72
            $totalWs2->getCell("A{$step}")->setValue($formula);
73
        }
74
75
        self::assertSame("=SUM('Detailed A'!A1:A10)", $xlsx->getSheetByName('Condensed A')?->getCell('A1')?->getValue());
76
        self::assertSame("=SUM('Detailed B'!A1:A10)", $xlsx->getSheetByName('Condensed B')?->getCell('A1')?->getValue());
77
        self::assertSame("=SUM('Detailed Total'!A1:A10)", $xlsx->getSheetByName('Condensed Total')?->getCell('A1')?->getValue());
78
        self::assertSame("=+'Detailed A'!A1+'Detailed B'!A1", $xlsx->getSheetByName('Detailed Total')?->getCell('A1')?->getValue());
79
80
        $xlsx->disconnectWorksheets();
81
    }
82
}
83