standardize EOLs to output diffs properly on Windows
[phpt.git] / src / PHPT / Util / Diff.php
blobe96bf8c22985b6a79e343f7a57f15ea075f2cc68
1 <?php
3 class PHPT_Util_Diff
5 private $_wanted = array();
6 private $_actual = array();
8 public function __construct($wanted, $actual)
10 if ($this->_invalidString($wanted)) {
11 throw new PHPT_Util_Diff_InvalidParameter('wanted');
13 if ($this->_invalidString($actual)) {
14 throw new PHPT_Util_Diff_InvalidParameter('actual');
16 $standardize_eol = array($this, '_standardizeEol');
17 $this->_wanted = array_map($standardize_eol, explode("\n", $wanted));
18 $this->_actual = array_map($standardize_eol, explode("\n", $actual));
21 public function __toString()
23 if ($this->_cheapComparison()) {
24 return '';
27 $return = array();
29 $actual_diff = array_diff_assoc($this->_wanted, $this->_actual);
30 $wanted_diff = array_diff_assoc($this->_actual, $this->_wanted);
32 foreach ($wanted_diff as $key => $value) {
33 if (empty($value)) {
34 continue;
36 $key++;
37 $return[sprintf('%03d>', $key)] = sprintf('%03d+ %s', $key, $value);
40 foreach ($actual_diff as $key => $value) {
41 if (empty($value)) {
42 continue;
44 $key++;
45 $return[sprintf('%03d<', $key)] = sprintf('%03d- %s', $key, $value);
48 ksort($return);
49 return implode(PHP_EOL, $return);
52 private function _standardizeEol($value)
54 return rtrim($value, "\r");
57 private function _cheapComparison()
59 return strcmp(serialize($this->_wanted), serialize($this->_actual)) === 0;
62 private function _invalidString($string)
64 if (is_string($string)) {
65 return false;
66 } elseif (is_object($string)) {
67 return !(method_exists($string, '__toString') && (string)$string == $string);
69 return (string)$string != $string;