mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-08-30 12:07:56 +00:00
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:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user