@@ -134,5 +134,82 @@ public function testCleanGeneratedFiles(): void
134134 $ deleted = $ this ->service ->clean ($ config );
135135 $ this ->assertGreaterThan (0 , $ deleted );
136136 }
137- }
138137
138+ public function testNoBuilderBuilderGeneratedWhenOutputDirIsAlsoScanned (): void
139+ {
140+ $ config = PhpBuilderGeneratorConfig::configure ()
141+ ->scanDirectory (__DIR__ . '/../Fixtures ' )
142+ ->outputDir ($ this ->outputDir );
143+
144+ $ firstPass = $ this ->service ->generateBuilders ($ config );
145+ $ this ->assertGreaterThan (0 , $ firstPass );
146+
147+ $ firstPassBuilderFiles = $ this ->findFilesRecursively ($ this ->outputDir , 'Builder.php ' );
148+ $ this ->assertNotEmpty ($ firstPassBuilderFiles , 'First pass should produce Builder files ' );
149+
150+ $ config2 = PhpBuilderGeneratorConfig::configure ()
151+ ->scanDirectory (__DIR__ . '/../Fixtures ' )
152+ ->scanDirectory ($ this ->outputDir )
153+ ->outputDir ($ this ->outputDir );
154+
155+ $ this ->service ->generateBuilders ($ config2 );
156+
157+ $ builderBuilderFiles = $ this ->findFilesRecursively ($ this ->outputDir , 'BuilderBuilder.php ' );
158+ $ this ->assertEmpty (
159+ $ builderBuilderFiles ,
160+ 'No *BuilderBuilder files should be generated when outputDir is also scanned: ' .
161+ implode (', ' , $ builderBuilderFiles )
162+ );
163+ }
164+
165+ public function testCustomBuilderSuffixIsRespectedWhenFilteringScannedClasses (): void
166+ {
167+ $ config = PhpBuilderGeneratorConfig::configure ()
168+ ->scanDirectory (__DIR__ . '/../Fixtures ' )
169+ ->outputDir ($ this ->outputDir )
170+ ->builderSuffix ('Factory ' );
171+
172+ $ firstPass = $ this ->service ->generateBuilders ($ config );
173+ $ this ->assertGreaterThan (0 , $ firstPass );
174+
175+ $ factoryFiles = $ this ->findFilesRecursively ($ this ->outputDir , 'Factory.php ' );
176+ $ this ->assertNotEmpty ($ factoryFiles , 'First pass should produce *Factory files ' );
177+
178+ $ config2 = PhpBuilderGeneratorConfig::configure ()
179+ ->scanDirectory (__DIR__ . '/../Fixtures ' )
180+ ->scanDirectory ($ this ->outputDir )
181+ ->outputDir ($ this ->outputDir )
182+ ->builderSuffix ('Factory ' );
183+
184+ $ this ->service ->generateBuilders ($ config2 );
185+
186+ $ factoryFactoryFiles = $ this ->findFilesRecursively ($ this ->outputDir , 'FactoryFactory.php ' );
187+ $ this ->assertEmpty (
188+ $ factoryFactoryFiles ,
189+ 'No *FactoryFactory files should be generated: ' . implode (', ' , $ factoryFactoryFiles )
190+ );
191+ }
192+
193+ /**
194+ * @return string[]
195+ */
196+ private function findFilesRecursively (string $ dir , string $ suffix ): array
197+ {
198+ if (!is_dir ($ dir )) {
199+ return [];
200+ }
201+
202+ $ result = [];
203+ $ iterator = new \RecursiveIteratorIterator (
204+ new \RecursiveDirectoryIterator ($ dir , \FilesystemIterator::SKIP_DOTS )
205+ );
206+
207+ foreach ($ iterator as $ file ) {
208+ if ($ file ->isFile () && str_ends_with ($ file ->getFilename (), $ suffix )) {
209+ $ result [] = $ file ->getPathname ();
210+ }
211+ }
212+
213+ return $ result ;
214+ }
215+ }
0 commit comments