diff options
Diffstat (limited to 'lib/testmore.php')
-rw-r--r-- | lib/testmore.php | 343 |
1 files changed, 343 insertions, 0 deletions
diff --git a/lib/testmore.php b/lib/testmore.php new file mode 100644 index 000000000..aa0616188 --- /dev/null +++ b/lib/testmore.php @@ -0,0 +1,343 @@ +<?php + +/*******************************************************************\ +* PROJECT INFORMATION * +* * +* Project: Apache-Test * +* URL: http://perl.apache.org/Apache-Test/ * +* Notice: Copyright (c) 2006 The Apache Software Foundation * +* * +********************************************************************* +* LICENSE INFORMATION * +* * +* Licensed under the Apache License, Version 2.0 (the "License"); * +* you may not use this file except in compliance with the * +* License. You may obtain a copy of the License at: * +* * +* http://www.apache.org/licenses/LICENSE-2.0 * +* * +* Unless required by applicable law or agreed to in writing, * +* software distributed under the License is distributed on an "AS * +* IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * +* express or implied. See the License for the specific language * +* governing permissions and limitations under the License. * +* * +********************************************************************* +* MODULE INFORMATION * +* * +* This is a PHP implementation of Test::More: * +* * +* http://search.cpan.org/dist/Test-Simple/lib/Test/More.pm * +* * +********************************************************************* +* CREDITS * +* * +* Originally inspired by work from Andy Lester. Written and * +* maintained by Chris Shiflett. For contact information, see: * +* * +* http://shiflett.org/contact * +* * +\*******************************************************************/ + +header('Content-Type: text/plain'); +register_shutdown_function('_test_end'); + +$_no_plan = FALSE; +$_num_failures = 0; +$_num_skips = 0; +$_test_num = 0; + +function plan($plan) +{ + /* + plan('no_plan'); + plan('skip_all'); + plan(array('skip_all' => 'My reason is...')); + plan(23); + */ + + global $_no_plan; + global $_skip_all; + + switch ($plan) { + case 'no_plan': + $_no_plan = TRUE; + break; + + case 'skip_all': + echo "1..0\n"; + break; + + default: + if (is_array($plan)) { + echo "1..0 # Skip {$plan['skip_all']}\n"; + exit; + } + + echo "1..$plan\n"; + break; + } +} + +function ok($pass, $test_name = '') +{ + global $_test_num; + global $_num_failures; + global $_num_skips; + + $_test_num++; + + if ($_num_skips) { + $_num_skips--; + return TRUE; + } + + if (!empty($test_name) && $test_name[0] != '#') { + $test_name = "- $test_name"; + } + + if ($pass) { + echo "ok $_test_num $test_name\n"; + } else { + echo "not ok $_test_num $test_name\n"; + + $_num_failures++; + $caller = debug_backtrace(); + + if (strstr($caller['0']['file'], $_SERVER['PHP_SELF'])) { + $file = $caller['0']['file']; + $line = $caller['0']['line']; + } else { + $file = $caller['1']['file']; + $line = $caller['1']['line']; + } + + if (isset($_SERVER['SERVER_ROOT'])){ + $file = str_replace($_SERVER['SERVER_ROOT'], 't', $file); + } + + diag(" Failed test ($file at line $line)"); + } + + return $pass; +} + +function is($this, $that, $test_name = '') +{ + $pass = ($this == $that); + + ok($pass, $test_name); + + if (!$pass) { + diag(" got: '$this'"); + diag(" expected: '$that'"); + } + + return $pass; +} + +function isnt($this, $that, $test_name = '') +{ + $pass = ($this != $that); + + ok($pass, $test_name); + + if (!$pass) { + diag(" '$this'"); + diag(' !='); + diag(" '$that'"); + } + + return $pass; +} + +function like($string, $pattern, $test_name = '') +{ + $pass = preg_match($pattern, $string); + + ok($pass, $test_name); + + if (!$pass) { + diag(" '$string'"); + diag(" doesn't match '$pattern'"); + } + + return $pass; +} + +function unlike($string, $pattern, $test_name = '') +{ + $pass = !preg_match($pattern, $string); + + ok($pass, $test_name); + + if (!$pass) { + diag(" '$string'"); + diag(" matches '$pattern'"); + } + + return $pass; +} + +function cmp_ok($this, $operator, $that, $test_name = '') +{ + eval("\$pass = (\$this $operator \$that);"); + + ob_start(); + var_dump($this); + $_this = trim(ob_get_clean()); + + ob_start(); + var_dump($that); + $_that = trim(ob_get_clean()); + + ok($pass, $test_name); + + if (!$pass) { + diag(" got: $_this"); + diag(" expected: $_that"); + } + + return $pass; +} + +function can_ok($object, $methods) +{ + $pass = TRUE; + $errors = array(); + + foreach ($methods as $method) { + if (!method_exists($object, $method)) { + $pass = FALSE; + $errors[] = " method_exists(\$object, $method) failed"; + } + } + + if ($pass) { + ok(TRUE, "method_exists(\$object, ...)"); + } else { + ok(FALSE, "method_exists(\$object, ...)"); + diag($errors); + } + + return $pass; +} + +function isa_ok($object, $expected_class, $object_name = 'The object') +{ + $got_class = get_class($object); + + if (version_compare(phpversion(), '5', '>=')) { + $pass = ($got_class == $expected_class); + } else { + $pass = ($got_class == strtolower($expected_class)); + } + + if ($pass) { + ok(TRUE, "$object_name isa $expected_class"); + } else { + ok(FALSE, "$object_name isn't a '$expected_class' it's a '$got_class'"); + } + + return $pass; +} + +function pass($test_name = '') +{ + return ok(TRUE, $test_name); +} + +function fail($test_name = '') +{ + return ok(FALSE, $test_name); +} + +function diag($message) +{ + if (is_array($message)) { + foreach($message as $current) { + echo "# $current\n"; + } + } else { + echo "# $message\n"; + } +} + +function include_ok($module) +{ + $pass = ((include $module) == 1); + return ok($pass); +} + +function require_ok($module) +{ + $pass = ((require $module) == 1); + return ok($pass); +} + +function skip($message, $num) +{ + global $_num_skips; + + if ($num < 0) { + $num = 0; + } + + for ($i = 0; $i < $num; $i++) { + pass("# SKIP $message"); + } + + $_num_skips = $num; +} + +function is_deeply($got_struct, $expected_struct, $test_name = '') +{ + $got_flat = var_export($got_struct, true); + $expected_flat = var_export($expected_struct, true); + + is($got_flat, $expected_flat, $test_name); +} + + +/* + +TODO: + +function todo() +{ +} + +function todo_skip() +{ +} + +function eq_array() +{ +} + +function eq_hash() +{ +} + +function eq_set() +{ +} + +*/ + +function _test_end() +{ + global $_no_plan; + global $_num_failures; + global $_test_num; + + if ($_no_plan) { + echo "1..$_test_num\n"; + } + + if ($_num_failures) { + diag("Looks like you failed $_num_failures tests of $_test_num."); + } +} + +?> |