69 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php declare(strict_types=1);
 | |
| 
 | |
| namespace PhpParser;
 | |
| 
 | |
| class CodeTestParser
 | |
| {
 | |
|     public function parseTest($code, $chunksPerTest) {
 | |
|         $code = canonicalize($code);
 | |
| 
 | |
|         // evaluate @@{expr}@@ expressions
 | |
|         $code = preg_replace_callback(
 | |
|             '/@@\{(.*?)\}@@/',
 | |
|             function($matches) {
 | |
|                 return eval('return ' . $matches[1] . ';');
 | |
|             },
 | |
|             $code
 | |
|         );
 | |
| 
 | |
|         // parse sections
 | |
|         $parts = preg_split("/\n-----(?:\n|$)/", $code);
 | |
| 
 | |
|         // first part is the name
 | |
|         $name = array_shift($parts);
 | |
| 
 | |
|         // multiple sections possible with always two forming a pair
 | |
|         $chunks = array_chunk($parts, $chunksPerTest);
 | |
|         $tests = [];
 | |
|         foreach ($chunks as $i => $chunk) {
 | |
|             $lastPart = array_pop($chunk);
 | |
|             list($lastPart, $mode) = $this->extractMode($lastPart);
 | |
|             $tests[] = [$mode, array_merge($chunk, [$lastPart])];
 | |
|         }
 | |
| 
 | |
|         return [$name, $tests];
 | |
|     }
 | |
| 
 | |
|     public function reconstructTest($name, array $tests) {
 | |
|         $result = $name;
 | |
|         foreach ($tests as list($mode, $parts)) {
 | |
|             $lastPart = array_pop($parts);
 | |
|             foreach ($parts as $part) {
 | |
|                 $result .= "\n-----\n$part";
 | |
|             }
 | |
| 
 | |
|             $result .= "\n-----\n";
 | |
|             if (null !== $mode) {
 | |
|                 $result .= "!!$mode\n";
 | |
|             }
 | |
|             $result .= $lastPart;
 | |
|         }
 | |
|         return $result;
 | |
|     }
 | |
| 
 | |
|     private function extractMode($expected) {
 | |
|         $firstNewLine = strpos($expected, "\n");
 | |
|         if (false === $firstNewLine) {
 | |
|             $firstNewLine = strlen($expected);
 | |
|         }
 | |
| 
 | |
|         $firstLine = substr($expected, 0, $firstNewLine);
 | |
|         if (0 !== strpos($firstLine, '!!')) {
 | |
|             return [$expected, null];
 | |
|         }
 | |
| 
 | |
|         $expected = (string) substr($expected, $firstNewLine + 1);
 | |
|         return [$expected, substr($firstLine, 2)];
 | |
|     }
 | |
| }
 | 
