/**
  * @dataProvider getLibraries
  */
 public function testLibrary($zipFile)
 {
     $libName = basename($zipFile, '.zip');
     $config = array();
     if (is_file($configFile = __DIR__ . '/libraries/' . $libName . '-config.json')) {
         $config = json_decode(file_get_contents($configFile), true);
     }
     $files = FileCollection::createFromZipFile($zipFile, null, isset($config['filter']) ? $config['filter'] : array());
     $this->analyzer->analyze($files);
     $actualComments = $this->dumpComments($files);
     if (!is_file($commentFile = __DIR__ . '/libraries/' . $libName . '-comments.txt')) {
         file_put_contents($commentFile . '.tmp', $actualComments);
         $this->fail(sprintf('The comment file "%s" was not found.', $commentFile));
     }
     $this->assertEquals(file_get_contents($commentFile), $actualComments);
     $nonExistentFiles = array();
     foreach ($files as $file) {
         $fixedFilePath = __DIR__ . '/libraries/' . $libName . '-' . $file->getName();
         if (!$file->hasFixedFileWithChanges()) {
             $this->assertFileNotExists($fixedFilePath . '.diff');
             continue;
         }
         $diff = \Scrutinizer\Util\DiffUtils::generate($file->getContent(), $file->getFixedFile()->getContent());
         if (!is_file($fixedFilePath . '.diff')) {
             if (!is_dir($dir = dirname($fixedFilePath))) {
                 mkdir($dir, 0777, true);
             }
             file_put_contents($fixedFilePath . '.tmp.diff', $diff);
             $nonExistentFiles[] = $fixedFilePath . '.tmp.diff';
             continue;
         }
         $this->assertEquals(file_get_contents($fixedFilePath . '.diff'), $diff);
     }
     $this->assertCount(0, $nonExistentFiles, "Some files are missing:\n" . implode("\n", $nonExistentFiles));
 }
 public function testDiff()
 {
     $diffs = DiffUtils::parseDiffs(file_get_contents(__DIR__ . '/Fixture/one_modified_one_removed.diff'));
     $this->assertCount(3, $diffs);
     $this->assertEquals('src/CheckAccessControlPass.php', $diffs[0]['a_path']);
     $this->assertEquals('src/CheckAccessControlPass.php', $diffs[0]['b_path']);
     $this->assertEquals('a5c01ca', $diffs[0]['a_sha']);
     $this->assertEquals('f781f8f', $diffs[0]['b_sha']);
     $this->assertNull($diffs[0]['a_mode']);
     $this->assertEquals('100644', $diffs[0]['b_mode']);
     $this->assertFalse($diffs[0]['is_new']);
     $this->assertFalse($diffs[0]['is_deleted']);
     $this->assertFalse($diffs[0]['is_renamed']);
     $this->assertNull($diffs[0]['sim_index']);
     $this->assertStringStartsWith('@@', $diffs[0]['diff']);
     $this->assertEquals('src/PhpParser/Scope/Scope.php', $diffs[1]['a_path']);
     $this->assertEquals('src/PhpParser/Scope/Scope.php', $diffs[1]['b_path']);
     $this->assertEquals('0110ef0', $diffs[1]['a_sha']);
     $this->assertEquals('facb0c0', $diffs[1]['b_sha']);
     $this->assertNull($diffs[1]['a_mode']);
     $this->assertEquals('100644', $diffs[1]['b_mode']);
     $this->assertFalse($diffs[1]['is_new']);
     $this->assertFalse($diffs[1]['is_deleted']);
     $this->assertFalse($diffs[1]['is_renamed']);
     $this->assertStringStartsWith('@@', $diffs[0]['diff']);
     $this->assertNull($diffs[1]['sim_index']);
     $this->assertEquals('tests/Fixture/AccessControl/call_from_non_object_context.test', $diffs[2]['a_path']);
     $this->assertEquals('tests/Fixture/AccessControl/call_from_non_object_context.test', $diffs[2]['b_path']);
     $this->assertEquals('5c7ab73', $diffs[2]['a_sha']);
     $this->assertEquals('0000000', $diffs[2]['b_sha']);
     $this->assertEquals('100644', $diffs[2]['a_mode']);
     $this->assertNull($diffs[2]['b_mode']);
     $this->assertFalse($diffs[2]['is_new']);
     $this->assertTrue($diffs[2]['is_deleted']);
     $this->assertFalse($diffs[2]['is_renamed']);
     $this->assertStringStartsWith('@@', $diffs[2]['diff']);
     $this->assertNull($diffs[2]['sim_index']);
 }
 /**
  * @Serializer\VirtualProperty
  */
 public function getProposedPatch()
 {
     if (empty($this->fixedFile)) {
         return null;
     }
     $after = $this->fixedFile->getContent();
     if ($this->content === $after) {
         return null;
     }
     return DiffUtils::generate($this->content, $after);
 }
 private function parseTestCase($filename)
 {
     $content = file_get_contents($filename);
     $test = array('filename' => 'foo.php', 'code' => '', 'diff' => '', 'after' => null, 'comments' => array(), 'config' => '', 'new_file' => null, 'original_file' => null);
     $block = null;
     foreach (explode("\n", $content) as $line) {
         if (0 === strpos($line, '-- DIFF --')) {
             $block = 'diff';
             continue;
         }
         if (0 === strpos($line, '-- AFTER --')) {
             $block = 'after';
             continue;
         }
         if (0 === strpos($line, '-- COMMENTS --')) {
             $block = 'comments';
             continue;
         }
         if (0 === strpos($line, '-- CONFIG --')) {
             $block = 'config';
             continue;
         }
         if (0 === strpos($line, '-- FILENAME --')) {
             $block = 'filename';
             continue;
         }
         if (0 === strpos($line, '-- ORIGINAL_FILE --')) {
             $block = 'original_file';
             continue;
         }
         if (0 === strpos($line, '-- NEW_FILE --')) {
             $block = 'new_file';
             continue;
         }
         switch ($block) {
             case 'config':
                 if ('' !== trim($line)) {
                     $test['config'] .= $line;
                 }
                 break;
             case 'new_file':
             case 'original_file':
             case 'filename':
                 if ('' !== trim($line)) {
                     $test[$block] = trim($line);
                 }
                 break;
             case 'comments':
                 if ('' === trim($line)) {
                     break;
                 }
                 if (!preg_match('/^Line ([0-9]+): (.*)/', $line, $match)) {
                     throw new \RuntimeException('Invalid Comment Line: ' . $line);
                 }
                 $test['comments'][(int) $match[1]][] = $match[2];
                 break;
             case 'diff':
                 if ('' !== trim($line)) {
                     $test['diff'] .= $line . "\n";
                 }
                 break;
             case 'after':
                 $test['after'] .= $line . "\n";
                 break;
             default:
                 $test['code'] .= $line . "\n";
         }
     }
     if (null !== $test['new_file'] && null !== $test['original_file']) {
         if (!is_file($newFile = dirname($filename) . '/' . $test['new_file'])) {
             throw new \InvalidArgumentException(sprintf('New file not found at "%s".', $newFile));
         }
         if (!is_file($originalFile = dirname($filename) . '/' . $test['original_file'])) {
             throw new \InvalidArgumentException(sprintf('Original file not found at "%s".', $originalFile));
         }
         $test['code'] = file_get_contents($newFile);
         $test['diff'] = DiffUtils::generate(file_get_contents($originalFile), $test['code']);
     }
     if ('' === $test['config']) {
         $test['config'] = array();
     } else {
         $test['config'] = eval($test['config']);
         if (!is_array($test['config'])) {
             throw new \RuntimeException('Config must be an array, but got ' . var_export($test['config'], true));
         }
     }
     return $test;
 }