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() { 116c000204SPatrick Brown if (!extension_loaded('zlib')) { 126c000204SPatrick Brown $this->markTestSkipped('skipping all zlib tests. Need zlib extension'); 136c000204SPatrick Brown } 146c000204SPatrick Brown } 156c000204SPatrick Brown 166c000204SPatrick Brown /* 176c000204SPatrick Brown * dependency for tests needing zlib extension to pass 186c000204SPatrick Brown */ 196c000204SPatrick Brown public function test_ext_bz2() { 206c000204SPatrick Brown if (!extension_loaded('bz2')) { 216c000204SPatrick Brown $this->markTestSkipped('skipping all bzip2 tests. Need bz2 extension'); 226c000204SPatrick Brown } 236c000204SPatrick Brown } 246c000204SPatrick Brown 256c000204SPatrick Brown function _write($file){ 269a734b7aSChristopher Smith 279a734b7aSChristopher Smith io_saveFile($file, $this->contents); 286c000204SPatrick Brown // Replace one, no regex 296c000204SPatrick Brown $this->assertTrue(io_replaceInFile($file, "Delete\012", "Delete00\012", false, 1)); 306c000204SPatrick Brown $this->assertEquals("The\012Delete00\012Delete\012Delete01\012Delete02\012Delete\012DeleteX\012Test\012", io_readFile($file)); 316c000204SPatrick Brown // Replace all, no regex 326c000204SPatrick Brown $this->assertTrue(io_replaceInFile($file, "Delete\012", "DeleteX\012", false, -1)); 336c000204SPatrick Brown $this->assertEquals("The\012Delete00\012DeleteX\012Delete01\012Delete02\012DeleteX\012DeleteX\012Test\012", io_readFile($file)); 346c000204SPatrick Brown // Replace two, regex and backreference 356c000204SPatrick Brown $this->assertTrue(io_replaceInFile($file, "#Delete(\\d+)\012#", "\\1\012", true, 2)); 366c000204SPatrick Brown $this->assertEquals("The\01200\012DeleteX\01201\012Delete02\012DeleteX\012DeleteX\012Test\012", io_readFile($file)); 376c000204SPatrick Brown // Delete and insert, no regex 386c000204SPatrick Brown $this->assertTrue(io_replaceInFile($file, "DeleteX\012", "Replace\012", false, 0)); 396c000204SPatrick Brown $this->assertEquals("The\01200\01201\012Delete02\012Test\012Replace\012", io_readFile($file)); 406c000204SPatrick Brown } 416c000204SPatrick Brown 426c000204SPatrick Brown function test_replace(){ 436c000204SPatrick Brown $this->_write(TMP_DIR.'/test.txt'); 446c000204SPatrick Brown } 456c000204SPatrick Brown 469a734b7aSChristopher Smith 476c000204SPatrick Brown /** 486c000204SPatrick Brown * @depends test_ext_zlib 496c000204SPatrick Brown */ 506c000204SPatrick Brown function test_gzwrite(){ 516c000204SPatrick Brown $this->_write(TMP_DIR.'/test.txt.gz'); 526c000204SPatrick Brown } 536c000204SPatrick Brown 546c000204SPatrick Brown /** 556c000204SPatrick Brown * @depends test_ext_bz2 566c000204SPatrick Brown */ 576c000204SPatrick Brown function test_bzwrite(){ 586c000204SPatrick Brown $this->_write(TMP_DIR.'/test.txt.bz2'); 596c000204SPatrick Brown } 606c000204SPatrick Brown 619a734b7aSChristopher Smith /** 62*e12c5ac7SChristopher Smith * Test for a non-regex replacement where $newline contains a backreference like construct - it shouldn't affect the replacement 639a734b7aSChristopher Smith */ 649a734b7aSChristopher Smith function test_edgecase1() 659a734b7aSChristopher Smith { 669a734b7aSChristopher Smith $file = TMP_DIR . '/test.txt'; 67*e12c5ac7SChristopher Smith 689a734b7aSChristopher Smith io_saveFile($file, $this->contents); 699a734b7aSChristopher Smith $this->assertTrue(io_replaceInFile($file, "Delete\012", "Delete\\00\012", false, -1)); 709a734b7aSChristopher 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"); 719a734b7aSChristopher Smith } 729a734b7aSChristopher Smith /** 73*e12c5ac7SChristopher Smith * Test with replace all where replacement line == search line - must not timeout 74*e12c5ac7SChristopher Smith * 759a734b7aSChristopher Smith * @small 769a734b7aSChristopher Smith */ 779a734b7aSChristopher Smith function test_edgecase2() { 789a734b7aSChristopher Smith $file = TMP_DIR.'/test.txt'; 79*e12c5ac7SChristopher Smith 809a734b7aSChristopher Smith io_saveFile($file, $this->contents); 819a734b7aSChristopher Smith $this->assertTrue(io_replaceInFile($file, "Delete\012", "Delete\012", false, -1)); 829a734b7aSChristopher Smith $this->assertEquals("The\012Delete\012Delete\012Delete01\012Delete02\012Delete\012DeleteX\012Test\012", io_readFile($file), "Edge case: new line the same as old line"); 839a734b7aSChristopher Smith } 843dfe7d64SChristopher Smith 853dfe7d64SChristopher Smith /** 86*e12c5ac7SChristopher Smith * Test where $oldline exactly matches one line and also matches part of other lines - only the exact match should be replaced 873dfe7d64SChristopher Smith */ 883dfe7d64SChristopher Smith function test_edgecase3() 893dfe7d64SChristopher Smith { 903dfe7d64SChristopher Smith $file = TMP_DIR . '/test.txt'; 913dfe7d64SChristopher Smith $contents = "The\012Delete\01201Delete\01202Delete\012Test\012"; 92*e12c5ac7SChristopher Smith 933dfe7d64SChristopher Smith io_saveFile($file, $contents); 943dfe7d64SChristopher Smith $this->assertTrue(io_replaceInFile($file, "Delete\012", "Replace\012", false, -1)); 953dfe7d64SChristopher Smith $this->assertEquals("The\012Replace\01201Delete\01202Delete\012Test\012", io_readFile($file), "Edge case: old line is a match for parts of other lines"); 963dfe7d64SChristopher Smith } 976c000204SPatrick Brown} 98