From 5d769147cac7c97ca384cb6052e6d4cfeb74302c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 17 Jul 2018 10:19:36 +0100 Subject: [PATCH 1/3] LevelProviderManager: make addProvider() throw InvalidArgumentException instead of LevelException LevelException is not useful because it's too generic. --- src/pocketmine/level/format/io/LevelProviderManager.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/pocketmine/level/format/io/LevelProviderManager.php b/src/pocketmine/level/format/io/LevelProviderManager.php index 4c8a98ea1..b79184716 100644 --- a/src/pocketmine/level/format/io/LevelProviderManager.php +++ b/src/pocketmine/level/format/io/LevelProviderManager.php @@ -27,7 +27,6 @@ use pocketmine\level\format\io\leveldb\LevelDB; use pocketmine\level\format\io\region\Anvil; use pocketmine\level\format\io\region\McRegion; use pocketmine\level\format\io\region\PMAnvil; -use pocketmine\level\LevelException; abstract class LevelProviderManager{ protected static $providers = []; @@ -42,11 +41,11 @@ abstract class LevelProviderManager{ /** * @param string $class * - * @throws LevelException + * @throws \InvalidArgumentException */ public static function addProvider(string $class){ if(!is_subclass_of($class, LevelProvider::class)){ - throw new LevelException("Class is not a subclass of LevelProvider"); + throw new \InvalidArgumentException("Class is not a subclass of LevelProvider"); } /** @var LevelProvider $class */ self::$providers[strtolower($class::getProviderName())] = $class; From ad1cf38c2131b4e6ea5ada3bfa8cac85bdebab32 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 17 Jul 2018 10:50:27 +0100 Subject: [PATCH 2/3] LevelProviderManager: tighten up checks on registering --- .../level/format/io/LevelProviderManager.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/pocketmine/level/format/io/LevelProviderManager.php b/src/pocketmine/level/format/io/LevelProviderManager.php index b79184716..1b42a5eda 100644 --- a/src/pocketmine/level/format/io/LevelProviderManager.php +++ b/src/pocketmine/level/format/io/LevelProviderManager.php @@ -44,9 +44,18 @@ abstract class LevelProviderManager{ * @throws \InvalidArgumentException */ public static function addProvider(string $class){ - if(!is_subclass_of($class, LevelProvider::class)){ - throw new \InvalidArgumentException("Class is not a subclass of LevelProvider"); + try{ + $reflection = new \ReflectionClass($class); + }catch(\ReflectionException $e){ + throw new \InvalidArgumentException("Class $class does not exist"); } + if(!$reflection->implementsInterface(LevelProvider::class)){ + throw new \InvalidArgumentException("Class $class does not implement " . LevelProvider::class); + } + if(!$reflection->isInstantiable()){ + throw new \InvalidArgumentException("Class $class cannot be constructed"); + } + /** @var LevelProvider $class */ self::$providers[strtolower($class::getProviderName())] = $class; } From 40030e98007688d189794078a824fe7d20204905 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 17 Jul 2018 10:51:02 +0100 Subject: [PATCH 3/3] added some LevelProviderManager tests --- .../level/format/io/AbstractLevelProvider.php | 28 +++++++++++ .../format/io/InterfaceLevelProvider.php | 28 +++++++++++ .../format/io/LevelProviderManagerTest.php | 47 +++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 tests/phpunit/level/format/io/AbstractLevelProvider.php create mode 100644 tests/phpunit/level/format/io/InterfaceLevelProvider.php create mode 100644 tests/phpunit/level/format/io/LevelProviderManagerTest.php diff --git a/tests/phpunit/level/format/io/AbstractLevelProvider.php b/tests/phpunit/level/format/io/AbstractLevelProvider.php new file mode 100644 index 000000000..7f63048e1 --- /dev/null +++ b/tests/phpunit/level/format/io/AbstractLevelProvider.php @@ -0,0 +1,28 @@ +expectException(\InvalidArgumentException::class); + + LevelProviderManager::addProvider("lol"); + } + + public function testAddAbstractClassProvider() : void{ + $this->expectException(\InvalidArgumentException::class); + + LevelProviderManager::addProvider(AbstractLevelProvider::class); + } + + public function testAddInterfaceProvider() : void{ + $this->expectException(\InvalidArgumentException::class); + + LevelProviderManager::addProvider(InterfaceLevelProvider::class); + } +}