summaryrefslogtreecommitdiff
path: root/tests/code/exceptions.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/code/exceptions.php')
-rw-r--r--tests/code/exceptions.php73
1 files changed, 73 insertions, 0 deletions
diff --git a/tests/code/exceptions.php b/tests/code/exceptions.php
new file mode 100644
index 0000000..d60fc4f
--- /dev/null
+++ b/tests/code/exceptions.php
@@ -0,0 +1,73 @@
+<?php
+echo '<pre>';
+
+if (!function_exists('interface_exists')) {
+ die('PHP version too old');
+}
+$throwables = listThrowableClasses();
+$throwablesPerParent = splitInParents($throwables);
+printTree($throwablesPerParent);
+if (count($throwablesPerParent) !== 0) {
+ die('ERROR!!!');
+}
+
+function listThrowableClasses()
+{
+ $result = [];
+ if (interface_exists('Throwable')) {
+ foreach (get_declared_classes() as $cn) {
+ $implements = class_implements($cn);
+ if (isset($implements['Throwable'])) {
+ $result[] = $cn;
+ }
+ }
+ } else {
+ foreach (get_declared_classes() as $cn) {
+ if ($cn === 'Exception' || is_subclass_of($cn, 'Exception')) {
+ $result[] = $cn;
+ }
+ }
+ }
+
+ return $result;
+}
+
+function splitInParents($classes)
+{
+ $result = [];
+ foreach ($classes as $cn) {
+ $parent = (string) get_parent_class($cn);
+ if (isset($result[$parent])) {
+ $result[$parent][] = $cn;
+ } else {
+ $result[$parent] = [$cn];
+ }
+ }
+
+ return $result;
+}
+
+function printTree(&$tree)
+{
+ if (!isset($tree[''])) {
+ die('No root classes!!!');
+ }
+ printLeaves($tree, '', 0);
+}
+function printLeaves(&$tree, $parent, $level)
+{
+ if (isset($tree[$parent])) {
+ $leaves = $tree[$parent];
+ unset($tree[$parent]);
+ natcasesort($leaves);
+ $leaves = array_values($leaves);
+ $count = count($leaves);
+ for ($i = 0; $i < $count; ++$i) {
+ $leaf = $leaves[$i];
+ echo str_repeat(' ', $level), $leaf, "\n";
+ printLeaves($tree, $leaf, $level + 1);
+ }
+ }
+}
+
+echo "</pre>"; \ No newline at end of file