@@ -65,6 +65,29 @@ public function testBuilder(): void
6565 $ this ->assertEqualsCanonicalizing (['name ' => 'Albert ' , 'age ' => 65 ], $ validatedObject ->toArray ());
6666 }
6767
68+ /**
69+ * @dataProvider validationMethodDataProvider
70+ */
71+ public function testInvalidBuilderDataThrowsAnExceptionOnValidate (GeneratorConfiguration $ configuration ): void
72+ {
73+ $ className = $ this ->generateClassFromFile ('BasicSchema.json ' , $ configuration );
74+
75+ $ builderClassName = $ className . 'Builder ' ;
76+ $ builderObject = new $ builderClassName ();
77+
78+ $ builderObject ->setName ('Al ' )->setAge (-2 );
79+
80+ $ this ->expectValidationErrorRegExp (
81+ $ configuration ,
82+ [
83+ '/Value for name must not be shorter than 5/ ' ,
84+ '/Value for age must not be smaller than 0/ '
85+ ],
86+ );
87+
88+ $ builderObject ->validate ();
89+ }
90+
6891 public function testImplicitNull (): void
6992 {
7093 $ className = $ this ->generateClassFromFile ('BasicSchema.json ' );
@@ -96,8 +119,10 @@ public function testNestedObject(): void
96119 }
97120 }
98121
122+ $ nestedBuilderClassName = $ nestedObjectClassName . 'Builder ' ;
123+
99124 $ this ->assertNotEmpty ($ nestedObjectClassName );
100- $ expectedTypeHint = "$ nestedObjectClassName| { $ nestedObjectClassName } Builder |array|null " ;
125+ $ expectedTypeHint = "$ nestedObjectClassName| $ nestedBuilderClassName |array|null " ;
101126 $ this ->assertSame ($ expectedTypeHint , $ this ->getParameterTypeAnnotation ($ builderObject , 'setAddress ' ));
102127 $ this ->assertSame ($ expectedTypeHint , $ this ->getReturnTypeAnnotation ($ builderObject , 'getAddress ' ));
103128
@@ -111,7 +136,6 @@ public function testNestedObject(): void
111136 $ this ->assertSame (10 , $ object ->getAddress ()->getNumber ());
112137
113138 // test generate nested object from nested builder
114- $ nestedBuilderClassName = $ nestedObjectClassName . 'Builder ' ;
115139 $ nestedBuilderObject = new $ nestedBuilderClassName ();
116140 $ this ->assertSame ('string|null ' , $ this ->getParameterTypeAnnotation ($ nestedBuilderObject , 'setStreet ' ));
117141 $ this ->assertSame ('int|null ' , $ this ->getParameterTypeAnnotation ($ nestedBuilderObject , 'setNumber ' ));
@@ -135,6 +159,48 @@ public function testNestedObject(): void
135159 $ this ->assertSame (10 , $ object ->getAddress ()->getNumber ());
136160 }
137161
162+ public function testNestedObjectArray (): void
163+ {
164+ $ className = $ this ->generateClassFromFile ('NestedObjectArray.json ' );
165+
166+ $ this ->assertGeneratedBuilders (2 );
167+
168+ $ builderClassName = $ className . 'Builder ' ;
169+ $ builderObject = new $ builderClassName ();
170+
171+ $ nestedObjectClassName = null ;
172+ foreach ($ this ->getGeneratedFiles () as $ file ) {
173+ if (str_contains ($ file , 'Itemofarray ' )) {
174+ $ nestedObjectClassName = str_replace ('.php ' , '' , basename ($ file ));
175+
176+ break ;
177+ }
178+ }
179+
180+ $ nestedBuilderClassName = $ nestedObjectClassName . 'Builder ' ;
181+
182+ $ this ->assertNotEmpty ($ nestedObjectClassName );
183+ $ expectedTypeHint = "{$ nestedObjectClassName }[]| {$ nestedBuilderClassName }[]|array|null " ;
184+ $ this ->assertSame ($ expectedTypeHint , $ this ->getParameterTypeAnnotation ($ builderObject , 'setAddressList ' ));
185+ $ this ->assertSame ($ expectedTypeHint , $ this ->getReturnTypeAnnotation ($ builderObject , 'getAddressList ' ));
186+
187+ $ builderObject ->setAddressList ([
188+ ['street ' => 'Test street 0 ' , 'number ' => 10 ],
189+ (new $ nestedBuilderClassName ())->setStreet ('Test street 1 ' )->setNumber (11 ),
190+ new $ nestedObjectClassName (['street ' => 'Test street 2 ' , 'number ' => 12 ]),
191+ ]);
192+
193+ $ object = $ builderObject ->validate ();
194+
195+ $ this ->assertCount (3 , $ object ->getAddressList ());
196+
197+ for ($ i = 0 ; $ i <= 2 ; $ i ++) {
198+ $ this ->assertInstanceOf ($ nestedObjectClassName , $ object ->getAddressList ()[$ i ]);
199+ $ this ->assertSame ("Test street {$ i }" , $ object ->getAddressList ()[$ i ]->getStreet ());
200+ $ this ->assertSame (10 + $ i , $ object ->getAddressList ()[$ i ]->getNumber ());
201+ }
202+ }
203+
138204 private function assertGeneratedBuilders (int $ expectedGeneratedBuilders ): void
139205 {
140206 $ dir = sys_get_temp_dir () . '/PHPModelGeneratorTest/Models ' ;
0 commit comments