View source
<?php
use SebastianBergmann\Diff\Differ;
class PHPUnit_Framework_Constraint_StringMatches extends PHPUnit_Framework_Constraint_PCREMatch {
protected $string;
public function __construct($string) {
parent::__construct($string);
$this->pattern = $this
->createPatternFromFormat(preg_replace('/\\r\\n/', "\n", $string));
$this->string = $string;
}
protected function failureDescription($other) {
return 'format description matches text';
}
protected function additionalFailureDescription($other) {
$from = preg_split('(\\r\\n|\\r|\\n)', $this->string);
$to = preg_split('(\\r\\n|\\r|\\n)', $other);
foreach ($from as $index => $line) {
if (isset($to[$index]) && $line !== $to[$index]) {
$line = $this
->createPatternFromFormat($line);
if (preg_match($line, $to[$index]) > 0) {
$from[$index] = $to[$index];
}
}
}
$this->string = implode("\n", $from);
$other = implode("\n", $to);
$differ = new Differ("--- Expected\n+++ Actual\n");
return $differ
->diff($this->string, $other);
}
protected function createPatternFromFormat($string) {
$string = str_replace(array(
'%e',
'%s',
'%S',
'%a',
'%A',
'%w',
'%i',
'%d',
'%x',
'%f',
'%c',
), array(
'\\' . DIRECTORY_SEPARATOR,
'[^\\r\\n]+',
'[^\\r\\n]*',
'.+',
'.*',
'\\s*',
'[+-]?\\d+',
'\\d+',
'[0-9a-fA-F]+',
'[+-]?\\.?\\d+\\.?\\d*(?:[Ee][+-]?\\d+)?',
'.',
), preg_quote($string, '/'));
return '/^' . $string . '$/s';
}
}