expectException( \LogicException::class ); $featureManager = new FeatureManager(); $featureManager->registerSet( 'setA', true ); $featureManager->registerSet( 'setA', true ); } /** * @covers ::registerSet */ public function testRegisterSetValidatesIsEnabled() { $this->expectException( \Wikimedia\Assert\ParameterAssertionException::class ); $featureManager = new FeatureManager(); $featureManager->registerSet( 'setA', 'foo' ); } public static function provideInvalidFeatureConfig() { return [ // ::registerFeature( string, int[] ) will throw an exception. [ \Wikimedia\Assert\ParameterAssertionException::class, [ 1 ], ], // The "bar" set hasn't been registered. [ \InvalidArgumentException::class, [ 'bar', ], ], ]; } /** * @dataProvider provideInvalidFeatureConfig * @covers ::registerFeature */ public function testRegisterFeatureValidatesConfig( $expectedExceptionType, $config ) { $this->expectException( $expectedExceptionType ); $featureManager = new FeatureManager(); $featureManager->registerSet( 'set', true ); $featureManager->registerFeature( 'feature', $config ); } /** * @covers ::isSetEnabled */ public function testIsSetEnabled() { $featureManager = new FeatureManager(); $featureManager->registerSet( 'enabled', true ); $featureManager->registerSet( 'disabled', false ); $this->assertTrue( $featureManager->isSetEnabled( 'enabled' ) ); $this->assertFalse( $featureManager->isSetEnabled( 'disabled' ) ); } /** * @covers ::isSetEnabled */ public function testIsSetEnabledThrowsExceptionWhenSetIsntRegistered() { $this->expectException( \InvalidArgumentException::class ); $featureManager = new FeatureManager(); $featureManager->isSetEnabled( 'foo' ); } /** * @covers ::registerFeature */ public function testRegisterFeatureThrowsExceptionWhenFeatureIsRegisteredTwice() { $this->expectException( \LogicException::class ); $featureManager = new FeatureManager(); $featureManager->registerFeature( 'featureA', [] ); $featureManager->registerFeature( 'featureA', [] ); } /** * @covers ::isFeatureEnabled */ public function testIsFeatureEnabled() { $featureManager = new FeatureManager(); $featureManager->registerSet( 'foo', false ); $featureManager->registerFeature( 'requiresFoo', 'foo' ); $this->assertFalse( $featureManager->isFeatureEnabled( 'requiresFoo' ), 'A feature is disabled when the set that it requires is disabled.' ); // --- $featureManager->registerSet( 'bar', true ); $featureManager->registerSet( 'baz', true ); $featureManager->registerFeature( 'requiresFooBar', [ 'foo', 'bar' ] ); $featureManager->registerFeature( 'requiresBarBaz', [ 'bar', 'baz' ] ); $this->assertFalse( $featureManager->isFeatureEnabled( 'requiresFooBar' ), 'A feature is disabled when at least one set that it requires is disabled.' ); $this->assertTrue( $featureManager->isFeatureEnabled( 'requiresBarBaz' ) ); } /** * @covers ::isFeatureEnabled */ public function testIsFeatureEnabledThrowsExceptionWhenFeatureIsntRegistered() { $this->expectException( \InvalidArgumentException::class ); $featureManager = new FeatureManager(); $featureManager->isFeatureEnabled( 'foo' ); } }