diff --git a/src/Spout/Writer/AbstractWriter.php b/src/Spout/Writer/AbstractWriter.php index 85b16aa..83e190f 100644 --- a/src/Spout/Writer/AbstractWriter.php +++ b/src/Spout/Writer/AbstractWriter.php @@ -350,6 +350,10 @@ abstract class AbstractWriter implements WriterInterface */ public function close() { + if (!$this->isWriterOpened) { + return; + } + $this->closeWriter(); if (is_resource($this->filePointer)) { @@ -378,4 +382,3 @@ abstract class AbstractWriter implements WriterInterface } } } - diff --git a/tests/Spout/Writer/CSV/WriterTest.php b/tests/Spout/Writer/CSV/WriterTest.php index 1a95012..0b9fdf9 100644 --- a/tests/Spout/Writer/CSV/WriterTest.php +++ b/tests/Spout/Writer/CSV/WriterTest.php @@ -61,6 +61,23 @@ class WriterTest extends \PHPUnit_Framework_TestCase $writer->close(); } + /** + * @return void + */ + public function testCloseShouldNoopWhenWriterIsNotOpened() + { + $fileName = 'test_double_close_calls.csv'; + $this->createGeneratedFolderIfNeeded($fileName); + $resourcePath = $this->getGeneratedResourcePath($fileName); + + $writer = WriterFactory::create(Type::CSV); + $writer->close(); // This call should not cause any error + + $writer->openToFile($fileName); + $writer->close(); + $writer->close(); // This call should not cause any error + } + /** * @return void */ diff --git a/tests/Spout/Writer/ODS/WriterTest.php b/tests/Spout/Writer/ODS/WriterTest.php index 7c4b396..513f617 100644 --- a/tests/Spout/Writer/ODS/WriterTest.php +++ b/tests/Spout/Writer/ODS/WriterTest.php @@ -67,7 +67,7 @@ class WriterTest extends \PHPUnit_Framework_TestCase /** * @expectedException \Box\Spout\Writer\Exception\WriterAlreadyOpenedException */ - public function testsetShouldCreateNewSheetsAutomaticallyShouldThrowExceptionIfCalledAfterOpeningWriter() + public function testSetShouldCreateNewSheetsAutomaticallyShouldThrowExceptionIfCalledAfterOpeningWriter() { $fileName = 'file_that_wont_be_written.ods'; $filePath = $this->getGeneratedResourcePath($fileName); @@ -168,6 +168,23 @@ class WriterTest extends \PHPUnit_Framework_TestCase $this->assertEquals($firstSheet, $writer->getCurrentSheet(), 'The current sheet should be the first one.'); } + /** + * @return void + */ + public function testCloseShouldNoopWhenWriterIsNotOpened() + { + $fileName = 'test_double_close_calls.ods'; + $this->createGeneratedFolderIfNeeded($fileName); + $resourcePath = $this->getGeneratedResourcePath($fileName); + + $writer = WriterFactory::create(Type::ODS); + $writer->close(); // This call should not cause any error + + $writer->openToFile($fileName); + $writer->close(); + $writer->close(); // This call should not cause any error + } + /** * @return void */ diff --git a/tests/Spout/Writer/XLSX/WriterTest.php b/tests/Spout/Writer/XLSX/WriterTest.php index 562db8d..8b9b233 100644 --- a/tests/Spout/Writer/XLSX/WriterTest.php +++ b/tests/Spout/Writer/XLSX/WriterTest.php @@ -194,6 +194,23 @@ class WriterTest extends \PHPUnit_Framework_TestCase $this->assertEquals($firstSheet, $writer->getCurrentSheet(), 'The current sheet should be the first one.'); } + /** + * @return void + */ + public function testCloseShouldNoopWhenWriterIsNotOpened() + { + $fileName = 'test_double_close_calls.xlsx'; + $this->createGeneratedFolderIfNeeded($fileName); + $resourcePath = $this->getGeneratedResourcePath($fileName); + + $writer = WriterFactory::create(Type::XLSX); + $writer->close(); // This call should not cause any error + + $writer->openToFile($fileName); + $writer->close(); + $writer->close(); // This call should not cause any error + } + /** * @return void */