From 1dba2d1766ba23b0bb29852f10ce91ce13f39ad2 Mon Sep 17 00:00:00 2001 From: Paolo Agostinetto Date: Sat, 18 Feb 2017 20:49:48 +0100 Subject: [PATCH] Ods reader: tests for repeated spaces and rich text --- tests/PhpSpreadsheetTests/Reader/OdsTest.php | 96 +++++++++++-------- tests/data/Reader/Ods/data.ods | Bin 9259 -> 11764 bytes 2 files changed, 56 insertions(+), 40 deletions(-) diff --git a/tests/PhpSpreadsheetTests/Reader/OdsTest.php b/tests/PhpSpreadsheetTests/Reader/OdsTest.php index 56a37338..442c2c23 100644 --- a/tests/PhpSpreadsheetTests/Reader/OdsTest.php +++ b/tests/PhpSpreadsheetTests/Reader/OdsTest.php @@ -23,34 +23,48 @@ class OdsTest extends \PHPUnit_Framework_TestCase /** * @var \PhpOffice\PhpSpreadsheet\Spreadsheet */ - public $spreadsheet; + public $spreadsheetOOCalcTest; + + /** + * @var \PhpOffice\PhpSpreadsheet\Spreadsheet + */ + public $spreadsheetData; /** * @return \PhpOffice\PhpSpreadsheet\Spreadsheet */ - protected function loadOOCalcTest(){ + protected function loadOOCalcTestFile(){ - if(!$this->spreadsheet){ + if(!$this->spreadsheetOOCalcTest){ $filename = __DIR__ . '/../../../samples/templates/OOCalcTest.ods'; - // Create new Spreadsheet - $this->spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet(); - // Load into this instance $reader = new Ods(); - $this->spreadsheet = $reader->loadIntoExisting($filename, $this->spreadsheet); + $this->spreadsheetOOCalcTest = $reader->loadIntoExisting($filename, new \PhpOffice\PhpSpreadsheet\Spreadsheet()); } - return $this->spreadsheet; + return $this->spreadsheetOOCalcTest; + } + + /** + * @return \PhpOffice\PhpSpreadsheet\Spreadsheet + */ + protected function loadDataFile(){ + + if(!$this->spreadsheetData){ + $filename = __DIR__ . '/../../data/Reader/Ods/data.ods'; + + // Load into this instance + $reader = new Ods(); + $this->spreadsheetData = $reader->loadIntoExisting($filename, new \PhpOffice\PhpSpreadsheet\Spreadsheet()); + } + + return $this->spreadsheetData; } public function testLoadWorksheets() { - $filename = __DIR__ . '/../../data/Reader/Ods/data.ods'; - - // Load into this instance - $reader = new Ods(); - $spreadsheet = $reader->loadIntoExisting($filename, new \PhpOffice\PhpSpreadsheet\Spreadsheet()); + $spreadsheet = $this->loadDataFile(); $this->assertInstanceOf('PhpOffice\PhpSpreadsheet\Spreadsheet', $spreadsheet); @@ -65,9 +79,7 @@ class OdsTest extends \PHPUnit_Framework_TestCase public function testReadValueAndComments(){ - $spreadsheet = $this->loadOOCalcTest(); - - $this->assertInstanceOf('PhpOffice\PhpSpreadsheet\Spreadsheet', $spreadsheet); + $spreadsheet = $this->loadOOCalcTestFile(); $firstSheet = $spreadsheet->getSheet(0); @@ -115,14 +127,8 @@ class OdsTest extends \PHPUnit_Framework_TestCase * Percentage, Currency */ - $filename = __DIR__ . '/../../data/Reader/Ods/data.ods'; + $spreadsheet = $this->loadDataFile(); - // Create new Spreadsheet - $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet(); - - // Load into this instance - $reader = new Ods(); - $spreadsheet = $reader->loadIntoExisting($filename, $spreadsheet); $firstSheet = $spreadsheet->getSheet(0); $this->assertEquals(DataType::TYPE_NUMERIC, $firstSheet->getCell("A1")->getDataType()); // Percentage (10%) @@ -140,7 +146,7 @@ class OdsTest extends \PHPUnit_Framework_TestCase public function testReadColors() { - $spreadsheet = $this->loadOOCalcTest(); + $spreadsheet = $this->loadOOCalcTestFile(); $firstSheet = $spreadsheet->getSheet(0); // Background color @@ -152,6 +158,30 @@ class OdsTest extends \PHPUnit_Framework_TestCase $this->assertEquals("FF000000", $style->getFill()->getEndColor()->getARGB()); } + public function testReadRichText(){ + + $spreadsheet = $this->loadOOCalcTestFile(); + $firstSheet = $spreadsheet->getSheet(0); + + $this->assertEquals( + "I don't know if OOCalc supports Rich Text in the same way as Excel, " . + "And this row should be autofit height with text wrap", + $firstSheet->getCell("A28")->getValue() + ); + } + + public function testReadCellsWithRepeatedSpaces(){ + + $spreadsheet = $this->loadDataFile(); + $firstSheet = $spreadsheet->getSheet(0); + + $this->assertEquals("This has 4 spaces before and 2 after ", $firstSheet->getCell("A8")->getValue()); + $this->assertEquals("This only one after ", $firstSheet->getCell("A9")->getValue()); + $this->assertEquals("Test with DIFFERENT styles and multiple spaces: ", $firstSheet->getCell("A10")->getValue()); + $this->assertEquals("test with new \nLines", $firstSheet->getCell("A11")->getValue()); + + } + /* * Below some test for features not implemented yet */ @@ -160,7 +190,7 @@ class OdsTest extends \PHPUnit_Framework_TestCase { $this->markTestSkipped("Features not implemented yet"); - $spreadsheet = $this->loadOOCalcTest(); + $spreadsheet = $this->loadOOCalcTestFile(); $firstSheet = $spreadsheet->getSheet(0); // Font styles @@ -178,25 +208,11 @@ class OdsTest extends \PHPUnit_Framework_TestCase $this->assertTrue($style->getFont()->getItalic()); } - public function testReadRichTExt(){ - - $this->markTestSkipped("Features not implemented yet"); - - $spreadsheet = $this->loadOOCalcTest(); - $firstSheet = $spreadsheet->getSheet(0); - - $this->assertEquals( - "I don't know if OOCalc supports Rich Text in the same way as Excel, " . - "And this row should be autofit height with text wrap", - $firstSheet->getCell("A28")->getValue() - ); - } - public function testReadHyperlinks(){ $this->markTestSkipped("Features not implemented fully"); - $spreadsheet = $this->loadOOCalcTest(); + $spreadsheet = $this->loadOOCalcTestFile(); $firstSheet = $spreadsheet->getSheet(0); $hyperlink = $firstSheet->getCell("A29"); diff --git a/tests/data/Reader/Ods/data.ods b/tests/data/Reader/Ods/data.ods index 7abc5c45e6e6864ecb7b5b1585d183174a240df6..5f58d457a42c0a1c5655d6d4b889402425b25a5a 100644 GIT binary patch delta 8135 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 delta 5599 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