16c000204SPatrick Brown<?php 26c000204SPatrick Brown 36c000204SPatrick Brownclass io_replaceinfile_test extends DokuWikiTest { 46c000204SPatrick Brown 59a734b7aSChristopher Smith protected $contents = "The\012Delete\012Delete\012Delete01\012Delete02\012Delete\012DeleteX\012Test\012"; 69a734b7aSChristopher Smith 76c000204SPatrick Brown /* 86c000204SPatrick Brown * dependency for tests needing zlib extension to pass 96c000204SPatrick Brown */ 106c000204SPatrick Brown public function test_ext_zlib() { 11216e727cSAndreas Gohr if (!DOKU_HAS_GZIP) { 126c000204SPatrick Brown $this->markTestSkipped('skipping all zlib tests. Need zlib extension'); 132ba67679SAndreas Gohr return; 146c000204SPatrick Brown } 152ba67679SAndreas Gohr $this->assertTrue(true); 166c000204SPatrick Brown } 176c000204SPatrick Brown 186c000204SPatrick Brown /* 196c000204SPatrick Brown * dependency for tests needing zlib extension to pass 206c000204SPatrick Brown */ 216c000204SPatrick Brown public function test_ext_bz2() { 22216e727cSAndreas Gohr if (!DOKU_HAS_BZIP) { 236c000204SPatrick Brown $this->markTestSkipped('skipping all bzip2 tests. Need bz2 extension'); 242ba67679SAndreas Gohr return; 256c000204SPatrick Brown } 262ba67679SAndreas Gohr $this->assertTrue(true); 276c000204SPatrick Brown } 286c000204SPatrick Brown 296c000204SPatrick Brown function _write($file){ 309a734b7aSChristopher Smith 319a734b7aSChristopher Smith io_saveFile($file, $this->contents); 326c000204SPatrick Brown // Replace one, no regex 336c000204SPatrick Brown $this->assertTrue(io_replaceInFile($file, "Delete\012", "Delete00\012", false, 1)); 346c000204SPatrick Brown $this->assertEquals("The\012Delete00\012Delete\012Delete01\012Delete02\012Delete\012DeleteX\012Test\012", io_readFile($file)); 356c000204SPatrick Brown // Replace all, no regex 366c000204SPatrick Brown $this->assertTrue(io_replaceInFile($file, "Delete\012", "DeleteX\012", false, -1)); 376c000204SPatrick Brown $this->assertEquals("The\012Delete00\012DeleteX\012Delete01\012Delete02\012DeleteX\012DeleteX\012Test\012", io_readFile($file)); 386c000204SPatrick Brown // Replace two, regex and backreference 396c000204SPatrick Brown $this->assertTrue(io_replaceInFile($file, "#Delete(\\d+)\012#", "\\1\012", true, 2)); 406c000204SPatrick Brown $this->assertEquals("The\01200\012DeleteX\01201\012Delete02\012DeleteX\012DeleteX\012Test\012", io_readFile($file)); 416c000204SPatrick Brown // Delete and insert, no regex 426c000204SPatrick Brown $this->assertTrue(io_replaceInFile($file, "DeleteX\012", "Replace\012", false, 0)); 436c000204SPatrick Brown $this->assertEquals("The\01200\01201\012Delete02\012Test\012Replace\012", io_readFile($file)); 446c000204SPatrick Brown } 456c000204SPatrick Brown 466c000204SPatrick Brown function test_replace(){ 476c000204SPatrick Brown $this->_write(TMP_DIR.'/test.txt'); 486c000204SPatrick Brown } 496c000204SPatrick Brown 509a734b7aSChristopher Smith 516c000204SPatrick Brown /** 526c000204SPatrick Brown * @depends test_ext_zlib 536c000204SPatrick Brown */ 546c000204SPatrick Brown function test_gzwrite(){ 556c000204SPatrick Brown $this->_write(TMP_DIR.'/test.txt.gz'); 566c000204SPatrick Brown } 576c000204SPatrick Brown 586c000204SPatrick Brown /** 596c000204SPatrick Brown * @depends test_ext_bz2 606c000204SPatrick Brown */ 616c000204SPatrick Brown function test_bzwrite(){ 626c000204SPatrick Brown $this->_write(TMP_DIR.'/test.txt.bz2'); 636c000204SPatrick Brown } 646c000204SPatrick Brown 659a734b7aSChristopher Smith /** 66e12c5ac7SChristopher Smith * Test for a non-regex replacement where $newline contains a backreference like construct - it shouldn't affect the replacement 679a734b7aSChristopher Smith */ 689a734b7aSChristopher Smith function test_edgecase1() 699a734b7aSChristopher Smith { 709a734b7aSChristopher Smith $file = TMP_DIR . '/test.txt'; 71e12c5ac7SChristopher Smith 729a734b7aSChristopher Smith io_saveFile($file, $this->contents); 739a734b7aSChristopher Smith $this->assertTrue(io_replaceInFile($file, "Delete\012", "Delete\\00\012", false, -1)); 749a734b7aSChristopher Smith $this->assertEquals("The\012Delete\\00\012Delete\\00\012Delete01\012Delete02\012Delete\\00\012DeleteX\012Test\012", io_readFile($file), "Edge case: backreference like construct in replacement line"); 759a734b7aSChristopher Smith } 769a734b7aSChristopher Smith /** 77e12c5ac7SChristopher Smith * Test with replace all where replacement line == search line - must not timeout 78e12c5ac7SChristopher Smith * 799a734b7aSChristopher Smith * @small 809a734b7aSChristopher Smith */ 819a734b7aSChristopher Smith function test_edgecase2() { 829a734b7aSChristopher Smith $file = TMP_DIR.'/test.txt'; 83e12c5ac7SChristopher Smith 849a734b7aSChristopher Smith io_saveFile($file, $this->contents); 859a734b7aSChristopher Smith $this->assertTrue(io_replaceInFile($file, "Delete\012", "Delete\012", false, -1)); 869a734b7aSChristopher Smith $this->assertEquals("The\012Delete\012Delete\012Delete01\012Delete02\012Delete\012DeleteX\012Test\012", io_readFile($file), "Edge case: new line the same as old line"); 879a734b7aSChristopher Smith } 883dfe7d64SChristopher Smith 893dfe7d64SChristopher Smith /** 90e12c5ac7SChristopher Smith * Test where $oldline exactly matches one line and also matches part of other lines - only the exact match should be replaced 913dfe7d64SChristopher Smith */ 923dfe7d64SChristopher Smith function test_edgecase3() 933dfe7d64SChristopher Smith { 943dfe7d64SChristopher Smith $file = TMP_DIR . '/test.txt'; 953dfe7d64SChristopher Smith $contents = "The\012Delete\01201Delete\01202Delete\012Test\012"; 96e12c5ac7SChristopher Smith 973dfe7d64SChristopher Smith io_saveFile($file, $contents); 983dfe7d64SChristopher Smith $this->assertTrue(io_replaceInFile($file, "Delete\012", "Replace\012", false, -1)); 993dfe7d64SChristopher Smith $this->assertEquals("The\012Replace\01201Delete\01202Delete\012Test\012", io_readFile($file), "Edge case: old line is a match for parts of other lines"); 1003dfe7d64SChristopher Smith } 101dc4a4eb0SPatrick Brown 102dc4a4eb0SPatrick Brown /** 103dc4a4eb0SPatrick Brown * Test passing an invalid parameter. 104dc4a4eb0SPatrick Brown */ 105dc4a4eb0SPatrick Brown function test_badparam() 106dc4a4eb0SPatrick Brown { 107*109ebc86SAndreas Gohr $this->expectLogMessage('io_replaceInFile() $oldline parameter cannot be empty'); 10873b977aaSMichael Grosse 109dc4a4eb0SPatrick Brown /* The empty $oldline parameter should be caught before the file doesn't exist test. */ 110dc4a4eb0SPatrick Brown $this->assertFalse(io_replaceInFile(TMP_DIR.'/not_existing_file.txt', '', '', false, 0)); 111dc4a4eb0SPatrick Brown } 1126c000204SPatrick Brown} 113