helly Sat Aug 9 16:02:02 2003 EDT Modified files: /php-src run-tests.php Log: Better diffing Index: php-src/run-tests.php diff -u php-src/run-tests.php:1.173 php-src/run-tests.php:1.174 --- php-src/run-tests.php:1.173 Sat Aug 9 13:21:19 2003 +++ php-src/run-tests.php Sat Aug 9 16:02:02 2003 @@ -943,26 +943,114 @@ return $warn ? 'WARNED' : 'FAILED'; } +function comp_line($l1,$l2,$is_reg) { + if ($is_reg) { + return preg_match('/^'.$l1.'$/s', $l2); + } else { + return !strcmp($l1, $l2); + } +} + +function count_array_diff($ar1,$ar2,$is_reg,$w,$idx1,$idx2,$cnt1,$cnt2,$steps) { + $equal = 0; + while ($idx1 < $cnt1 && $idx2 < $cnt2 && comp_line($ar1[$idx1], $ar2[$idx2], $is_reg)) { + $idx1++; + $idx2++; + $equal++; + $steps--; + } + if (--$steps > 0) { + $eq1 = 0; + $st = $steps / 2; + for ($ofs1 = $idx1+1; $ofs1 < $cnt1 && $st-- > 0; $ofs1++) { + $eq = count_array_diff($ar1,$ar2,$is_reg,$w,$ofs1,$idx2,$cnt1,$cnt2,$st); + if ($eq > $eq1) { + $eq1 = $eq; + } + } + $eq2 = 0; + $st = $steps; + for ($ofs2 = $idx2+1; $ofs2 < $cnt2 && $st-- > 0; $ofs2++) { + $eq = count_array_diff($ar1,$ar2,$is_reg,$w,$idx1,$ofs2,$cnt1,$cnt2,$st); + if ($eq > $eq2) { + $eq2 = $eq; + } + } + if ($eq1 > $eq2) { + $equal += $eq1; + } else if ($eq2 > 0) { + $equal += $eq2; + } + } + return $equal; +} + +function generate_array_diff($ar1,$ar2,$is_reg,$w) { + $idx1 = 0; $ofs1 = 0; $cnt1 = count($ar1); + $idx2 = 0; $ofs2 = 0; $cnt2 = count($ar2); + $diff = array(); + $old1 = array(); + $old2 = array(); + + while ($idx1 < $cnt1 && $idx2 < $cnt2) { + if (comp_line($ar1[$idx1], $ar2[$idx2], $is_reg)) { + $idx1++; + $idx2++; + continue; + } else { + $c1 = count_array_diff($ar1,$ar2,$is_reg,$w,$idx1+1,$idx2,$cnt1,$cnt2,10); + $c2 = count_array_diff($ar1,$ar2,$is_reg,$w,$idx1,$idx2+1,$cnt1,$cnt2,10); + if ($c1 > $c2) { + $old1[$idx1] = sprintf("%03d- ", $idx1+1).$w[$idx1++]; + $last = 1; + } else if ($c2 > 0) { + $old2[$idx2] = sprintf("%03d+ ", $idx2+1).$ar2[$idx2++]; + $last = 2; + } else { + $old1[$idx1] = sprintf("%03d- ", $idx1+1).$w[$idx1++]; + $old2[$idx2] = sprintf("%03d+ ", $idx2+1).$ar2[$idx2++]; + } + } + } + + reset($old1); $k1 = key($old1); $l1 = -2; + reset($old2); $k2 = key($old2); $l2 = -2; + while ($k1 !== NULL || $k2 !== NULL) { + if ($k1 == $l1+1 || $k2 === NULL) { + $l1 = $k1; + $diff[] = current($old1); + next($old1); + $k1 = key($old1); + } else if ($k2 == $l2+1 || $k1 === NULL) { + $l2 = $k2; + $diff[] = current($old2); + next($old2); + $k2 = key($old2); + } else if ($k1 < $k2) { + $l1 = $k1; + $diff[] = current($old1); + next($old1); + $k1 = key($old1); + } else { + $l2 = $k2; + $diff[] = current($old2); + next($old2); + $k2 = key($old2); + } + } + while ($idx1 < $cnt1) { + $diff[] = sprintf("%03d- ", $idx1+1).$w[$idx1++]; + } + while ($idx2 < $cnt2) { + $diff[] = sprintf("%03d+ ", $idx2+1).$ar2[$idx2++]; + } + return $diff; +} + function generate_diff($wanted,$wanted_re,$output) { $w = explode("\n", $wanted); $o = explode("\n", $output); - if (!is_null($wanted_re)) { - $r = explode("\n", $wanted_re); - for($idx = 0; $idx < min(count($o),count($r)); $idx++) { - if (preg_match('/^'.$r[$idx].'$/s', $o[$idx])) { - $w[$idx] = $o[$idx]; - } - } - } - $w1 = array_diff_assoc($w,$o); - $o1 = array_diff_assoc($o,$w); - $w2 = array(); - $o2 = array(); - foreach($w1 as $idx => $val) $w2[sprintf("%03d<",$idx)] = sprintf("%03d- ", $idx+1).$val; - foreach($o1 as $idx => $val) $o2[sprintf("%03d>",$idx)] = sprintf("%03d+ ", $idx+1).$val; - $diff = array_merge($w2, $o2); - ksort($diff); $r = is_null($wanted_re) ? $w : explode("\n", $wanted_re); $diff = generate_array_diff($r,$o,!is_null($wanted_re),$w); return implode("\r\n", $diff);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php