From 69e77359c7ce213b31be60d21a04413085b9e51c Mon Sep 17 00:00:00 2001 From: Christoph Landsdorf Date: Sat, 9 Sep 2017 15:06:18 +0200 Subject: [PATCH] Replace substr in getCode() to cover more cases (#61) --- src/ClassPreloader.php | 12 +++--- tests/ClassPreloaderTest.php | 55 +++++++++++++++++++++++++ tests/stubs/StrictClassWithComments.php | 12 ++++++ 3 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 tests/ClassPreloaderTest.php create mode 100644 tests/stubs/StrictClassWithComments.php diff --git a/src/ClassPreloader.php b/src/ClassPreloader.php index c70692f..48c8102 100644 --- a/src/ClassPreloader.php +++ b/src/ClassPreloader.php @@ -128,13 +128,11 @@ public function getCode($file, $comments = true) $stmts = $this->traverser->traverseFile($parsed, $file); $pretty = $this->printer->prettyPrint($stmts); - if (substr($pretty, 30) === 'getCodeWrappedIntoNamespace($parsed, $pretty); } diff --git a/tests/ClassPreloaderTest.php b/tests/ClassPreloaderTest.php new file mode 100644 index 0000000..ea9c81d --- /dev/null +++ b/tests/ClassPreloaderTest.php @@ -0,0 +1,55 @@ +getMockBuilder(PrettyPrinter::class) + ->disableOriginalConstructor() + ->setMethods(['prettyPrint']); + $parser = $this->getMockBuilder(Parser::class) + ->disableOriginalConstructor() + ->setMethods(['parse', 'getErrors']); + $traverser = $this->getMockBuilder(NodeTraverser::class) + ->disableOriginalConstructor() + ->setMethods(['traverseFile']); + + $parserMock = $parser->getMock(); + $parserMock->expects($this->once()) + ->method('parse') + ->willReturn([]); + $traverserMock = $traverser->getMock(); + $traverserMock->expects($this->once()) + ->method('traverseFile') + ->willReturn([]); + $printerMock = $printer->getMock(); + $printerMock->expects($this->once()) + ->method('prettyPrint') + ->willReturn( + file_get_contents(__DIR__.'/stubs/StrictClassWithComments.php') + ); + + $classPreloader = new ClassPreloader( + $printerMock, + $parserMock, + $traverserMock + ); + + $code = $classPreloader->getCode(__DIR__.'/stubs/StrictClassWithComments.php'); + + // $code should not have 'declare(strict_types=1)' declarations. + $this->assertNotRegExp( + '/(.*?)declare\s*\(strict_types\s*=\s*1\)(.*?)/mi', + $code, + 'Generated ClassPreloader output should correctly detect and strip strict_type declare statements.' + ); + } +} diff --git a/tests/stubs/StrictClassWithComments.php b/tests/stubs/StrictClassWithComments.php new file mode 100644 index 0000000..2222da2 --- /dev/null +++ b/tests/stubs/StrictClassWithComments.php @@ -0,0 +1,12 @@ +