44
55namespace PHPModelGenerator \Tests \PostProcessor ;
66
7+ use FilesystemIterator ;
78use PHPModelGenerator \Model \GeneratorConfiguration ;
89use PHPModelGenerator \ModelGenerator ;
910use PHPModelGenerator \SchemaProcessor \PostProcessor \BuilderClassPostProcessor ;
11+ use PHPModelGenerator \SchemaProcessor \PostProcessor \EnumPostProcessor ;
1012use PHPModelGenerator \Tests \AbstractPHPModelGeneratorTestCase ;
13+ use RecursiveDirectoryIterator ;
14+ use RecursiveIteratorIterator ;
15+ use SplFileInfo ;
1116
1217class BuilderClassPostProcessorTest extends AbstractPHPModelGeneratorTestCase
1318{
@@ -103,26 +108,21 @@ public function testImplicitNull(): void
103108
104109 public function testNestedObject (): void
105110 {
106- $ className = $ this ->generateClassFromFile ('NestedObject.json ' );
111+ $ files = $ this ->generateDirectory (
112+ 'NestedObject ' ,
113+ (new GeneratorConfiguration ())
114+ ->setNamespacePrefix ('MyApp \\Namespace \\' )
115+ ->setOutputEnabled (false )
116+ ->setImplicitNull (true ),
117+ );
107118
119+ $ this ->assertCount (2 , $ files );
108120 $ this ->assertGeneratedBuilders (2 );
109121
110- $ builderClassName = $ className . ' Builder ' ;
122+ $ builderClassName = ' MyApp\Namespace\NestedObjectBuilder ' ;
111123 $ builderObject = new $ builderClassName ();
112124
113- $ nestedObjectClassName = null ;
114- foreach ($ this ->getGeneratedFiles () as $ file ) {
115- if (str_contains ($ file , 'Address ' )) {
116- $ nestedObjectClassName = str_replace ('.php ' , '' , basename ($ file ));
117-
118- break ;
119- }
120- }
121-
122- $ nestedBuilderClassName = $ nestedObjectClassName . 'Builder ' ;
123-
124- $ this ->assertNotEmpty ($ nestedObjectClassName );
125- $ expectedTypeHint = "$ nestedObjectClassName| $ nestedBuilderClassName|array|null " ;
125+ $ expectedTypeHint = "Address|AddressBuilder|array|null " ;
126126 $ this ->assertSame ($ expectedTypeHint , $ this ->getParameterTypeAnnotation ($ builderObject , 'setAddress ' ));
127127 $ this ->assertSame ($ expectedTypeHint , $ this ->getReturnTypeAnnotation ($ builderObject , 'getAddress ' ));
128128
@@ -136,6 +136,7 @@ public function testNestedObject(): void
136136 $ this ->assertSame (10 , $ object ->getAddress ()->getNumber ());
137137
138138 // test generate nested object from nested builder
139+ $ nestedBuilderClassName = 'MyApp\Namespace\Dependencies\AddressBuilder ' ;
139140 $ nestedBuilderObject = new $ nestedBuilderClassName ();
140141 $ this ->assertSame ('string|null ' , $ this ->getParameterTypeAnnotation ($ nestedBuilderObject , 'setStreet ' ));
141142 $ this ->assertSame ('int|null ' , $ this ->getParameterTypeAnnotation ($ nestedBuilderObject , 'setNumber ' ));
@@ -151,12 +152,18 @@ public function testNestedObject(): void
151152 $ this ->assertSame (10 , $ object ->getAddress ()->getNumber ());
152153
153154 // test add validated object
155+ $ nestedObjectClassName = 'MyApp\Namespace\Dependencies\Address ' ;
154156 $ nestedObject = new $ nestedObjectClassName ($ addressArray );
155157 $ builderObject ->setAddress ($ nestedObject );
156158 $ this ->assertSame ($ nestedObject , $ builderObject ->getAddress ());
157159 $ object = $ builderObject ->validate ();
158160 $ this ->assertSame ('Test street ' , $ object ->getAddress ()->getStreet ());
159161 $ this ->assertSame (10 , $ object ->getAddress ()->getNumber ());
162+
163+ // check if the nested objects from a different namespace are correctly imported
164+ $ mainFileContent = file_get_contents (str_replace ('.php ' , 'Builder.php ' , $ files [1 ]));
165+ $ this ->assertStringContainsString ("use $ nestedObjectClassName; " , $ mainFileContent );
166+ $ this ->assertStringContainsString ("use $ nestedBuilderClassName; " , $ mainFileContent );
160167 }
161168
162169 public function testNestedObjectArray (): void
@@ -201,10 +208,37 @@ public function testNestedObjectArray(): void
201208 }
202209 }
203210
211+ public function testEnum (): void
212+ {
213+ $ this ->modifyModelGenerator = static function (ModelGenerator $ generator ): void {
214+ $ generator ->addPostProcessor (new BuilderClassPostProcessor ())->addPostProcessor (new EnumPostProcessor ());
215+ };
216+ $ className = $ this ->generateClassFromFile ('BasicSchema.json ' );
217+
218+ $ builderClassName = $ className . 'Builder ' ;
219+ $ builderObject = new $ builderClassName ();
220+
221+ $ this ->assertSame ('string ' , $ this ->getParameterTypeAnnotation ($ builderObject , 'setName ' ));
222+ $ this ->assertSame ('int|null ' , $ this ->getParameterTypeAnnotation ($ builderObject , 'setAge ' ));
223+ $ this ->assertSame ('string|null ' , $ this ->getReturnTypeAnnotation ($ builderObject , 'getName ' ));
224+ $ this ->assertSame ('int|null ' , $ this ->getReturnTypeAnnotation ($ builderObject , 'getAge ' ));
225+ }
226+
204227 private function assertGeneratedBuilders (int $ expectedGeneratedBuilders ): void
205228 {
206229 $ dir = sys_get_temp_dir () . '/PHPModelGeneratorTest/Models ' ;
207- $ files = array_filter (scandir ($ dir ), fn (string $ file ): bool => str_ends_with ($ file , 'Builder.php ' ));
230+
231+ $ it = new RecursiveIteratorIterator (
232+ new RecursiveDirectoryIterator ($ dir , FilesystemIterator::SKIP_DOTS )
233+ );
234+
235+ $ files = [];
236+ /** @var SplFileInfo $file */
237+ foreach ($ it as $ file ) {
238+ if ($ file ->isFile () && str_ends_with ($ file ->getFilename (), 'Builder.php ' )) {
239+ $ files [] = $ file ->getPathname ();
240+ }
241+ }
208242
209243 $ this ->assertCount ($ expectedGeneratedBuilders , $ files );
210244 }
0 commit comments