MDL-62891 core: Introduce new get_callable_name() function

This commit is contained in:
David Mudrák
2018-10-05 09:10:16 +02:00
parent 129783b98c
commit 905d02f458
2 changed files with 72 additions and 0 deletions
+19
View File
@@ -10149,3 +10149,22 @@ class lang_string {
return $this->component;
}
}
/**
* Get human readable name describing the given callable.
*
* This performs syntax check only to see if the given param looks like a valid function, method or closure.
* It does not check if the callable actually exists.
*
* @param callable|string|array $callable
* @return string|bool Human readable name of callable, or false if not a valid callable.
*/
function get_callable_name($callable) {
if (!is_callable($callable, true, $name)) {
return false;
} else {
return $name;
}
}
+53
View File
@@ -4065,4 +4065,57 @@ class core_moodlelib_testcase extends advanced_testcase {
],
];
}
/**
* Test that {@link get_callable_name()} describes the callable as expected.
*
* @dataProvider callable_names_provider
* @param callable $callable
* @param string $expectedname
*/
public function test_get_callable_name($callable, $expectedname) {
$this->assertSame($expectedname, get_callable_name($callable));
}
/**
* Provides a set of callables and their human readable names.
*
* @return array of (string)case => [(mixed)callable, (string|bool)expected description]
*/
public function callable_names_provider() {
return [
'integer' => [
386,
false,
],
'boolean' => [
true,
false,
],
'static_method_as_literal' => [
'my_foobar_class::my_foobar_method',
'my_foobar_class::my_foobar_method',
],
'static_method_of_literal_class' => [
['my_foobar_class', 'my_foobar_method'],
'my_foobar_class::my_foobar_method',
],
'static_method_of_object' => [
[$this, 'my_foobar_method'],
'core_moodlelib_testcase::my_foobar_method',
],
'method_of_object' => [
[new lang_string('parentlanguage', 'core_langconfig'), 'my_foobar_method'],
'lang_string::my_foobar_method',
],
'function_as_literal' => [
'my_foobar_callback',
'my_foobar_callback',
],
'function_as_closure' => [
function($a) { return $a; },
'Closure::__invoke',
],
];
}
}