radarrplexorganizrnginxsonarrdashboardserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboardmuximuxlandingpagestartpagelandinghtpc
		
		
		
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							201 lines
						
					
					
						
							5.5 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							201 lines
						
					
					
						
							5.5 KiB
						
					
					
				| <?php declare(strict_types=1); | |
| /* | |
|  * This file is part of sebastian/diff. | |
|  * | |
|  * (c) Sebastian Bergmann <sebastian@phpunit.de> | |
|  * | |
|  * For the full copyright and license information, please view the LICENSE | |
|  * file that was distributed with this source code. | |
|  */ | |
| 
 | |
| namespace SebastianBergmann\Diff; | |
| 
 | |
| use PHPUnit\Framework\TestCase; | |
| 
 | |
| /** | |
|  * @coversNothing | |
|  */ | |
| abstract class LongestCommonSubsequenceTest extends TestCase | |
| { | |
|     /** | |
|      * @var LongestCommonSubsequenceCalculator | |
|      */ | |
|     private $implementation; | |
| 
 | |
|     /** | |
|      * @var string | |
|      */ | |
|     private $memoryLimit; | |
| 
 | |
|     /** | |
|      * @var int[] | |
|      */ | |
|     private $stress_sizes = [1, 2, 3, 100, 500, 1000, 2000]; | |
| 
 | |
|     protected function setUp() | |
|     { | |
|         $this->memoryLimit = \ini_get('memory_limit'); | |
|         \ini_set('memory_limit', '256M'); | |
| 
 | |
|         $this->implementation = $this->createImplementation(); | |
|     } | |
| 
 | |
|     /** | |
|      * @return LongestCommonSubsequenceCalculator | |
|      */ | |
|     abstract protected function createImplementation(); | |
| 
 | |
|     protected function tearDown() | |
|     { | |
|         \ini_set('memory_limit', $this->memoryLimit); | |
|     } | |
| 
 | |
|     public function testBothEmpty() | |
|     { | |
|         $from   = []; | |
|         $to     = []; | |
|         $common = $this->implementation->calculate($from, $to); | |
| 
 | |
|         $this->assertSame([], $common); | |
|     } | |
| 
 | |
|     public function testIsStrictComparison() | |
|     { | |
|         $from = [ | |
|             false, 0, 0.0, '', null, [], | |
|             true, 1, 1.0, 'foo', ['foo', 'bar'], ['foo' => 'bar'] | |
|         ]; | |
|         $to     = $from; | |
|         $common = $this->implementation->calculate($from, $to); | |
| 
 | |
|         $this->assertSame($from, $common); | |
| 
 | |
|         $to = [ | |
|             false, false, false, false, false, false, | |
|             true, true, true, true, true, true | |
|         ]; | |
| 
 | |
|         $expected = [ | |
|             false, | |
|             true, | |
|         ]; | |
| 
 | |
|         $common = $this->implementation->calculate($from, $to); | |
| 
 | |
|         $this->assertSame($expected, $common); | |
|     } | |
| 
 | |
|     public function testEqualSequences() | |
|     { | |
|         foreach ($this->stress_sizes as $size) { | |
|             $range  = \range(1, $size); | |
|             $from   = $range; | |
|             $to     = $range; | |
|             $common = $this->implementation->calculate($from, $to); | |
| 
 | |
|             $this->assertSame($range, $common); | |
|         } | |
|     } | |
| 
 | |
|     public function testDistinctSequences() | |
|     { | |
|         $from   = ['A']; | |
|         $to     = ['B']; | |
|         $common = $this->implementation->calculate($from, $to); | |
|         $this->assertSame([], $common); | |
| 
 | |
|         $from   = ['A', 'B', 'C']; | |
|         $to     = ['D', 'E', 'F']; | |
|         $common = $this->implementation->calculate($from, $to); | |
|         $this->assertSame([], $common); | |
| 
 | |
|         foreach ($this->stress_sizes as $size) { | |
|             $from   = \range(1, $size); | |
|             $to     = \range($size + 1, $size * 2); | |
|             $common = $this->implementation->calculate($from, $to); | |
|             $this->assertSame([], $common); | |
|         } | |
|     } | |
| 
 | |
|     public function testCommonSubsequence() | |
|     { | |
|         $from     = ['A',      'C',      'E', 'F', 'G']; | |
|         $to       = ['A', 'B',      'D', 'E',           'H']; | |
|         $expected = ['A',                'E']; | |
|         $common   = $this->implementation->calculate($from, $to); | |
|         $this->assertSame($expected, $common); | |
| 
 | |
|         $from     = ['A',      'C',      'E', 'F', 'G']; | |
|         $to       = ['B', 'C', 'D', 'E', 'F',      'H']; | |
|         $expected = ['C',                'E', 'F']; | |
|         $common   = $this->implementation->calculate($from, $to); | |
|         $this->assertSame($expected, $common); | |
| 
 | |
|         foreach ($this->stress_sizes as $size) { | |
|             $from     = $size < 2 ? [1] : \range(1, $size + 1, 2); | |
|             $to       = $size < 3 ? [1] : \range(1, $size + 1, 3); | |
|             $expected = $size < 6 ? [1] : \range(1, $size + 1, 6); | |
|             $common   = $this->implementation->calculate($from, $to); | |
| 
 | |
|             $this->assertSame($expected, $common); | |
|         } | |
|     } | |
| 
 | |
|     public function testSingleElementSubsequenceAtStart() | |
|     { | |
|         foreach ($this->stress_sizes as $size) { | |
|             $from   = \range(1, $size); | |
|             $to     = \array_slice($from, 0, 1); | |
|             $common = $this->implementation->calculate($from, $to); | |
| 
 | |
|             $this->assertSame($to, $common); | |
|         } | |
|     } | |
| 
 | |
|     public function testSingleElementSubsequenceAtMiddle() | |
|     { | |
|         foreach ($this->stress_sizes as $size) { | |
|             $from   = \range(1, $size); | |
|             $to     = \array_slice($from, (int) ($size / 2), 1); | |
|             $common = $this->implementation->calculate($from, $to); | |
| 
 | |
|             $this->assertSame($to, $common); | |
|         } | |
|     } | |
| 
 | |
|     public function testSingleElementSubsequenceAtEnd() | |
|     { | |
|         foreach ($this->stress_sizes as $size) { | |
|             $from   = \range(1, $size); | |
|             $to     = \array_slice($from, $size - 1, 1); | |
|             $common = $this->implementation->calculate($from, $to); | |
| 
 | |
|             $this->assertSame($to, $common); | |
|         } | |
|     } | |
| 
 | |
|     public function testReversedSequences() | |
|     { | |
|         $from     = ['A', 'B']; | |
|         $to       = ['B', 'A']; | |
|         $expected = ['A']; | |
|         $common   = $this->implementation->calculate($from, $to); | |
|         $this->assertSame($expected, $common); | |
| 
 | |
|         foreach ($this->stress_sizes as $size) { | |
|             $from   = \range(1, $size); | |
|             $to     = \array_reverse($from); | |
|             $common = $this->implementation->calculate($from, $to); | |
| 
 | |
|             $this->assertSame([1], $common); | |
|         } | |
|     } | |
| 
 | |
|     public function testStrictTypeCalculate() | |
|     { | |
|         $diff = $this->implementation->calculate(['5'], ['05']); | |
| 
 | |
|         $this->assertInternalType('array', $diff); | |
|         $this->assertCount(0, $diff); | |
|     } | |
| }
 | |
| 
 |