132 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			132 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|   | <?php | ||
|  | 
 | ||
|  | /* | ||
|  |  * This file is part of Psy Shell. | ||
|  |  * | ||
|  |  * (c) 2012-2018 Justin Hileman | ||
|  |  * | ||
|  |  * For the full copyright and license information, please view the LICENSE | ||
|  |  * file that was distributed with this source code. | ||
|  |  */ | ||
|  | 
 | ||
|  | namespace Psy\Test; | ||
|  | 
 | ||
|  | use Psy\CodeCleaner; | ||
|  | 
 | ||
|  | class CodeCleanerTest extends \PHPUnit\Framework\TestCase | ||
|  | { | ||
|  |     /** | ||
|  |      * @dataProvider semicolonCodeProvider | ||
|  |      */ | ||
|  |     public function testAutomaticSemicolons(array $lines, $requireSemicolons, $expected) | ||
|  |     { | ||
|  |         $cc = new CodeCleaner(); | ||
|  |         $this->assertSame($expected, $cc->clean($lines, $requireSemicolons)); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function semicolonCodeProvider() | ||
|  |     { | ||
|  |         return [ | ||
|  |             [['true'],  false, 'return true;'], | ||
|  |             [['true;'], false, 'return true;'], | ||
|  |             [['true;'], true,  'return true;'], | ||
|  |             [['true'],  true,  false], | ||
|  | 
 | ||
|  |             [['echo "foo";', 'true'], true,  false], | ||
|  | 
 | ||
|  |             [['echo "foo";', 'true'], false, "echo \"foo\";\nreturn true;"], | ||
|  |         ]; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @dataProvider unclosedStatementsProvider | ||
|  |      */ | ||
|  |     public function testUnclosedStatements(array $lines, $isUnclosed) | ||
|  |     { | ||
|  |         $cc  = new CodeCleaner(); | ||
|  |         $res = $cc->clean($lines); | ||
|  | 
 | ||
|  |         if ($isUnclosed) { | ||
|  |             $this->assertFalse($res); | ||
|  |         } else { | ||
|  |             $this->assertNotFalse($res); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     public function unclosedStatementsProvider() | ||
|  |     { | ||
|  |         return [ | ||
|  |             [['echo "'],   true], | ||
|  |             [['echo \''],  true], | ||
|  |             [['if (1) {'], true], | ||
|  | 
 | ||
|  |             [['echo "foo",'], true], | ||
|  | 
 | ||
|  |             [['echo ""'],   false], | ||
|  |             [["echo ''"],   false], | ||
|  |             [['if (1) {}'], false], | ||
|  | 
 | ||
|  |             [['// closed comment'],    false], | ||
|  |             [['function foo() { /**'], true], | ||
|  | 
 | ||
|  |             [['var_dump(1, 2,'], true], | ||
|  |             [['var_dump(1, 2,', '3)'], false], | ||
|  |         ]; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @dataProvider moreUnclosedStatementsProvider | ||
|  |      */ | ||
|  |     public function testMoreUnclosedStatements(array $lines) | ||
|  |     { | ||
|  |         if (\defined('HHVM_VERSION')) { | ||
|  |             $this->markTestSkipped('HHVM not supported.'); | ||
|  |         } | ||
|  | 
 | ||
|  |         $cc  = new CodeCleaner(); | ||
|  |         $res = $cc->clean($lines); | ||
|  | 
 | ||
|  |         $this->assertFalse($res); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function moreUnclosedStatementsProvider() | ||
|  |     { | ||
|  |         return [ | ||
|  |             [["\$content = <<<EOS\n"]], | ||
|  |             [["\$content = <<<'EOS'\n"]], | ||
|  | 
 | ||
|  |             [['/* unclosed comment']], | ||
|  |             [['/** unclosed comment']], | ||
|  |         ]; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @dataProvider invalidStatementsProvider | ||
|  |      * @expectedException \Psy\Exception\ParseErrorException | ||
|  |      */ | ||
|  |     public function testInvalidStatementsThrowParseErrors($code) | ||
|  |     { | ||
|  |         $cc = new CodeCleaner(); | ||
|  |         $cc->clean([$code]); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function invalidStatementsProvider() | ||
|  |     { | ||
|  |         // n.b. We used to check that `var_dump(1,2,)` failed, but PHP Parser
 | ||
|  |         // 4.x backported trailing comma function calls from PHP 7.3 for free!
 | ||
|  |         // so we're not going to spend too much time worrying about it :)
 | ||
|  | 
 | ||
|  |         return [ | ||
|  |             ['function "what'], | ||
|  |             ["function 'what"], | ||
|  |             ['echo }'], | ||
|  |             ['echo {'], | ||
|  |             ['if (1) }'], | ||
|  |             ['echo """'], | ||
|  |             ["echo '''"], | ||
|  |             ['$foo "bar'], | ||
|  |             ['$foo \'bar'], | ||
|  |         ]; | ||
|  |     } | ||
|  | } |