Files
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

81 lines
2.5 KiB
PHP

<?php
namespace PhpOffice\PhpSpreadsheetTests\Calculation;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PHPUnit\Framework\TestCase;
class InternalFunctionsTest extends TestCase
{
/**
* @dataProvider anchorArrayDataProvider
*/
public function testAnchorArrayFormula(string $reference, string $range, array $expectedResult): void
{
$spreadsheet = new Spreadsheet();
$sheet1 = $spreadsheet->getActiveSheet();
$sheet1->setTitle('SheetOne'); // no space in sheet title
$sheet2 = $spreadsheet->createSheet();
$sheet2->setTitle('Sheet Two'); // space in sheet title
$sheet1->setCellValue('C3', '=SEQUENCE(3,3,-4)', true, 'C3:E5');
$sheet2->setCellValue('C3', '=SEQUENCE(3,3, 9, -1)', true, 'C3:E5');
$sheet1->setCellValue('A8', "=ANCHORARRAY({$reference})", true, $range);
$result1 = $sheet1->getCell('A8')->getCalculatedValue(true, true);
self::assertSame($expectedResult, $result1);
$attributes1 = $sheet1->getCell('A8')->getFormulaAttributes();
self::assertSame(['t' => 'array', 'ref' => $range], $attributes1);
}
public function anchorArrayDataProvider(): array
{
return [
[
'C3',
'A8:C10',
[[-4, -3, -2], [-1, 0, 1], [2, 3, 4]],
],
[
"'Sheet Two'!C3",
'A8:C10',
[[9, 8, 7], [6, 5, 4], [3, 2, 1]],
],
];
}
/**
* @dataProvider singleDataProvider
*/
public function testSingleArrayFormula(string $reference, array $expectedResult): void
{
$spreadsheet = new Spreadsheet();
$sheet1 = $spreadsheet->getActiveSheet();
$sheet1->setTitle('SheetOne'); // no space in sheet title
$sheet2 = $spreadsheet->createSheet();
$sheet2->setTitle('Sheet Two'); // space in sheet title
$sheet1->setCellValue('C3', '=SEQUENCE(3,3,-4)', true, 'C3:E5');
$sheet2->setCellValue('C3', '=SEQUENCE(3,3, 9, -1)', true, 'C3:E5');
$sheet1->setCellValue('A8', "=SINGLE({$reference})");
$result1 = $sheet1->getCell('A8')->getCalculatedValue(true, true);
self::assertSame($expectedResult, $result1);
}
public function singleDataProvider(): array
{
return [
[
'C3',
[[-4]],
],
[
"'Sheet Two'!C3",
[[9]],
],
];
}
}