From 22c68a815554cb2de424a0f3ec15d23e918fafd1 Mon Sep 17 00:00:00 2001 From: Zoe Slattery Date: Tue, 5 Jun 2007 09:12:34 +0000 Subject: [PATCH] new test cases for general functions --- .../tests/general_functions/floatval.phpt | 207 +++ .../tests/general_functions/is_callable.phpt | 1116 +++++++++++++++++ 2 files changed, 1323 insertions(+) create mode 100644 ext/standard/tests/general_functions/floatval.phpt create mode 100644 ext/standard/tests/general_functions/is_callable.phpt diff --git a/ext/standard/tests/general_functions/floatval.phpt b/ext/standard/tests/general_functions/floatval.phpt new file mode 100644 index 0000000000..bb28368e24 --- /dev/null +++ b/ext/standard/tests/general_functions/floatval.phpt @@ -0,0 +1,207 @@ +--TEST-- +Testing floatval() and its alias doubleval() Functions +--FILE-- + +--EXPECTF-- +*** Testing floatval() with valid float values *** +float(0) +float(1) +float(-1) +float(1.234) +float(-1.234) +float(1200) +float(-1200) +float(10) +float(1050000) +float(100000) +float(-100000) +float(1.0E-5) +float(-0.1) +float(100000) +float(-100000) +float(100000) +float(-100000) +float(100000) +float(-100000) +float(5000000) +float(-5000000) + +*** Testing doubleval() with valid float values *** +float(0) +float(1) +float(-1) +float(1.234) +float(-1.234) +float(1200) +float(-1200) +float(10) +float(1050000) +float(100000) +float(-100000) +float(1.0E-5) +float(-0.1) +float(100000) +float(-100000) +float(100000) +float(-100000) +float(100000) +float(-100000) +float(5000000) +float(-5000000) + +*** Testing floatval() on non floating types *** +float(-2147483648) +float(2147483648) +float(5) +float(6) +float(0) +float(1) +float(-1300) +float(0) +float(10) +float(10.2) +float(11) +float(11) +float(0) +float(1) +float(0) +float(0) + +*** Testing doubleval() on non floating types *** +float(-2147483648) +float(2147483648) +float(5) +float(6) +float(0) +float(1) +float(-1300) +float(0) +float(10) +float(10.2) +float(11) +float(11) +float(0) +float(1) +float(0) +float(0) + +*** Testing error conditions *** + +Warning: Wrong parameter count for floatval() in %s on line %d +NULL + +Warning: Wrong parameter count for doubleval() in %s on line %d +NULL + +Warning: Wrong parameter count for floatval() in %s on line %d +NULL + +Warning: Wrong parameter count for doubleval() in %s on line %d +NULL + +Done diff --git a/ext/standard/tests/general_functions/is_callable.phpt b/ext/standard/tests/general_functions/is_callable.phpt new file mode 100644 index 0000000000..3a45e515df --- /dev/null +++ b/ext/standard/tests/general_functions/is_callable.phpt @@ -0,0 +1,1116 @@ +--TEST-- +Test is_callable() function +--FILE-- +class_object1 = new object_class(); + $this->no_member_class_object = new no_member_class(); + } +} +/* objects of different classes */ +$obj = new contains_object_class; +$temp_class_obj = new object_class(); + +/* object which is unset */ +$unset_obj = new object_class(); +unset($unset_obj); + +/* check is_callable() on static method */ +echo "\n** Testing behavior of is_callable() on static methods **\n"; +var_dump( is_callable('object_class::foo()', true) ); //expected: true +var_dump( is_callable('object_class::foo()') ); //expected: false + +echo "\n** Testing normal operations of is_callable() on objects **\n"; +$objects = array ( + new object_class, + new no_member_class, + new contains_object_class, + $obj, + $obj->class_object1, + $obj->no_member_class_object, + $temp_class_obj, + @$unset_obj +); + +/* loop to check whether given object/string has valid given method name + * expected: true if valid callback + * false otherwise + */ +$loop_counter = 1; +foreach($objects as $object) { + echo "--- Outerloop iteration $loop_counter ---\n"; + $methods = array ( + array( $object, 'foo1' ), + array( $object, 'foo2' ), + array( $object, 'foo3' ), + array( $object, 'x123' ), + array( $object, 'null' ), + array( $object, 'TRUE' ), + array( $object, '123' ), + array( @$temp_class_obj->value, 100 ), + array( $object, 'func' ), + array( 'object_class', 'foo1' ), + ); + /* use check_iscallable_objects() to check whether given object/string + has valid method name */ + check_iscallable_objects($methods); + $loop_counter++; +} + +echo "\n*** Testing is_callable() on invalid function names ***\n"; +/* check on unset variables */ +$unset_var = 10; +unset ($unset_var); + +/* opening file resource type */ +$file_handle = fopen (__FILE__, "r"); + +$variants = array ( + NULL, // NULL as argument + 0, // zero as argument + 1234567890, // positive value + -100123456782, // negative value + -2.000000, // negative float value + .567, // positive float value + FALSE, // boolean value + array(1, 2, 3), // array + @$unset_var, + @$undef_var, //undefined variable + $file_handle +); +/* use check_iscallable() to check whether given variable is valid function name + * expected: false + */ +check_iscallable($variants); + +echo "\n*** Testing error conditions ***\n"; +/* passing zero argument */ +var_dump( is_callable() ); +/* passing more than required arguments */ +var_dump( is_callable("string", TRUE, $callable_name, "EXTRA") ); + +/* closing resources used */ +fclose($file_handle); + +echo "Done\n"; +?> +--EXPECTF-- +*** Testing is_callable() on defined functions *** +-- Iteration 1 -- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +someFunction +-- Iteration 2 -- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +x123 +-- Iteration 3 -- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +NULL +-- Iteration 4 -- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +false +-- Iteration 5 -- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +Hello_World + +*** Testing is_callable() on undefined functions *** +-- Iteration 1 -- +bool(false) +bool(true) +bool(true) +bool(false) +bool(false) + +-- Iteration 2 -- +bool(false) +bool(true) +bool(true) +bool(false) +bool(false) + +-- Iteration 3 -- +bool(false) +bool(true) +bool(true) +bool(false) +bool(false) + +-- Iteration 4 -- +bool(false) +bool(true) +bool(true) +bool(false) +bool(false) + +-- Iteration 5 -- +bool(false) +bool(true) +bool(true) +bool(false) +bool(false) +12356 +-- Iteration 6 -- +bool(false) +bool(true) +bool(true) +bool(false) +bool(false) + +-- Iteration 7 -- +bool(false) +bool(true) +bool(true) +bool(false) +bool(false) +\0 +-- Iteration 8 -- +bool(false) +bool(true) +bool(true) +bool(false) +bool(false) +hello world +-- Iteration 9 -- +bool(false) +bool(true) +bool(true) +bool(false) +bool(false) +hello world +-- Iteration 10 -- +bool(false) +bool(true) +bool(true) +bool(false) +bool(false) +welcome +-- Iteration 11 -- +bool(false) +bool(true) +bool(true) +bool(false) +bool(false) +welcome\0 +-- Iteration 12 -- +bool(false) +bool(true) +bool(true) +bool(false) +bool(false) +==%%%***$$$@@@!! +-- Iteration 13 -- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +false +-- Iteration 14 -- +bool(false) +bool(true) +bool(true) +bool(false) +bool(false) +8 +-- Iteration 15 -- +bool(false) +bool(true) +bool(true) +bool(false) +bool(false) +\t +-- Iteration 16 -- +bool(false) +bool(true) +bool(true) +bool(false) +bool(false) +\007 +-- Iteration 17 -- +bool(false) +bool(true) +bool(true) +bool(false) +bool(false) +123 +-- Iteration 18 -- +bool(false) +bool(true) +bool(true) +bool(false) +bool(false) +echo() + +*** Testing is_callable() on objects *** + +** Testing behavior of is_callable() on static methods ** +bool(true) +bool(false) + +** Testing normal operations of is_callable() on objects ** +--- Outerloop iteration 1 --- +-- Innerloop iteration 1 of Outerloop iteration 1 -- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +object_class::foo1 +-- Innerloop iteration 2 of Outerloop iteration 1 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +object_class::foo2 +-- Innerloop iteration 3 of Outerloop iteration 1 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +object_class::foo3 +-- Innerloop iteration 4 of Outerloop iteration 1 -- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +object_class::x123 +-- Innerloop iteration 5 of Outerloop iteration 1 -- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +object_class::null +-- Innerloop iteration 6 of Outerloop iteration 1 -- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +object_class::TRUE +-- Innerloop iteration 7 of Outerloop iteration 1 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +object_class::123 +-- Innerloop iteration 8 of Outerloop iteration 1 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +Array +-- Innerloop iteration 9 of Outerloop iteration 1 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +object_class::func +-- Innerloop iteration 10 of Outerloop iteration 1 -- + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +bool(true) + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +bool(true) + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +object_class::foo1 +--- Outerloop iteration 2 --- +-- Innerloop iteration 1 of Outerloop iteration 2 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +no_member_class::foo1 +-- Innerloop iteration 2 of Outerloop iteration 2 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +no_member_class::foo2 +-- Innerloop iteration 3 of Outerloop iteration 2 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +no_member_class::foo3 +-- Innerloop iteration 4 of Outerloop iteration 2 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +no_member_class::x123 +-- Innerloop iteration 5 of Outerloop iteration 2 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +no_member_class::null +-- Innerloop iteration 6 of Outerloop iteration 2 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +no_member_class::TRUE +-- Innerloop iteration 7 of Outerloop iteration 2 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +no_member_class::123 +-- Innerloop iteration 8 of Outerloop iteration 2 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +Array +-- Innerloop iteration 9 of Outerloop iteration 2 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +no_member_class::func +-- Innerloop iteration 10 of Outerloop iteration 2 -- + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +bool(true) + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +bool(true) + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +object_class::foo1 +--- Outerloop iteration 3 --- +-- Innerloop iteration 1 of Outerloop iteration 3 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +contains_object_class::foo1 +-- Innerloop iteration 2 of Outerloop iteration 3 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +contains_object_class::foo2 +-- Innerloop iteration 3 of Outerloop iteration 3 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +contains_object_class::foo3 +-- Innerloop iteration 4 of Outerloop iteration 3 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +contains_object_class::x123 +-- Innerloop iteration 5 of Outerloop iteration 3 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +contains_object_class::null +-- Innerloop iteration 6 of Outerloop iteration 3 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +contains_object_class::TRUE +-- Innerloop iteration 7 of Outerloop iteration 3 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +contains_object_class::123 +-- Innerloop iteration 8 of Outerloop iteration 3 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +Array +-- Innerloop iteration 9 of Outerloop iteration 3 -- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +contains_object_class::func +-- Innerloop iteration 10 of Outerloop iteration 3 -- + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +bool(true) + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +bool(true) + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +object_class::foo1 +--- Outerloop iteration 4 --- +-- Innerloop iteration 1 of Outerloop iteration 4 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +contains_object_class::foo1 +-- Innerloop iteration 2 of Outerloop iteration 4 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +contains_object_class::foo2 +-- Innerloop iteration 3 of Outerloop iteration 4 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +contains_object_class::foo3 +-- Innerloop iteration 4 of Outerloop iteration 4 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +contains_object_class::x123 +-- Innerloop iteration 5 of Outerloop iteration 4 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +contains_object_class::null +-- Innerloop iteration 6 of Outerloop iteration 4 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +contains_object_class::TRUE +-- Innerloop iteration 7 of Outerloop iteration 4 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +contains_object_class::123 +-- Innerloop iteration 8 of Outerloop iteration 4 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +Array +-- Innerloop iteration 9 of Outerloop iteration 4 -- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +contains_object_class::func +-- Innerloop iteration 10 of Outerloop iteration 4 -- + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +bool(true) + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +bool(true) + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +object_class::foo1 +--- Outerloop iteration 5 --- +-- Innerloop iteration 1 of Outerloop iteration 5 -- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +object_class::foo1 +-- Innerloop iteration 2 of Outerloop iteration 5 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +object_class::foo2 +-- Innerloop iteration 3 of Outerloop iteration 5 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +object_class::foo3 +-- Innerloop iteration 4 of Outerloop iteration 5 -- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +object_class::x123 +-- Innerloop iteration 5 of Outerloop iteration 5 -- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +object_class::null +-- Innerloop iteration 6 of Outerloop iteration 5 -- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +object_class::TRUE +-- Innerloop iteration 7 of Outerloop iteration 5 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +object_class::123 +-- Innerloop iteration 8 of Outerloop iteration 5 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +Array +-- Innerloop iteration 9 of Outerloop iteration 5 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +object_class::func +-- Innerloop iteration 10 of Outerloop iteration 5 -- + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +bool(true) + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +bool(true) + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +object_class::foo1 +--- Outerloop iteration 6 --- +-- Innerloop iteration 1 of Outerloop iteration 6 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +no_member_class::foo1 +-- Innerloop iteration 2 of Outerloop iteration 6 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +no_member_class::foo2 +-- Innerloop iteration 3 of Outerloop iteration 6 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +no_member_class::foo3 +-- Innerloop iteration 4 of Outerloop iteration 6 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +no_member_class::x123 +-- Innerloop iteration 5 of Outerloop iteration 6 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +no_member_class::null +-- Innerloop iteration 6 of Outerloop iteration 6 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +no_member_class::TRUE +-- Innerloop iteration 7 of Outerloop iteration 6 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +no_member_class::123 +-- Innerloop iteration 8 of Outerloop iteration 6 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +Array +-- Innerloop iteration 9 of Outerloop iteration 6 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +no_member_class::func +-- Innerloop iteration 10 of Outerloop iteration 6 -- + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +bool(true) + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +bool(true) + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +object_class::foo1 +--- Outerloop iteration 7 --- +-- Innerloop iteration 1 of Outerloop iteration 7 -- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +object_class::foo1 +-- Innerloop iteration 2 of Outerloop iteration 7 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +object_class::foo2 +-- Innerloop iteration 3 of Outerloop iteration 7 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +object_class::foo3 +-- Innerloop iteration 4 of Outerloop iteration 7 -- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +object_class::x123 +-- Innerloop iteration 5 of Outerloop iteration 7 -- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +object_class::null +-- Innerloop iteration 6 of Outerloop iteration 7 -- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +object_class::TRUE +-- Innerloop iteration 7 of Outerloop iteration 7 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +object_class::123 +-- Innerloop iteration 8 of Outerloop iteration 7 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +Array +-- Innerloop iteration 9 of Outerloop iteration 7 -- +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +object_class::func +-- Innerloop iteration 10 of Outerloop iteration 7 -- + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +bool(true) + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +bool(true) + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +object_class::foo1 +--- Outerloop iteration 8 --- +-- Innerloop iteration 1 of Outerloop iteration 8 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +Array +-- Innerloop iteration 2 of Outerloop iteration 8 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +Array +-- Innerloop iteration 3 of Outerloop iteration 8 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +Array +-- Innerloop iteration 4 of Outerloop iteration 8 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +Array +-- Innerloop iteration 5 of Outerloop iteration 8 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +Array +-- Innerloop iteration 6 of Outerloop iteration 8 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +Array +-- Innerloop iteration 7 of Outerloop iteration 8 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +Array +-- Innerloop iteration 8 of Outerloop iteration 8 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +Array +-- Innerloop iteration 9 of Outerloop iteration 8 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +Array +-- Innerloop iteration 10 of Outerloop iteration 8 -- + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +bool(true) + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +bool(true) + +Strict Standards: Non-static method object_class::foo1() cannot be called statically in %s on line %d +bool(true) +object_class::foo1 + +*** Testing is_callable() on invalid function names *** +-- Iteration 1 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) + +-- Iteration 2 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +0 +-- Iteration 3 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +1234567890 +-- Iteration 4 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +-100123456782 +-- Iteration 5 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +-2 +-- Iteration 6 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +0.567 +-- Iteration 7 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) + +-- Iteration 8 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +Array +-- Iteration 9 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) + +-- Iteration 10 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) + +-- Iteration 11 -- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +Resource id #5 + +*** Testing error conditions *** + +Warning: Wrong parameter count for is_callable() in %s on line %d +NULL + +Warning: Wrong parameter count for is_callable() in %s on line %d +NULL +Done -- 2.50.1