. namespace core; /** * Tests for the attribute_helper. * * @package core * @category test * @copyright 2024 Andrew Lyons * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @covers \core\attribute_helper */ final class attribute_helper_test extends \advanced_testcase { public static function setUpBeforeClass(): void { require_once(__DIR__ . '/fixtures/attribute_helper_example.php'); } /** * @dataProvider get_attributes_provider */ public function test_get_attributes( int $expectedcount, array $args, ): void { $attributes = attribute_helper::from(...$args); $instances = attribute_helper::instances(...$args); if ($expectedcount) { $this->assertNotEmpty($attributes); $this->assertCount($expectedcount, $attributes); $this->assertCount($expectedcount, $instances); } else { $this->assertEmpty($attributes); $this->assertEmpty($instances); } } public static function get_attributes_provider(): array { return [ [3, [[attribute_helper_example::class]]], [0, [[attribute_helper_example_without::class]]], [3, [[attribute_helper_example::class, 'WITH_ATTRIBUTES']]], [0, [[attribute_helper_example::class, 'WITHOUT_ATTRIBUTE']]], [3, [[attribute_helper_example::class, 'withattributes']]], [0, [[attribute_helper_example::class, 'withoutattributes']]], [3, [[attribute_helper_example::class, 'with_attributes']]], [0, [[attribute_helper_example::class, 'without_attributes']]], [3, [[attribute_helper_enum::class, 'WITH_ATTRIBUTES']]], [0, [[attribute_helper_enum::class, 'WITHOUT_ATTRIBUTE']]], [3, [__NAMESPACE__ . '\\attribute_helper_method_with']], [0, [__NAMESPACE__ . '\\attribute_helper_method_without']], [0, [__NAMESPACE__ . '\\function_not_exists']], [3, [attribute_helper_example::class]], [0, [attribute_helper_example_without::class]], [3, [attribute_helper_example::class . '::WITH_ATTRIBUTES']], [0, [attribute_helper_example::class . '::WITHOUT_ATTRIBUTE']], [3, [attribute_helper_example::class . '::withattributes']], [0, [attribute_helper_example::class . '::withoutattributes']], [3, [attribute_helper_example::class . '::with_attributes']], [0, [attribute_helper_example::class . '::without_attributes']], [3, [attribute_helper_enum::class . '::WITH_ATTRIBUTES']], [0, [attribute_helper_enum::class . '::WITHOUT_ATTRIBUTE']], [2, [[attribute_helper_example::class], attribute_helper_attribute_a::class]], [0, [[attribute_helper_example_without::class], attribute_helper_attribute_a::class]], [2, [[attribute_helper_example::class, 'WITH_ATTRIBUTES'], attribute_helper_attribute_a::class]], [0, [[attribute_helper_example::class, 'WITHOUT_ATTRIBUTE'], attribute_helper_attribute_a::class]], [2, [[attribute_helper_example::class, 'withattributes'], attribute_helper_attribute_a::class]], [0, [[attribute_helper_example::class, 'withoutattributes'], attribute_helper_attribute_a::class]], [2, [[attribute_helper_example::class, 'with_attributes'], attribute_helper_attribute_a::class]], [0, [[attribute_helper_example::class, 'without_attributes'], attribute_helper_attribute_a::class]], [2, [[attribute_helper_enum::class, 'WITH_ATTRIBUTES'], attribute_helper_attribute_a::class]], [0, [[attribute_helper_enum::class, 'WITHOUT_ATTRIBUTE'], attribute_helper_attribute_a::class]], [2, [__NAMESPACE__ . '\\attribute_helper_method_with', attribute_helper_attribute_a::class]], [0, [__NAMESPACE__ . '\\attribute_helper_method_without', attribute_helper_attribute_a::class]], ]; } public function test_get_attributes_references(): void { $attributes = attribute_helper::from(new attribute_helper_example()); $this->assertCount(3, $attributes); $attributes = attribute_helper::from( new attribute_helper_example(), attribute_helper_attribute_a::class, ); $this->assertCount(2, $attributes); $attributes = attribute_helper::from(attribute_helper_enum::WITH_ATTRIBUTES); $this->assertCount(3, $attributes); $instances = attribute_helper::instances(attribute_helper_enum::WITH_ATTRIBUTES); $this->assertCount(3, $instances); $attributes = attribute_helper::from( attribute_helper_enum::WITH_ATTRIBUTES, attribute_helper_attribute_a::class, ); $this->assertCount(2, $attributes); $instances = attribute_helper::instances( attribute_helper_enum::WITH_ATTRIBUTES, attribute_helper_attribute_a::class, ); $this->assertCount(2, $instances); array_map( fn($instance) => $this->assertInstanceOf(attribute_helper_attribute_a::class, $instance), $instances, ); // Singular fetches. $attribute = attribute_helper::one_from( attribute_helper_enum::WITH_ATTRIBUTES, attribute_helper_attribute_b::class, ); $this->assertInstanceOf(\ReflectionAttribute::class, $attribute); $instance = attribute_helper::instance( attribute_helper_enum::WITH_ATTRIBUTES, attribute_helper_attribute_b::class, ); $this->assertInstanceOf(attribute_helper_attribute_b::class, $instance); } public function test_get_attributes_invalid(): void { $this->assertNull(attribute_helper::from(non_existent_class::class)); $this->assertNull(attribute_helper::from([non_existent_class::class])); $this->assertNull(attribute_helper::from([attribute_helper_example::class, 'non_existent'])); $this->assertNull(attribute_helper::from([non_existent_class::class, 'non_existent'])); $this->assertNull(attribute_helper::instances(non_existent_class::class)); $this->assertNull(attribute_helper::instances([non_existent_class::class])); $this->assertNull(attribute_helper::instances([attribute_helper_example::class, 'non_existent'])); $this->assertNull(attribute_helper::instances([non_existent_class::class, 'non_existent'])); // Test singular fetches. $this->assertNull(attribute_helper::one_from(non_existent_class::class)); $this->assertNull(attribute_helper::one_from([non_existent_class::class])); $this->assertNull(attribute_helper::one_from([attribute_helper_example::class, 'non_existent'])); $this->assertNull(attribute_helper::one_from([non_existent_class::class, 'non_existent'])); $this->assertNull(attribute_helper::instance(non_existent_class::class)); $this->assertNull(attribute_helper::instance([non_existent_class::class])); $this->assertNull(attribute_helper::instance([attribute_helper_example::class, 'non_existent'])); $this->assertNull(attribute_helper::instance([non_existent_class::class, 'non_existent'])); } public function test_get_attribute_too_many(): void { $this->expectException(\coding_exception::class); $this->expectExceptionMessage('More than one attribute found'); attribute_helper::one_from(attribute_helper_example::class); } public function test_get_instance_too_many(): void { $this->expectException(\coding_exception::class); $this->expectExceptionMessage('More than one attribute found'); attribute_helper::instance(attribute_helper_example::class); } }