| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- <?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->getSheet();
- $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->getSheet();
- $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->getSheet();
- $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((int) $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->getSheet();
- $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());
- }
- public function testRefError(): void
- {
- $sheet = $this->getSheet();
- $sheet->getCell('A1')->setValue('=SUBTOTAL(9, #REF!)');
- self::assertEquals('#REF!', $sheet->getCell('A1')->getCalculatedValue());
- }
- public function testSecondaryRefError(): void
- {
- $sheet = $this->getSheet();
- $sheet->getCell('A1')->setValue('=SUBTOTAL(9, B1:B9,#REF!,C1:C9)');
- self::assertEquals('#REF!', $sheet->getCell('A1')->getCalculatedValue());
- }
- public function testNonStringSingleCellRefError(): void
- {
- $sheet = $this->getSheet();
- $sheet->getCell('A1')->setValue('=SUBTOTAL(9, 1, C1, Sheet99!A11)');
- self::assertEquals('#REF!', $sheet->getCell('A1')->getCalculatedValue());
- }
- public function testNonStringCellRangeRefError(): void
- {
- $sheet = $this->getSheet();
- $sheet->getCell('A1')->setValue('=SUBTOTAL(9, Sheet99!A1)');
- self::assertEquals('#REF!', $sheet->getCell('A1')->getCalculatedValue());
- }
- }
|