Failed Conditions
Pull Request — master (#4447)
by Owen
17:43 queued 17s
created

HtmlNumberFormatTest::tearDown()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 0
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace PhpOffice\PhpSpreadsheetTests\Writer\Html;
6
7
use DOMDocument;
8
use PhpOffice\PhpSpreadsheet\Settings;
9
use PhpOffice\PhpSpreadsheet\Shared\StringHelper;
10
use PhpOffice\PhpSpreadsheet\Spreadsheet;
11
use PhpOffice\PhpSpreadsheet\Writer\Html;
12
use PhpOffice\PhpSpreadsheetTests\Functional;
13
use PHPUnit\Framework\Attributes\DataProvider;
14
15
class HtmlNumberFormatTest extends Functional\AbstractFunctional
16
{
17
    protected function setUp(): void
18
    {
19
        StringHelper::setCurrencyCode('$');
20
        StringHelper::setDecimalSeparator('.');
21
        StringHelper::setThousandsSeparator(',');
22
    }
23
24
    protected function tearDown(): void
25
    {
26
        StringHelper::setCurrencyCode(null);
27
        StringHelper::setDecimalSeparator(null);
28
        StringHelper::setThousandsSeparator(null);
29
    }
30
31
    public function testColorNumberFormat(): void
32
    {
33
        $spreadsheet = new Spreadsheet();
34
        $sheet = $spreadsheet->getActiveSheet();
35
        $sheet->setCellValue('A1', -50);
36
        $sheet->setCellValue('A2', 3000);
37
        $sheet->setCellValue('A3', 0);
38
        $sheet->setCellValue('A4', '<br>');
39
        $fmt = '[Blue]$#,##0;[Red]$#,##0;$#,##0';
40
        $sheet->getStyle('A1:A4')->getNumberFormat()->setFormatCode($fmt);
41
42
        $writer = new Html($spreadsheet);
43
        $html = $writer->generateHTMLAll();
44
        $dom = new DOMDocument();
45
        $dom->loadHTML($html);
46
        $body = $dom->getElementsByTagName('body')->item(0);
47
        self::assertNotNull($body);
48
        $divs = $body->getElementsByTagName('div');
49
50
        $tabl = $divs->item(0)?->getElementsByTagName('table');
51
        $tbod = $tabl?->item(0)?->getElementsByTagName('tbody');
52
        $rows = $tbod?->item(0)?->getElementsByTagName('tr');
53
        self::assertCount(4, $rows);
54
55
        $tds = $rows?->item(0)?->getElementsByTagName('td');
56
        self::assertCount(1, $tds);
57
        $spans = $tds?->item(0)?->getElementsByTagName('span');
58
        self::assertCount(1, $spans);
59
        $style = $spans?->item(0)?->getAttribute('style');
60
        self::assertSame(1, preg_match('/color:red/', "$style"));
61
        self::assertSame('$50', $spans?->item(0)?->textContent);
62
63
        $tds = $rows?->item(1)?->getElementsByTagName('td');
64
        self::assertCount(1, $tds);
65
        $spans = $tds?->item(0)?->getElementsByTagName('span');
66
        self::assertCount(1, $spans);
67
        $style = $spans?->item(0)?->getAttribute('style');
68
        self::assertSame(1, preg_match('/color:blue/', "$style"));
69
        self::assertSame('$3,000', $spans?->item(0)?->textContent);
70
71
        $tds = $rows?->item(2)?->getElementsByTagName('td');
72
        self::assertCount(1, $tds);
73
        $spans = $tds?->item(0)?->getElementsByTagName('span');
74
        self::assertCount(0, $spans);
75
        self::assertSame('$0', $tds?->item(0)?->textContent);
76
77
        $tds = $rows?->item(3)?->getElementsByTagName('td');
78
        self::assertCount(1, $tds);
79
        $spans = $tds?->item(0)?->getElementsByTagName('span');
80
        self::assertCount(0, $spans);
81
        self::assertEquals('<br>', $tds?->item(0)?->textContent);
82
83
        $rls = $this->writeAndReload($spreadsheet, 'Html');
84
        $spreadsheet->disconnectWorksheets();
85
        $rls->disconnectWorksheets();
86
    }
87
88
    public function testColorNumberFormatComplex(): void
89
    {
90
        $spreadsheet = new Spreadsheet();
91
        $sheet = $spreadsheet->getActiveSheet();
92
        $sheet->setCellValue('A1', -50);
93
        $sheet->setCellValue('A2', 3000.75);
94
        $sheet->setCellValue('A3', 0);
95
        $sheet->setCellValue('A4', 3000.25);
96
        $fmt = '[Blue][>=3000.5]$#,##0.00;[Red][<0]$#,##0.00;$#,##0.00';
97
        $sheet->getStyle('A1:A4')->getNumberFormat()->setFormatCode($fmt);
98
99
        $writer = new Html($spreadsheet);
100
        $html = $writer->generateHTMLAll();
101
        $dom = new DOMDocument();
102
        $dom->loadHTML($html);
103
        $body = $dom->getElementsByTagName('body')->item(0);
104
        self::assertNotNull($body);
105
        $divs = $body->getElementsByTagName('div');
106
107
        $tabl = $divs->item(0)?->getElementsByTagName('table');
108
        $tbod = $tabl?->item(0)?->getElementsByTagName('tbody');
109
        $rows = $tbod?->item(0)?->getElementsByTagName('tr');
110
        self::assertCount(4, $rows);
111
112
        $tds = $rows?->item(0)?->getElementsByTagName('td');
113
        self::assertCount(1, $tds);
114
        $spans = $tds?->item(0)?->getElementsByTagName('span');
115
        self::assertCount(1, $spans);
116
        $style = $spans?->item(0)?->getAttribute('style');
117
        self::assertSame(1, preg_match('/color:red/', "$style"));
118
        self::assertSame('$50.00', $spans?->item(0)?->textContent);
119
120
        $tds = $rows?->item(1)?->getElementsByTagName('td');
121
        self::assertCount(1, $tds);
122
        $spans = $tds?->item(0)?->getElementsByTagName('span');
123
        self::assertCount(1, $spans);
124
        $style = $spans?->item(0)?->getAttribute('style');
125
        self::assertSame(1, preg_match('/color:blue/', "$style"));
126
        self::assertSame('$3,000.75', $spans?->item(0)?->textContent);
127
128
        $tds = $rows?->item(2)?->getElementsByTagName('td');
129
        self::assertCount(1, $tds);
130
        $spans = $tds?->item(0)?->getElementsByTagName('span');
131
        self::assertCount(0, $spans);
132
        self::assertSame('$0.00', $tds?->item(0)?->textContent);
133
134
        $tds = $rows?->item(3)?->getElementsByTagName('td');
135
        self::assertCount(1, $tds);
136
        $spans = $tds?->item(0)?->getElementsByTagName('span');
137
        self::assertCount(0, $spans);
138
        self::assertSame('$3,000.25', $tds?->item(0)?->textContent);
139
140
        $rls = $this->writeAndReload($spreadsheet, 'Html');
141
        $spreadsheet->disconnectWorksheets();
142
        $rls->disconnectWorksheets();
143
    }
144
145
    #[DataProvider('numberFormatProvider')]
146
    public function testFormatValueWithMask(mixed $expectedResult, mixed $val, string $fmt): void
147
    {
148
        $spreadsheet = new Spreadsheet();
149
        $sheet = $spreadsheet->getActiveSheet();
150
        $sheet->getCell('A1')->setValue($val)->getStyle()->getNumberFormat()->setFormatCode($fmt);
151
152
        $writer = new Html($spreadsheet);
153
        $html = $writer->generateHTMLAll();
154
        $dom = new DOMDocument();
155
        $dom->loadHTML($html);
156
        $body = $dom->getElementsByTagName('body')->item(0);
157
        self::assertNotNull($body);
158
        $divs = $body->getElementsByTagName('div');
159
160
        $tabl = $divs->item(0)?->getElementsByTagName('table');
161
        $tbod = $tabl?->item(0)?->getElementsByTagName('tbody');
162
        $rows = $tbod?->item(0)?->getElementsByTagName('tr');
163
164
        $tds = $rows?->item(0)?->getElementsByTagName('td');
165
        $nbsp = html_entity_decode('&nbsp;', Settings::htmlEntityFlags());
166
        self::assertEquals($expectedResult, str_replace($nbsp, ' ', (string) $tds?->item(0)?->textContent));
167
168
        $rls = $this->writeAndReload($spreadsheet, 'Html');
169
        $spreadsheet->disconnectWorksheets();
170
        $rls->disconnectWorksheets();
171
    }
172
173
    /** @return mixed[] */
174
    public static function numberFormatProvider(): array
175
    {
176
        /** @var mixed[] */
177
        $retVal = require __DIR__ . '/../../../data/Style/NumberFormat.php';
178
179
        return $retVal;
180
    }
181
182
    #[DataProvider('numberFormatDatesProvider')]
183
    public function testFormatValueWithMaskDate(mixed $expectedResult, mixed $val, string $fmt): void
184
    {
185
        $spreadsheet = new Spreadsheet();
186
        $sheet = $spreadsheet->getActiveSheet();
187
        $sheet->getCell('A1')->setValue($val)->getStyle()->getNumberFormat()->setFormatCode($fmt);
188
189
        $writer = new Html($spreadsheet);
190
        $html = $writer->generateHTMLAll();
191
        $dom = new DOMDocument();
192
        $dom->loadHTML($html);
193
        $body = $dom->getElementsByTagName('body')->item(0);
194
        self::assertNotNull($body);
195
        $divs = $body->getElementsByTagName('div');
196
197
        $tabl = $divs->item(0)?->getElementsByTagName('table');
198
        $tbod = $tabl?->item(0)?->getElementsByTagName('tbody');
199
        $rows = $tbod?->item(0)?->getElementsByTagName('tr');
200
201
        $tds = $rows?->item(0)?->getElementsByTagName('td');
202
        $nbsp = html_entity_decode('&nbsp;', Settings::htmlEntityFlags());
203
        self::assertSame($expectedResult, str_replace($nbsp, ' ', (string) $tds?->item(0)?->textContent));
204
205
        $rls = $this->writeAndReload($spreadsheet, 'Html');
206
        $spreadsheet->disconnectWorksheets();
207
        $rls->disconnectWorksheets();
208
    }
209
210
    /** @return mixed[] */
211
    public static function numberFormatDatesProvider(): array
212
    {
213
        /** @var mixed[] */
214
        $retVal = require __DIR__ . '/../../../data/Style/NumberFormatDates.php';
215
216
        return $retVal;
217
    }
218
}
219