You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
3.3 KiB
144 lines
3.3 KiB
<?php declare(strict_types=1);
|
|
/*
|
|
* This file is part of PHPUnit.
|
|
*
|
|
* (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 PHPUnit\Runner\Baseline;
|
|
|
|
use function assert;
|
|
use function file;
|
|
use function is_file;
|
|
use function sha1;
|
|
use PHPUnit\Runner\FileDoesNotExistException;
|
|
|
|
/**
|
|
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
|
*/
|
|
final class Issue
|
|
{
|
|
/**
|
|
* @psalm-var non-empty-string
|
|
*/
|
|
private readonly string $file;
|
|
|
|
/**
|
|
* @psalm-var positive-int
|
|
*/
|
|
private readonly int $line;
|
|
|
|
/**
|
|
* @psalm-var non-empty-string
|
|
*/
|
|
private readonly string $hash;
|
|
|
|
/**
|
|
* @psalm-var non-empty-string
|
|
*/
|
|
private readonly string $description;
|
|
|
|
/**
|
|
* @psalm-param non-empty-string $file
|
|
* @psalm-param positive-int $line
|
|
* @psalm-param ?non-empty-string $hash
|
|
* @psalm-param non-empty-string $description
|
|
*
|
|
* @throws FileDoesNotExistException
|
|
* @throws FileDoesNotHaveLineException
|
|
*/
|
|
public static function from(string $file, int $line, ?string $hash, string $description): self
|
|
{
|
|
if ($hash === null) {
|
|
$hash = self::calculateHash($file, $line);
|
|
}
|
|
|
|
return new self($file, $line, $hash, $description);
|
|
}
|
|
|
|
/**
|
|
* @psalm-param non-empty-string $file
|
|
* @psalm-param positive-int $line
|
|
* @psalm-param non-empty-string $hash
|
|
* @psalm-param non-empty-string $description
|
|
*/
|
|
private function __construct(string $file, int $line, string $hash, string $description)
|
|
{
|
|
$this->file = $file;
|
|
$this->line = $line;
|
|
$this->hash = $hash;
|
|
$this->description = $description;
|
|
}
|
|
|
|
/**
|
|
* @psalm-return non-empty-string
|
|
*/
|
|
public function file(): string
|
|
{
|
|
return $this->file;
|
|
}
|
|
|
|
/**
|
|
* @psalm-return positive-int
|
|
*/
|
|
public function line(): int
|
|
{
|
|
return $this->line;
|
|
}
|
|
|
|
/**
|
|
* @psalm-return non-empty-string
|
|
*/
|
|
public function hash(): string
|
|
{
|
|
return $this->hash;
|
|
}
|
|
|
|
/**
|
|
* @psalm-return non-empty-string
|
|
*/
|
|
public function description(): string
|
|
{
|
|
return $this->description;
|
|
}
|
|
|
|
public function equals(self $other): bool
|
|
{
|
|
return $this->file() === $other->file() &&
|
|
$this->line() === $other->line() &&
|
|
$this->hash() === $other->hash() &&
|
|
$this->description() === $other->description();
|
|
}
|
|
|
|
/**
|
|
* @psalm-param non-empty-string $file
|
|
* @psalm-param positive-int $line
|
|
*
|
|
* @psalm-return non-empty-string
|
|
*
|
|
* @throws FileDoesNotExistException
|
|
* @throws FileDoesNotHaveLineException
|
|
*/
|
|
private static function calculateHash(string $file, int $line): string
|
|
{
|
|
if (!is_file($file)) {
|
|
throw new FileDoesNotExistException($file);
|
|
}
|
|
|
|
$lines = file($file, FILE_IGNORE_NEW_LINES);
|
|
$key = $line - 1;
|
|
|
|
if (!isset($lines[$key])) {
|
|
throw new FileDoesNotHaveLineException($file, $line);
|
|
}
|
|
|
|
$hash = sha1($lines[$key]);
|
|
|
|
assert(!empty($hash));
|
|
|
|
return $hash;
|
|
}
|
|
}
|