mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-08-24 23:18:17 +00:00
ffdae8efac
* Update Some Doc Block Annotations See PR #2010. That PR was never completed, and has gone stale. However, it was correct in identifying a situation where the doc block was not entirely accurate. It did not go far enough - several closely-related methods have similar problems. This PR attempts to fix the original problem and its close relations. Aside from the doc block changes, there are very minor changes to executable code. It also changes some of the unit tests targeted at the methods in question to eliminate mocking in favor of 'real' tests. * Change Method to Static Otherwise Scrutinizer will complain, even though Phpstan doesn't. * Scrutinizer Various clean-up activities. * Scrutinizer @#&$(*#&$ Got complexity down from 53 to (I think) 50. Don't really know what the target is. * Code Changes Suggested By Review Some improvements suggested in review by @PowerKiKi. * Update Cells.php * Merge Conflict A change to a parameter name caused several problems when trying to fix it on Github. Fixing it locally should do the trick. * Merge Conflicts in Phpstan Baseline PR #2382 made a large number of changes to Phpstan Baseline, some of which conflicted with the Phpstan Baseline changes in this PR. This should resolve them all.
283 lines
9.7 KiB
PHP
283 lines
9.7 KiB
PHP
<?php
|
|
|
|
namespace PhpOffice\PhpSpreadsheetTests\Cell;
|
|
|
|
use DateTime;
|
|
use DateTimeZone;
|
|
use PhpOffice\PhpSpreadsheet\Cell\Cell;
|
|
use PhpOffice\PhpSpreadsheet\Cell\DataType;
|
|
use PhpOffice\PhpSpreadsheet\Cell\IValueBinder;
|
|
use PhpOffice\PhpSpreadsheet\Cell\StringValueBinder;
|
|
use PhpOffice\PhpSpreadsheet\RichText\RichText;
|
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
class StringValueBinderTest extends TestCase
|
|
{
|
|
/**
|
|
* @var IValueBinder
|
|
*/
|
|
private $valueBinder;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
$this->valueBinder = Cell::getValueBinder();
|
|
}
|
|
|
|
protected function tearDown(): void
|
|
{
|
|
Cell::setValueBinder($this->valueBinder);
|
|
}
|
|
|
|
/**
|
|
* @dataProvider providerDataValuesDefault
|
|
*
|
|
* @param mixed $value
|
|
* @param mixed $expectedValue
|
|
*/
|
|
public function testStringValueBinderDefaultBehaviour(
|
|
$value,
|
|
$expectedValue,
|
|
string $expectedDataType
|
|
): void {
|
|
Cell::setValueBinder(new StringValueBinder());
|
|
$spreadsheet = new Spreadsheet();
|
|
$sheet = $spreadsheet->getActiveSheet();
|
|
$cell = $sheet->getCell('A1');
|
|
$cell->setValue($value);
|
|
self::assertSame($expectedValue, $cell->getValue());
|
|
self::assertSame($expectedDataType, $cell->getDataType());
|
|
$spreadsheet->disconnectWorksheets();
|
|
}
|
|
|
|
public function providerDataValuesDefault(): array
|
|
{
|
|
return [
|
|
[null, '', DataType::TYPE_STRING],
|
|
[true, '1', DataType::TYPE_STRING],
|
|
[false, '', DataType::TYPE_STRING],
|
|
['', '', DataType::TYPE_STRING],
|
|
['123', '123', DataType::TYPE_STRING],
|
|
['123.456', '123.456', DataType::TYPE_STRING],
|
|
['0.123', '0.123', DataType::TYPE_STRING],
|
|
['.123', '.123', DataType::TYPE_STRING],
|
|
['-0.123', '-0.123', DataType::TYPE_STRING],
|
|
['-.123', '-.123', DataType::TYPE_STRING],
|
|
['1.23e-4', '1.23e-4', DataType::TYPE_STRING],
|
|
['ABC', 'ABC', DataType::TYPE_STRING],
|
|
['=SUM(A1:C3)', '=SUM(A1:C3)', DataType::TYPE_STRING],
|
|
[123, '123', DataType::TYPE_STRING],
|
|
[123.456, '123.456', DataType::TYPE_STRING],
|
|
[0.123, '0.123', DataType::TYPE_STRING],
|
|
[.123, '0.123', DataType::TYPE_STRING],
|
|
[-0.123, '-0.123', DataType::TYPE_STRING],
|
|
[-.123, '-0.123', DataType::TYPE_STRING],
|
|
[1.23e-4, '0.000123', DataType::TYPE_STRING],
|
|
[1.23e-24, '1.23E-24', DataType::TYPE_STRING],
|
|
[new DateTime('2021-06-01 00:00:00', new DateTimeZone('UTC')), '2021-06-01 00:00:00', DataType::TYPE_STRING],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider providerDataValuesSuppressNullConversion
|
|
*
|
|
* @param mixed $value
|
|
* @param mixed $expectedValue
|
|
*/
|
|
public function testStringValueBinderSuppressNullConversion(
|
|
$value,
|
|
$expectedValue,
|
|
string $expectedDataType
|
|
): void {
|
|
$binder = new StringValueBinder();
|
|
$binder->setNullConversion(false);
|
|
Cell::setValueBinder($binder);
|
|
$spreadsheet = new Spreadsheet();
|
|
$sheet = $spreadsheet->getActiveSheet();
|
|
$cell = $sheet->getCell('A1');
|
|
$cell->setValue($value);
|
|
self::assertSame($expectedValue, $cell->getValue());
|
|
self::assertSame($expectedDataType, $cell->getDataType());
|
|
$spreadsheet->disconnectWorksheets();
|
|
}
|
|
|
|
public function providerDataValuesSuppressNullConversion(): array
|
|
{
|
|
return [
|
|
[null, null, DataType::TYPE_NULL],
|
|
[true, '1', DataType::TYPE_STRING],
|
|
[123, '123', DataType::TYPE_STRING],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider providerDataValuesSuppressBooleanConversion
|
|
*
|
|
* @param mixed $value
|
|
* @param mixed $expectedValue
|
|
*/
|
|
public function testStringValueBinderSuppressBooleanConversion(
|
|
$value,
|
|
$expectedValue,
|
|
string $expectedDataType
|
|
): void {
|
|
$binder = new StringValueBinder();
|
|
$binder->setBooleanConversion(false);
|
|
Cell::setValueBinder($binder);
|
|
$spreadsheet = new Spreadsheet();
|
|
$sheet = $spreadsheet->getActiveSheet();
|
|
$cell = $sheet->getCell('A1');
|
|
$cell->setValue($value);
|
|
self::assertSame($expectedValue, $cell->getValue());
|
|
self::assertSame($expectedDataType, $cell->getDataType());
|
|
$spreadsheet->disconnectWorksheets();
|
|
}
|
|
|
|
public function providerDataValuesSuppressBooleanConversion(): array
|
|
{
|
|
return [
|
|
[true, true, DataType::TYPE_BOOL],
|
|
[false, false, DataType::TYPE_BOOL],
|
|
[null, '', DataType::TYPE_STRING],
|
|
[123, '123', DataType::TYPE_STRING],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider providerDataValuesSuppressNumericConversion
|
|
*
|
|
* @param mixed $value
|
|
* @param mixed $expectedValue
|
|
*/
|
|
public function testStringValueBinderSuppressNumericConversion(
|
|
$value,
|
|
$expectedValue,
|
|
string $expectedDataType
|
|
): void {
|
|
$binder = new StringValueBinder();
|
|
$binder->setNumericConversion(false);
|
|
Cell::setValueBinder($binder);
|
|
$spreadsheet = new Spreadsheet();
|
|
$sheet = $spreadsheet->getActiveSheet();
|
|
$cell = $sheet->getCell('A1');
|
|
$cell->setValue($value);
|
|
self::assertSame($expectedValue, $cell->getValue());
|
|
self::assertSame($expectedDataType, $cell->getDataType());
|
|
$spreadsheet->disconnectWorksheets();
|
|
}
|
|
|
|
public function providerDataValuesSuppressNumericConversion(): array
|
|
{
|
|
return [
|
|
[123, 123, DataType::TYPE_NUMERIC],
|
|
[123.456, 123.456, DataType::TYPE_NUMERIC],
|
|
[0.123, 0.123, DataType::TYPE_NUMERIC],
|
|
[.123, 0.123, DataType::TYPE_NUMERIC],
|
|
[-0.123, -0.123, DataType::TYPE_NUMERIC],
|
|
[-.123, -0.123, DataType::TYPE_NUMERIC],
|
|
[1.23e-4, 0.000123, DataType::TYPE_NUMERIC],
|
|
[1.23e-24, 1.23E-24, DataType::TYPE_NUMERIC],
|
|
[true, '1', DataType::TYPE_STRING],
|
|
[false, '', DataType::TYPE_STRING],
|
|
[null, '', DataType::TYPE_STRING],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider providerDataValuesSuppressFormulaConversion
|
|
*
|
|
* @param mixed $value
|
|
* @param mixed $expectedValue
|
|
*/
|
|
public function testStringValueBinderSuppressFormulaConversion(
|
|
$value,
|
|
$expectedValue,
|
|
string $expectedDataType
|
|
): void {
|
|
$binder = new StringValueBinder();
|
|
$binder->setFormulaConversion(false);
|
|
Cell::setValueBinder($binder);
|
|
$spreadsheet = new Spreadsheet();
|
|
$sheet = $spreadsheet->getActiveSheet();
|
|
$cell = $sheet->getCell('A1');
|
|
$cell->setValue($value);
|
|
self::assertSame($expectedValue, $cell->getValue());
|
|
self::assertSame($expectedDataType, $cell->getDataType());
|
|
$spreadsheet->disconnectWorksheets();
|
|
}
|
|
|
|
public function providerDataValuesSuppressFormulaConversion(): array
|
|
{
|
|
return [
|
|
['=SUM(A1:C3)', '=SUM(A1:C3)', DataType::TYPE_FORMULA, false],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider providerDataValuesSuppressAllConversion
|
|
*
|
|
* @param mixed $value
|
|
* @param mixed $expectedValue
|
|
*/
|
|
public function testStringValueBinderSuppressAllConversion(
|
|
$value,
|
|
$expectedValue,
|
|
string $expectedDataType
|
|
): void {
|
|
$binder = new StringValueBinder();
|
|
$binder->setConversionForAllValueTypes(false);
|
|
Cell::setValueBinder($binder);
|
|
$spreadsheet = new Spreadsheet();
|
|
$sheet = $spreadsheet->getActiveSheet();
|
|
$cell = $sheet->getCell('A1');
|
|
$cell->setValue($value);
|
|
self::assertSame($expectedValue, $cell->getValue());
|
|
self::assertSame($expectedDataType, $cell->getDataType());
|
|
$spreadsheet->disconnectWorksheets();
|
|
}
|
|
|
|
public function providerDataValuesSuppressAllConversion(): array
|
|
{
|
|
return [
|
|
[null, null, DataType::TYPE_NULL],
|
|
[true, true, DataType::TYPE_BOOL],
|
|
[false, false, DataType::TYPE_BOOL],
|
|
['', '', DataType::TYPE_STRING],
|
|
['123', '123', DataType::TYPE_STRING],
|
|
['123.456', '123.456', DataType::TYPE_STRING],
|
|
['0.123', '0.123', DataType::TYPE_STRING],
|
|
['.123', '.123', DataType::TYPE_STRING],
|
|
['-0.123', '-0.123', DataType::TYPE_STRING],
|
|
['-.123', '-.123', DataType::TYPE_STRING],
|
|
['1.23e-4', '1.23e-4', DataType::TYPE_STRING],
|
|
['ABC', 'ABC', DataType::TYPE_STRING],
|
|
['=SUM(A1:C3)', '=SUM(A1:C3)', DataType::TYPE_FORMULA, false],
|
|
[123, 123, DataType::TYPE_NUMERIC],
|
|
[123.456, 123.456, DataType::TYPE_NUMERIC],
|
|
[0.123, 0.123, DataType::TYPE_NUMERIC],
|
|
[.123, 0.123, DataType::TYPE_NUMERIC],
|
|
[-0.123, -0.123, DataType::TYPE_NUMERIC],
|
|
[-.123, -0.123, DataType::TYPE_NUMERIC],
|
|
[1.23e-4, 0.000123, DataType::TYPE_NUMERIC],
|
|
[1.23e-24, 1.23E-24, DataType::TYPE_NUMERIC],
|
|
];
|
|
}
|
|
|
|
public function testStringValueBinderForRichTextObject(): void
|
|
{
|
|
$objRichText = new RichText();
|
|
$objRichText->createText('Hello World');
|
|
|
|
$binder = new StringValueBinder();
|
|
$binder->setConversionForAllValueTypes(false);
|
|
Cell::setValueBinder($binder);
|
|
$spreadsheet = new Spreadsheet();
|
|
$sheet = $spreadsheet->getActiveSheet();
|
|
$cell = $sheet->getCell('A1');
|
|
$cell->setValue($objRichText);
|
|
self::assertSame('inlineStr', $cell->getDataType());
|
|
self::assertSame('Hello World', $cell->getCalculatedValue());
|
|
$spreadsheet->disconnectWorksheets();
|
|
}
|
|
}
|