|
28 | 28 | expect($results)->not->toContain(MemoizerContract::class); |
29 | 29 | }); |
30 | 30 |
|
| 31 | +it('excludes abstract classes from interface results', function () { |
| 32 | + $results = ClassFinder::interfaces( |
| 33 | + MemoizerContract::class, |
| 34 | + 'GamingEngine\\ClassFinder\\' |
| 35 | + ); |
| 36 | + |
| 37 | + foreach ($results as $class) { |
| 38 | + expect((new ReflectionClass($class))->isAbstract())->toBeFalse(); |
| 39 | + } |
| 40 | +}); |
| 41 | + |
31 | 42 | it('returns empty array for non-matching namespace', function () { |
32 | 43 | $results = ClassFinder::interfaces( |
33 | 44 | MemoizerContract::class, |
|
67 | 78 |
|
68 | 79 | expect(ClassFinder::getMemoizer())->toBe($custom); |
69 | 80 | }); |
| 81 | + |
| 82 | +it('discovers classes extending a base class', function () { |
| 83 | + $results = ClassFinder::classes( |
| 84 | + ArrayMemoizer::class, |
| 85 | + 'GamingEngine\\ClassFinder\\' |
| 86 | + ); |
| 87 | + |
| 88 | + expect($results)->toBeArray(); |
| 89 | +}); |
| 90 | + |
| 91 | +it('returns empty when no subclasses exist', function () { |
| 92 | + $results = ClassFinder::classes( |
| 93 | + ArrayMemoizer::class, |
| 94 | + 'GamingEngine\\ClassFinder\\' |
| 95 | + ); |
| 96 | + |
| 97 | + expect($results)->toBe([]); |
| 98 | +}); |
| 99 | + |
| 100 | +it('discovers classes with a specific attribute', function () { |
| 101 | + $results = ClassFinder::withAttribute( |
| 102 | + Attribute::class, |
| 103 | + 'GamingEngine\\ClassFinder\\' |
| 104 | + ); |
| 105 | + |
| 106 | + expect($results)->toBeArray(); |
| 107 | +}); |
| 108 | + |
| 109 | +it('scans a sub-namespace within a prefix', function () { |
| 110 | + $results = ClassFinder::interfaces( |
| 111 | + MemoizerContract::class, |
| 112 | + 'GamingEngine\\ClassFinder\\Contracts\\' |
| 113 | + ); |
| 114 | + |
| 115 | + // Contracts namespace only has the interface itself, no implementations |
| 116 | + expect($results)->toBe([]); |
| 117 | +}); |
| 118 | + |
| 119 | +it('returns empty when classes method finds no subclasses', function () { |
| 120 | + $results = ClassFinder::classes( |
| 121 | + MemoizerContract::class, |
| 122 | + 'NonExistent\\' |
| 123 | + ); |
| 124 | + |
| 125 | + expect($results)->toBe([]); |
| 126 | +}); |
| 127 | + |
| 128 | +it('returns empty when withAttribute finds no matches in unknown namespace', function () { |
| 129 | + $results = ClassFinder::withAttribute( |
| 130 | + Attribute::class, |
| 131 | + 'NonExistent\\' |
| 132 | + ); |
| 133 | + |
| 134 | + expect($results)->toBe([]); |
| 135 | +}); |
0 commit comments