Files
PhpSpreadsheet/tests/PhpSpreadsheetTests/Cell/CellArrayFormulaTest.php
T
MarkBaker 7d5dc726b7 Maintain reference for cells inside a spillage range to prevent their being updated; but allow update of the actual formula cell (adjusting spillage range sa required), and allow setting/update during file load.
Additional unit tests for setting/clearing spillage range for array formulae
Plus a bugfix when worksheet context lost on clearing a spillage range
2022-02-24 15:37:03 +01:00

82 lines
2.9 KiB
PHP

<?php
namespace PhpOffice\PhpSpreadsheetTests\Cell;
use PhpOffice\PhpSpreadsheet\Cell\DataType;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PHPUnit\Framework\TestCase;
class CellArrayFormulaTest extends TestCase
{
public function testSetValueArrayFormulaNoSpillage(): void
{
$spreadsheet = new Spreadsheet();
$cell = $spreadsheet->getActiveSheet()->getCell('A1');
$cell->setValueExplicit('=MAX(ABS({5, -3; 1, -12}))', DataType::TYPE_FORMULA, true);
self::assertSame(12, $cell->getCalculatedValue());
self::assertTrue($cell->isArrayFormula());
self::assertSame('A1', $cell->arrayFormulaRange());
$spreadsheet->disconnectWorksheets();
}
public function testSetValueArrayFormulaWithSpillage(): void
{
$spreadsheet = new Spreadsheet();
$cell = $spreadsheet->getActiveSheet()->getCell('A1');
$cell->setValueExplicit('=SEQUENCE(3, 3, 1, 1)', DataType::TYPE_FORMULA, true, 'A1:C3');
self::assertSame(1, $cell->getCalculatedValue());
self::assertTrue($cell->isArrayFormula());
self::assertSame('A1:C3', $cell->arrayFormulaRange());
$spreadsheet->disconnectWorksheets();
}
public function testSetValueInSpillageRangeCell(): void
{
$spreadsheet = new Spreadsheet();
$cell = $spreadsheet->getActiveSheet()->getCell('A1');
$cell->setValueExplicit('=SEQUENCE(3, 3, 1, 1)', DataType::TYPE_FORMULA, true, 'A1:C3');
$cellAddress = 'C3';
$spillageCell = $spreadsheet->getActiveSheet()->getCell($cellAddress);
self::assertTrue($spillageCell->isInSpillageRange());
$spreadsheet->disconnectWorksheets();
}
public function testUpdateArrayFormulaForSpillageRange(): void
{
$spreadsheet = new Spreadsheet();
$cell = $spreadsheet->getActiveSheet()->getCell('A1');
$cell->setValueExplicit('=SEQUENCE(3, 3, 1, 1)', DataType::TYPE_FORMULA, true, 'A1:C3');
$cell->setValueExplicit('=SEQUENCE(2, 2, 4, -1)', DataType::TYPE_FORMULA, true, 'A1:B2');
self::assertSame(4, $cell->getCalculatedValue());
self::assertTrue($cell->isArrayFormula());
self::assertSame('A1:B2', $cell->arrayFormulaRange());
$spreadsheet->disconnectWorksheets();
}
public function testSetValueToFormerSpillageCell(): void
{
$spreadsheet = new Spreadsheet();
$cell = $spreadsheet->getActiveSheet()->getCell('A1');
$cell->setValueExplicit('=SEQUENCE(3, 3, 1, 1)', DataType::TYPE_FORMULA, true, 'A1:C3');
$cell->setValueExplicit('=SEQUENCE(2, 2, 4, -1)', DataType::TYPE_FORMULA, true, 'A1:B2');
$cellAddress = 'C3';
$formerSpillageCell = $spreadsheet->getActiveSheet()->getCell($cellAddress);
$formerSpillageCell->setValue('PHP');
self::assertSame('PHP', $formerSpillageCell->getValue());
$spreadsheet->disconnectWorksheets();
}
}