mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-08-28 02:58:26 +00:00
ec4098c8fd
While we might never be able to have 100% of our code strict, we can at the very least do it for all of our tests. This ensures that our tests are using our API with the types as intended by the test author, and not silently be cast to what our API requires.
171 lines
5.2 KiB
PHP
171 lines
5.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\Engineering;
|
|
|
|
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
|
|
use PhpOffice\PhpSpreadsheet\Calculation\Engineering\ConvertDecimal;
|
|
use PhpOffice\PhpSpreadsheet\Calculation\Exception as CalculationException;
|
|
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
use PhpOffice\PhpSpreadsheetTests\Calculation\Functions\FormulaArguments;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
class Dec2OctTest extends TestCase
|
|
{
|
|
/**
|
|
* @var string
|
|
*/
|
|
private $compatibilityMode;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
$this->compatibilityMode = Functions::getCompatibilityMode();
|
|
}
|
|
|
|
protected function tearDown(): void
|
|
{
|
|
Functions::setCompatibilityMode($this->compatibilityMode);
|
|
}
|
|
|
|
/**
|
|
* @dataProvider providerDEC2OCT
|
|
*/
|
|
public function testDirectCallToDEC2OCT(mixed $expectedResult, mixed ...$args): void
|
|
{
|
|
/** @scrutinizer ignore-call */
|
|
$result = ConvertDecimal::toOctal(...$args);
|
|
self::assertSame($expectedResult, $result);
|
|
}
|
|
|
|
private function trimIfQuoted(string $value): string
|
|
{
|
|
return trim($value, '"');
|
|
}
|
|
|
|
/**
|
|
* @dataProvider providerDEC2OCT
|
|
*/
|
|
public function testDEC2OCTAsFormula(mixed $expectedResult, mixed ...$args): void
|
|
{
|
|
$arguments = new FormulaArguments(...$args);
|
|
|
|
$calculation = Calculation::getInstance();
|
|
$formula = "=DEC2OCT({$arguments})";
|
|
|
|
$result = $calculation->_calculateFormulaValue($formula);
|
|
self::assertSame($expectedResult, $this->trimIfQuoted((string) $result));
|
|
}
|
|
|
|
/**
|
|
* @dataProvider providerDEC2OCT
|
|
*/
|
|
public function testDEC2OCTInWorksheet(mixed $expectedResult, mixed ...$args): void
|
|
{
|
|
$arguments = new FormulaArguments(...$args);
|
|
|
|
$spreadsheet = new Spreadsheet();
|
|
$worksheet = $spreadsheet->getActiveSheet();
|
|
$argumentCells = $arguments->populateWorksheet($worksheet);
|
|
$formula = "=DEC2OCT({$argumentCells})";
|
|
|
|
$result = $worksheet->setCellValue('A1', $formula)
|
|
->getCell('A1')
|
|
->getCalculatedValue();
|
|
self::assertSame($expectedResult, $result);
|
|
|
|
$spreadsheet->disconnectWorksheets();
|
|
}
|
|
|
|
public static function providerDEC2OCT(): array
|
|
{
|
|
return require 'tests/data/Calculation/Engineering/DEC2OCT.php';
|
|
}
|
|
|
|
/**
|
|
* @dataProvider providerUnhappyDEC2OCT
|
|
*/
|
|
public function testDEC2OCTUnhappyPath(string $expectedException, mixed ...$args): void
|
|
{
|
|
$arguments = new FormulaArguments(...$args);
|
|
|
|
$spreadsheet = new Spreadsheet();
|
|
$worksheet = $spreadsheet->getActiveSheet();
|
|
$argumentCells = $arguments->populateWorksheet($worksheet);
|
|
$formula = "=DEC2OCT({$argumentCells})";
|
|
|
|
$this->expectException(CalculationException::class);
|
|
$this->expectExceptionMessage($expectedException);
|
|
$worksheet->setCellValue('A1', $formula)
|
|
->getCell('A1')
|
|
->getCalculatedValue();
|
|
|
|
$spreadsheet->disconnectWorksheets();
|
|
}
|
|
|
|
public static function providerUnhappyDEC2OCT(): array
|
|
{
|
|
return [
|
|
['Formula Error: Wrong number of arguments for DEC2OCT() function'],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider providerDEC2OCTOds
|
|
*/
|
|
public function testDEC2OCTOds(mixed $expectedResult, mixed ...$args): void
|
|
{
|
|
Functions::setCompatibilityMode(Functions::COMPATIBILITY_OPENOFFICE);
|
|
|
|
/** @scrutinizer ignore-call */
|
|
$result = ConvertDecimal::toOctal(...$args);
|
|
self::assertSame($expectedResult, $result);
|
|
}
|
|
|
|
public static function providerDEC2OCTOds(): array
|
|
{
|
|
return require 'tests/data/Calculation/Engineering/DEC2OCTOpenOffice.php';
|
|
}
|
|
|
|
public function testDEC2OCTFrac(): void
|
|
{
|
|
$calculation = Calculation::getInstance();
|
|
$formula = '=DEC2OCT(17.1)';
|
|
|
|
Functions::setCompatibilityMode(Functions::COMPATIBILITY_GNUMERIC);
|
|
$result = $calculation->_calculateFormulaValue($formula);
|
|
self::assertSame('21', $this->trimIfQuoted((string) $result), 'Gnumeric');
|
|
|
|
Functions::setCompatibilityMode(Functions::COMPATIBILITY_OPENOFFICE);
|
|
$result = $calculation->_calculateFormulaValue($formula);
|
|
self::assertSame('21', $this->trimIfQuoted((string) $result), 'OpenOffice');
|
|
|
|
Functions::setCompatibilityMode(Functions::COMPATIBILITY_EXCEL);
|
|
$result = $calculation->_calculateFormulaValue($formula);
|
|
self::assertSame('21', $this->trimIfQuoted((string) $result), 'Excel');
|
|
}
|
|
|
|
/**
|
|
* @dataProvider providerDec2OctArray
|
|
*/
|
|
public function testDec2OctArray(array $expectedResult, string $value): void
|
|
{
|
|
$calculation = Calculation::getInstance();
|
|
|
|
$formula = "=DEC2OCT({$value})";
|
|
$result = $calculation->_calculateFormulaValue($formula);
|
|
self::assertEquals($expectedResult, $result);
|
|
}
|
|
|
|
public static function providerDec2OctArray(): array
|
|
{
|
|
return [
|
|
'row/column vector' => [
|
|
[['4', '7', '77', '231', '314', '525']],
|
|
'{4, 7, 63, 153, 204, 341}',
|
|
],
|
|
];
|
|
}
|
|
}
|