Assert round-tripped values rather than Ods xml

Rewrite the test to write the spreadsheet, read it back and check
getValue() and getCalculatedValue(), following DurationTest, instead of
matching against the generated content.xml.
This commit is contained in:
saifulislamferoz
2026-08-15 15:28:08 +06:00
parent d3ae79dfaf
commit 416cc52a94
@@ -5,93 +5,52 @@ declare(strict_types=1);
namespace PhpOffice\PhpSpreadsheetTests\Writer\Ods;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Ods as OdsWriter;
use PHPUnit\Framework\TestCase;
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
class Issue4454Test extends TestCase
class Issue4454Test extends AbstractFunctional
{
/**
* Text inside a string literal must be left alone, while everything
* outside of it is still converted.
* Cell references and commas inside string literals must survive a round trip,
* while everything outside of them is still converted for Ods.
*/
public function testCellReferencesInStringsAreNotConverted(): void
public function testStringLiteralsAreNotConverted(): void
{
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Worksheet');
$sheet->setCellValue('E1', '="THIS IS E1"');
$sheet->setCellValue('E2', '=G1');
$sheet->setCellValue('E3', '=G1&"see E1 here"');
$sheet->getCell('A1')->setValue(1);
$sheet->getCell('B2')->setValue('world');
$sheet->getCell('G1')->setValue('hello ');
$writer = new OdsWriter($spreadsheet);
$data = (new OdsWriter\Content($writer))->write();
self::assertStringContainsString('of:="THIS IS E1"', $data);
self::assertStringContainsString('of:=[.G1]', $data);
self::assertStringContainsString('of:=[.G1]&"see E1 here"', $data);
// Text that looks like a cell reference.
$sheet->getCell('E1')->setValue('="THIS IS E1"');
// The same, next to a reference that does need converting.
$sheet->getCell('E2')->setValue('=G1&"see E1 here"');
// A comma inside a string, which Ods separators must not touch.
$sheet->getCell('E3')->setValue('=IF(A1>1,"yes, really","no")');
// A doubled quote escapes a quote, so the reference stays inside the string.
$sheet->getCell('E4')->setValue('=CONCAT("a""b E1",B2)');
// A range, which a string literal can never interrupt.
$sheet->getCell('E5')->setValue('=SUM(A1:A3)');
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Ods');
$spreadsheet->disconnectWorksheets();
}
$rsheet = $reloadedSpreadsheet->getActiveSheet();
/**
* The comma to semicolon replacement for Ods must not reach into strings either.
*/
public function testCommasInStringsAreNotConverted(): void
{
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Worksheet');
$sheet->setCellValue('A1', 1);
$sheet->setCellValue('B1', '=IF(A1>1,"yes, really","no")');
self::assertSame('="THIS IS E1"', $rsheet->getCell('E1')->getValue());
self::assertSame('THIS IS E1', $rsheet->getCell('E1')->getCalculatedValue());
$writer = new OdsWriter($spreadsheet);
$data = (new OdsWriter\Content($writer))->write();
self::assertSame('=G1&"see E1 here"', $rsheet->getCell('E2')->getValue());
self::assertSame('hello see E1 here', $rsheet->getCell('E2')->getCalculatedValue());
self::assertStringContainsString(
'of:=IF([.A1]>1;"yes, really";"no")',
$data
);
self::assertSame('=IF(A1>1,"yes, really","no")', $rsheet->getCell('E3')->getValue());
self::assertSame('no', $rsheet->getCell('E3')->getCalculatedValue());
$spreadsheet->disconnectWorksheets();
}
self::assertSame('=CONCAT("a""b E1",B2)', $rsheet->getCell('E4')->getValue());
self::assertSame('a"b E1world', $rsheet->getCell('E4')->getCalculatedValue());
/**
* A doubled quote escapes a quote inside a string literal, so the reference
* in the middle of this one is still part of the string.
*/
public function testEscapedQuotesInStringsAreHandled(): void
{
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Worksheet');
$sheet->setCellValue('A1', '=CONCAT("a""b E1",B2)');
self::assertSame('=SUM(A1:A3)', $rsheet->getCell('E5')->getValue());
self::assertSame(1, $rsheet->getCell('E5')->getCalculatedValue());
$writer = new OdsWriter($spreadsheet);
$data = (new OdsWriter\Content($writer))->write();
self::assertStringContainsString(
'of:=CONCAT("a""b E1";[.B2])',
$data
);
$spreadsheet->disconnectWorksheets();
}
/**
* Ranges are unaffected: a string literal can never interrupt one.
*/
public function testRangesAreStillConverted(): void
{
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Worksheet');
$sheet->setCellValue('A1', '=SUM(B1:B5)');
$writer = new OdsWriter($spreadsheet);
$data = (new OdsWriter\Content($writer))->write();
self::assertStringContainsString('of:=SUM([.B1:.B5])', $data);
$spreadsheet->disconnectWorksheets();
$reloadedSpreadsheet->disconnectWorksheets();
}
}