| [ Index ] |
PHP Cross Reference of Limb3 |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * base include file for SimpleTest 4 * @package SimpleTest 5 * @subpackage UnitTester 6 * @version $Id: dumper.php 5999 2007-06-18 13:13:08Z pachanga $ 7 */ 8 /** 9 * does type matter 10 */ 11 if (! defined('TYPE_MATTERS')) { 12 define('TYPE_MATTERS', true); 13 } 14 15 /** 16 * Displays variables as text and does diffs. 17 * @package SimpleTest 18 * @subpackage UnitTester 19 */ 20 class SimpleDumper { 21 22 /** 23 * Renders a variable in a shorter form than print_r(). 24 * @param mixed $value Variable to render as a string. 25 * @return string Human readable string form. 26 * @access public 27 */ 28 function describeValue($value) { 29 $type = $this->getType($value); 30 switch($type) { 31 case "Null": 32 return "NULL"; 33 case "Boolean": 34 return "Boolean: " . ($value ? "true" : "false"); 35 case "Array": 36 return "Array: " . count($value) . " items"; 37 case "Object": 38 return "Object: of " . get_class($value); 39 case "String": 40 return "String: " . $this->clipString($value, 200); 41 default: 42 return "$type: $value"; 43 } 44 return "Unknown"; 45 } 46 47 /** 48 * Gets the string representation of a type. 49 * @param mixed $value Variable to check against. 50 * @return string Type. 51 * @access public 52 */ 53 function getType($value) { 54 if (! isset($value)) { 55 return "Null"; 56 } elseif (is_bool($value)) { 57 return "Boolean"; 58 } elseif (is_string($value)) { 59 return "String"; 60 } elseif (is_integer($value)) { 61 return "Integer"; 62 } elseif (is_float($value)) { 63 return "Float"; 64 } elseif (is_array($value)) { 65 return "Array"; 66 } elseif (is_resource($value)) { 67 return "Resource"; 68 } elseif (is_object($value)) { 69 return "Object"; 70 } 71 return "Unknown"; 72 } 73 74 /** 75 * Creates a human readable description of the 76 * difference between two variables. Uses a 77 * dynamic call. 78 * @param mixed $first First variable. 79 * @param mixed $second Value to compare with. 80 * @param boolean $identical If true then type anomolies count. 81 * @return string Description of difference. 82 * @access public 83 */ 84 function describeDifference($first, $second, $identical = false) { 85 if ($identical) { 86 if (! $this->_isTypeMatch($first, $second)) { 87 return "with type mismatch as [" . $this->describeValue($first) . 88 "] does not match [" . $this->describeValue($second) . "]"; 89 } 90 } 91 $type = $this->getType($first); 92 if ($type == "Unknown") { 93 return "with unknown type"; 94 } 95 $method = '_describe' . $type . 'Difference'; 96 return $this->$method($first, $second, $identical); 97 } 98 99 /** 100 * Tests to see if types match. 101 * @param mixed $first First variable. 102 * @param mixed $second Value to compare with. 103 * @return boolean True if matches. 104 * @access private 105 */ 106 function _isTypeMatch($first, $second) { 107 return ($this->getType($first) == $this->getType($second)); 108 } 109 110 /** 111 * Clips a string to a maximum length. 112 * @param string $value String to truncate. 113 * @param integer $size Minimum string size to show. 114 * @param integer $position Centre of string section. 115 * @return string Shortened version. 116 * @access public 117 */ 118 function clipString($value, $size, $position = 0) { 119 $length = strlen($value); 120 if ($length <= $size) { 121 return $value; 122 } 123 $position = min($position, $length); 124 $start = ($size/2 > $position ? 0 : $position - $size/2); 125 if ($start + $size > $length) { 126 $start = $length - $size; 127 } 128 $value = substr($value, $start, $size); 129 return ($start > 0 ? "..." : "") . $value . ($start + $size < $length ? "..." : ""); 130 } 131 132 /** 133 * Creates a human readable description of the 134 * difference between two variables. The minimal 135 * version. 136 * @param null $first First value. 137 * @param mixed $second Value to compare with. 138 * @return string Human readable description. 139 * @access private 140 */ 141 function _describeGenericDifference($first, $second) { 142 return "as [" . $this->describeValue($first) . 143 "] does not match [" . 144 $this->describeValue($second) . "]"; 145 } 146 147 /** 148 * Creates a human readable description of the 149 * difference between a null and another variable. 150 * @param null $first First null. 151 * @param mixed $second Null to compare with. 152 * @param boolean $identical If true then type anomolies count. 153 * @return string Human readable description. 154 * @access private 155 */ 156 function _describeNullDifference($first, $second, $identical) { 157 return $this->_describeGenericDifference($first, $second); 158 } 159 160 /** 161 * Creates a human readable description of the 162 * difference between a boolean and another variable. 163 * @param boolean $first First boolean. 164 * @param mixed $second Boolean to compare with. 165 * @param boolean $identical If true then type anomolies count. 166 * @return string Human readable description. 167 * @access private 168 */ 169 function _describeBooleanDifference($first, $second, $identical) { 170 return $this->_describeGenericDifference($first, $second); 171 } 172 173 /** 174 * Creates a human readable description of the 175 * difference between a string and another variable. 176 * @param string $first First string. 177 * @param mixed $second String to compare with. 178 * @param boolean $identical If true then type anomolies count. 179 * @return string Human readable description. 180 * @access private 181 */ 182 function _describeStringDifference($first, $second, $identical) { 183 if (is_object($second) || is_array($second)) { 184 return $this->_describeGenericDifference($first, $second); 185 } 186 $position = $this->_stringDiffersAt($first, $second); 187 $message = "at character $position"; 188 $message .= " with [" . 189 $this->clipString($first, 200, $position) . "] and [" . 190 $this->clipString($second, 200, $position) . "]"; 191 return $message; 192 } 193 194 /** 195 * Creates a human readable description of the 196 * difference between an integer and another variable. 197 * @param integer $first First number. 198 * @param mixed $second Number to compare with. 199 * @param boolean $identical If true then type anomolies count. 200 * @return string Human readable description. 201 * @access private 202 */ 203 function _describeIntegerDifference($first, $second, $identical) { 204 if (is_object($second) || is_array($second)) { 205 return $this->_describeGenericDifference($first, $second); 206 } 207 return "because [" . $this->describeValue($first) . 208 "] differs from [" . 209 $this->describeValue($second) . "] by " . 210 abs($first - $second); 211 } 212 213 /** 214 * Creates a human readable description of the 215 * difference between two floating point numbers. 216 * @param float $first First float. 217 * @param mixed $second Float to compare with. 218 * @param boolean $identical If true then type anomolies count. 219 * @return string Human readable description. 220 * @access private 221 */ 222 function _describeFloatDifference($first, $second, $identical) { 223 if (is_object($second) || is_array($second)) { 224 return $this->_describeGenericDifference($first, $second); 225 } 226 return "because [" . $this->describeValue($first) . 227 "] differs from [" . 228 $this->describeValue($second) . "] by " . 229 abs($first - $second); 230 } 231 232 /** 233 * Creates a human readable description of the 234 * difference between two arrays. 235 * @param array $first First array. 236 * @param mixed $second Array to compare with. 237 * @param boolean $identical If true then type anomolies count. 238 * @return string Human readable description. 239 * @access private 240 */ 241 function _describeArrayDifference($first, $second, $identical) { 242 if (! is_array($second)) { 243 return $this->_describeGenericDifference($first, $second); 244 } 245 if (! $this->_isMatchingKeys($first, $second, $identical)) { 246 return "as key list [" . 247 implode(", ", array_keys($first)) . "] does not match key list [" . 248 implode(", ", array_keys($second)) . "]"; 249 } 250 foreach (array_keys($first) as $key) { 251 if ($identical && ($first[$key] === $second[$key])) { 252 continue; 253 } 254 if (! $identical && ($first[$key] == $second[$key])) { 255 continue; 256 } 257 return "with member [$key] " . $this->describeDifference( 258 $first[$key], 259 $second[$key], 260 $identical); 261 } 262 return ""; 263 } 264 265 /** 266 * Compares two arrays to see if their key lists match. 267 * For an identical match, the ordering and types of the keys 268 * is significant. 269 * @param array $first First array. 270 * @param array $second Array to compare with. 271 * @param boolean $identical If true then type anomolies count. 272 * @return boolean True if matching. 273 * @access private 274 */ 275 function _isMatchingKeys($first, $second, $identical) { 276 $first_keys = array_keys($first); 277 $second_keys = array_keys($second); 278 if ($identical) { 279 return ($first_keys === $second_keys); 280 } 281 sort($first_keys); 282 sort($second_keys); 283 return ($first_keys == $second_keys); 284 } 285 286 /** 287 * Creates a human readable description of the 288 * difference between a resource and another variable. 289 * @param resource $first First resource. 290 * @param mixed $second Resource to compare with. 291 * @param boolean $identical If true then type anomolies count. 292 * @return string Human readable description. 293 * @access private 294 */ 295 function _describeResourceDifference($first, $second, $identical) { 296 return $this->_describeGenericDifference($first, $second); 297 } 298 299 /** 300 * Creates a human readable description of the 301 * difference between two objects. 302 * @param object $first First object. 303 * @param mixed $second Object to compare with. 304 * @param boolean $identical If true then type anomolies count. 305 * @return string Human readable description. 306 * @access private 307 */ 308 function _describeObjectDifference($first, $second, $identical) { 309 if (! is_object($second)) { 310 return $this->_describeGenericDifference($first, $second); 311 } 312 return $this->_describeArrayDifference( 313 get_object_vars($first), 314 get_object_vars($second), 315 $identical); 316 } 317 318 /** 319 * Find the first character position that differs 320 * in two strings by binary chop. 321 * @param string $first First string. 322 * @param string $second String to compare with. 323 * @return integer Position of first differing 324 * character. 325 * @access private 326 */ 327 function _stringDiffersAt($first, $second) { 328 if (! $first || ! $second) { 329 return 0; 330 } 331 if (strlen($first) < strlen($second)) { 332 list($first, $second) = array($second, $first); 333 } 334 $position = 0; 335 $step = strlen($first); 336 while ($step > 1) { 337 $step = (integer)(($step + 1) / 2); 338 if (strncmp($first, $second, $position + $step) == 0) { 339 $position += $step; 340 } 341 } 342 return $position; 343 } 344 345 /** 346 * Sends a formatted dump of a variable to a string. 347 * @param mixed $variable Variable to display. 348 * @return string Output from print_r(). 349 * @access public 350 * @static 351 */ 352 function dump($variable) { 353 ob_start(); 354 print_r($variable); 355 $formatted = ob_get_contents(); 356 ob_end_clean(); 357 return $formatted; 358 } 359 } 360 ?>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Sat Nov 22 03:48:54 2008 | Cross-referenced by PHPXref 0.7 |