Files
PhpSpreadsheet/tests/PhpSpreadsheetTests/Calculation/Functions/MathTrig/SubTotalTest.php
T
Adrien Crivelli 4e2259c135 BREAKING Worksheet::getRowDimension() and Worksheet::getColumnDimension() cannot return null anymore
Both methods used to optionally return null if passed a
second argument. This second argument was removed entirely and the
method always returns a RowDimension or ColumnDimension respectively
(possibly creating it if needed).

This make the API more predictable and easier to do static analysis
with tools such as PHPStan.

If you relied on that second parameter, you should instead use the
`Worksheet::getRowDimensions()` or `Worksheet::getColumnDimensions()` and
check for existence yourself before calling the getters.
2021-04-25 17:02:36 +09:00

131 lines
4.3 KiB
PHP

<?php
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\MathTrig;
class SubTotalTest extends AllSetupTeardown
{
/**
* @dataProvider providerSUBTOTAL
*
* @param mixed $expectedResult
* @param mixed $type expect an integer
*/
public function testSubtotal($expectedResult, $type): void
{
$this->mightHaveException($expectedResult);
$sheet = $this->sheet;
$sheet->fromArray([[0], [1], [1], [2], [3], [5], [8], [13], [21], [34], [55], [89]], null, 'A1', true);
$maxCol = $sheet->getHighestColumn();
$maxRow = $sheet->getHighestRow();
$sheet->getCell('D2')->setValue("=SUBTOTAL($type, A1:$maxCol$maxRow)");
$result = $sheet->getCell('D2')->getCalculatedValue();
self::assertEqualsWithDelta($expectedResult, $result, 1E-12);
}
public function providerSUBTOTAL(): array
{
return require 'tests/data/Calculation/MathTrig/SUBTOTAL.php';
}
/**
* @dataProvider providerSUBTOTAL
*
* @param mixed $expectedResult
* @param mixed $type expect an integer
*/
public function testSubtotalColumnHidden($expectedResult, $type): void
{
// Hidden columns don't affect calculation, only hidden rows
$this->mightHaveException($expectedResult);
$sheet = $this->sheet;
$sheet->fromArray([0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89], null, 'A1', true);
$maxCol = $sheet->getHighestColumn();
$maxRow = $sheet->getHighestRow();
$hiddenColumns = [
'A' => false,
'B' => true,
'C' => false,
'D' => true,
'E' => false,
'F' => false,
'G' => false,
'H' => true,
'I' => false,
'J' => true,
'K' => true,
'L' => false,
];
foreach ($hiddenColumns as $col => $hidden) {
$columnDimension = $sheet->getColumnDimension($col);
$columnDimension->setVisible($hidden);
}
$sheet->getCell('D2')->setValue("=SUBTOTAL($type, A1:$maxCol$maxRow)");
$result = $sheet->getCell('D2')->getCalculatedValue();
self::assertEqualsWithDelta($expectedResult, $result, 1E-12);
}
/**
* @dataProvider providerSUBTOTALHIDDEN
*
* @param mixed $expectedResult
* @param mixed $type expect an integer
*/
public function testSubtotalRowHidden($expectedResult, $type): void
{
$this->mightHaveException($expectedResult);
$sheet = $this->sheet;
$sheet->fromArray([[0], [1], [1], [2], [3], [5], [8], [13], [21], [34], [55], [89]], null, 'A1', true);
$maxCol = $sheet->getHighestColumn();
$maxRow = $sheet->getHighestRow();
$visibleRows = [
'1' => false,
'2' => true,
'3' => false,
'4' => true,
'5' => false,
'6' => false,
'7' => false,
'8' => true,
'9' => false,
'10' => true,
'11' => true,
'12' => false,
];
foreach ($visibleRows as $row => $visible) {
$rowDimension = $sheet->getRowDimension($row);
$rowDimension->setVisible($visible);
}
$sheet->getCell('D2')->setValue("=SUBTOTAL($type, A1:$maxCol$maxRow)");
$result = $sheet->getCell('D2')->getCalculatedValue();
self::assertEqualsWithDelta($expectedResult, $result, 1E-12);
}
public function providerSUBTOTALHIDDEN(): array
{
return require 'tests/data/Calculation/MathTrig/SUBTOTALHIDDEN.php';
}
public function testSubtotalNested(): void
{
$sheet = $this->sheet;
$sheet->fromArray(
[
[123],
[234],
['=SUBTOTAL(1,A1:A2)'],
['=ROMAN(SUBTOTAL(1, A1:A2))'],
['This is text containing "=" and "SUBTOTAL("'],
['=AGGREGATE(1, 0, A1:A2)'],
['=SUM(2, 3)'],
],
null,
'A1',
true
);
$maxCol = $sheet->getHighestColumn();
$maxRow = $sheet->getHighestRow();
$sheet->getCell('H1')->setValue("=SUBTOTAL(9, A1:$maxCol$maxRow)");
self::assertEquals(362, $sheet->getCell('H1')->getCalculatedValue());
}
}