123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- <?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\Utils;
- use PHPUnit\Framework\TestCase;
- use Symfony\Component\Process\Process;
- /**
- * @requires OS Linux
- *
- * @coversNothing
- */
- final class UnifiedDiffAssertTraitIntegrationTest extends TestCase
- {
- use UnifiedDiffAssertTrait;
- private $filePatch;
- protected function setUp(): void
- {
- $this->filePatch = __DIR__ . '/../fixtures/out/patch.txt';
- $this->cleanUpTempFiles();
- }
- protected function tearDown(): void
- {
- $this->cleanUpTempFiles();
- }
- /**
- * @param string $fileFrom
- * @param string $fileTo
- *
- * @dataProvider provideFilePairsCases
- */
- public function testValidPatches(string $fileFrom, string $fileTo): void
- {
- $command = \sprintf(
- 'diff -u %s %s > %s',
- \escapeshellarg(\realpath($fileFrom)),
- \escapeshellarg(\realpath($fileTo)),
- \escapeshellarg($this->filePatch)
- );
- $p = new Process($command);
- $p->run();
- $exitCode = $p->getExitCode();
- if (0 === $exitCode) {
- // odd case when two files have the same content. Test after executing as it is more efficient than to read the files and check the contents every time.
- $this->addToAssertionCount(1);
- return;
- }
- $this->assertSame(
- 1, // means `diff` found a diff between the files we gave it
- $exitCode,
- \sprintf(
- "Command exec. was not successful:\n\"%s\"\nOutput:\n\"%s\"\nStdErr:\n\"%s\"\nExit code %d.\n",
- $command,
- $p->getOutput(),
- $p->getErrorOutput(),
- $p->getExitCode()
- )
- );
- $this->assertValidUnifiedDiffFormat(FileUtils::getFileContent($this->filePatch));
- }
- /**
- * @return array<string, array<string, string>>
- */
- public function provideFilePairsCases(): array
- {
- $cases = [];
- // created cases based on dedicated fixtures
- $dir = \realpath(__DIR__ . '/../fixtures/UnifiedDiffAssertTraitIntegrationTest');
- $dirLength = \strlen($dir);
- for ($i = 1;; ++$i) {
- $fromFile = \sprintf('%s/%d_a.txt', $dir, $i);
- $toFile = \sprintf('%s/%d_b.txt', $dir, $i);
- if (!\file_exists($fromFile)) {
- break;
- }
- $this->assertFileExists($toFile);
- $cases[\sprintf("Diff file:\n\"%s\"\nvs.\n\"%s\"\n", \substr(\realpath($fromFile), $dirLength), \substr(\realpath($toFile), $dirLength))] = [$fromFile, $toFile];
- }
- // create cases based on PHP files within the vendor directory for integration testing
- $dir = \realpath(__DIR__ . '/../../vendor');
- $dirLength = \strlen($dir);
- $fileIterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir, \RecursiveDirectoryIterator::SKIP_DOTS));
- $fromFile = __FILE__;
- /** @var \SplFileInfo $file */
- foreach ($fileIterator as $file) {
- if ('php' !== $file->getExtension()) {
- continue;
- }
- $toFile = $file->getPathname();
- $cases[\sprintf("Diff file:\n\"%s\"\nvs.\n\"%s\"\n", \substr(\realpath($fromFile), $dirLength), \substr(\realpath($toFile), $dirLength))] = [$fromFile, $toFile];
- $fromFile = $toFile;
- }
- return $cases;
- }
- private function cleanUpTempFiles(): void
- {
- @\unlink($this->filePatch);
- }
- }
|