PhpSpreadsheet/tests/PhpSpreadsheetTests/Calculation/Engine/RangeTest.php

168 lines
5.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Engine;
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
use PhpOffice\PhpSpreadsheet\NamedRange;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PHPUnit\Framework\TestCase;
class RangeTest extends TestCase
{
protected $spreadSheet;
protected function setUp(): void
{
$this->spreadSheet = new Spreadsheet();
$this->spreadSheet->getActiveSheet()
->setCellValue('A1', 1)
->setCellValue('B1', 2)
->setCellValue('C1', 3)
->setCellValue('A2', 4)
->setCellValue('B2', 5)
->setCellValue('C2', 6)
->setCellValue('A3', 7)
->setCellValue('B3', 8)
->setCellValue('C3', 9);
}
/**
* @dataProvider providerRangeEvaluation
*
* @param string $formula
* @param int $expectedResult
*/
public function testRangeEvaluation($formula, $expectedResult): void
{
$workSheet = $this->spreadSheet->getActiveSheet();
$workSheet->setCellValue('E1', $formula);
$actualRresult = $workSheet->getCell('E1')->getCalculatedValue();
self::assertSame($expectedResult, $actualRresult);
}
public function providerRangeEvaluation()
{
return[
['=SUM(A1:B3,A1:C2)', 48],
['=COUNT(A1:B3,A1:C2)', 12],
['=SUM(A1:B3 A1:C2)', 12],
['=COUNT(A1:B3 A1:C2)', 4],
['=SUM(A1:A3,C1:C3)', 30],
['=COUNT(A1:A3,C1:C3)', 6],
['=SUM(A1:A3 C1:C3)', Functions::null()],
['=COUNT(A1:A3 C1:C3)', 0],
['=SUM(A1:B2,B2:C3)', 40],
['=COUNT(A1:B2,B2:C3)', 8],
['=SUM(A1:B2 B2:C3)', 5],
['=COUNT(A1:B2 B2:C3)', 1],
['=SUM(A1:C1,A3:C3,B1:C3)', 63],
['=COUNT(A1:C1,A3:C3,B1:C3)', 12],
['=SUM(A1:C1,A3:C3 B1:C3)', 23],
['=COUNT(A1:C1,A3:C3 B1:C3)', 5],
];
}
/**
* @dataProvider providerNamedRangeEvaluation
*
* @param string $group1
* @param string $group2
* @param string $formula
* @param int $expectedResult
*/
public function testNamedRangeEvaluation($group1, $group2, $formula, $expectedResult): void
{
$workSheet = $this->spreadSheet->getActiveSheet();
$this->spreadSheet->addNamedRange(new NamedRange('GROUP1', $workSheet, $group1));
$this->spreadSheet->addNamedRange(new NamedRange('GROUP2', $workSheet, $group2));
$workSheet->setCellValue('E1', $formula);
$sumRresult = $workSheet->getCell('E1')->getCalculatedValue();
self::assertSame($expectedResult, $sumRresult);
}
public function providerNamedRangeEvaluation()
{
return[
['A1:B3', 'A1:C2', '=SUM(GROUP1,GROUP2)', 48],
['A1:B3', 'A1:C2', '=COUNT(GROUP1,GROUP2)', 12],
['A1:B3', 'A1:C2', '=SUM(GROUP1 GROUP2)', 12],
['A1:B3', 'A1:C2', '=COUNT(GROUP1 GROUP2)', 4],
['A1:B2', 'B2:C3', '=SUM(GROUP1,GROUP2)', 40],
['A1:B2', 'B2:C3', '=COUNT(GROUP1,GROUP2)', 8],
['A1:B2', 'B2:C3', '=SUM(GROUP1 GROUP2)', 5],
['A1:B2', 'B2:C3', '=COUNT(GROUP1 GROUP2)', 1],
];
}
/**
* @dataProvider providerUTF8NamedRangeEvaluation
*
* @param string $names
* @param string $ranges
* @param string $formula
* @param int $expectedResult
*/
public function testUTF8NamedRangeEvaluation($names, $ranges, $formula, $expectedResult): void
{
$workSheet = $this->spreadSheet->getActiveSheet();
foreach ($names as $index => $name) {
$range = $ranges[$index];
$this->spreadSheet->addNamedRange(new NamedRange($name, $workSheet, $range));
}
$workSheet->setCellValue('E1', $formula);
$sumRresult = $workSheet->getCell('E1')->getCalculatedValue();
self::assertSame($expectedResult, $sumRresult);
}
public function providerUTF8NamedRangeEvaluation()
{
return[
[['Γειά', 'σου', 'Κόσμε'], ['A1', 'B1:B2', 'C1:C3'], '=SUM(Γειά,σου,Κόσμε)', 26],
[['Γειά', 'σου', 'Κόσμε'], ['A1', 'B1:B2', 'C1:C3'], '=COUNT(Γειά,σου,Κόσμε)', 6],
[['Здравствуй', 'мир'], ['A1:A3', 'C1:C3'], '=SUM(Здравствуй,мир)', 30],
];
}
/**
* @dataProvider providerCompositeNamedRangeEvaluation
*
* @param string $composite
* @param int $expectedSum
* @param int $expectedCount
*/
public function testCompositeNamedRangeEvaluation($composite, $expectedSum, $expectedCount): void
{
$workSheet = $this->spreadSheet->getActiveSheet();
$this->spreadSheet->addNamedRange(new NamedRange('COMPOSITE', $workSheet, $composite));
$workSheet->setCellValue('E1', '=SUM(COMPOSITE)');
$workSheet->setCellValue('E2', '=COUNT(COMPOSITE)');
$actualSum = $workSheet->getCell('E1')->getCalculatedValue();
self::assertSame($expectedSum, $actualSum);
$actualCount = $workSheet->getCell('E2')->getCalculatedValue();
self::assertSame($expectedCount, $actualCount);
}
public function providerCompositeNamedRangeEvaluation()
{
return[
// Calculation engine doesn't yet handle union ranges with overlap
// 'Union with overlap' => [
// 'A1:C1,A3:C3,B1:C3',
// 63,
// 12,
// ],
'Intersection' => [
'A1:C1,A3:C3 B1:C3',
23,
5,
],
];
}
}