@@ -20,14 +20,15 @@ public function setUp(): void
2020 };
2121 }
2222
23- public function testPopulateMethod (): void
23+ public function testBuilder (): void
2424 {
2525 $ className = $ this ->generateClassFromFile (
2626 'BasicSchema.json ' ,
2727 (new GeneratorConfiguration ())->setSerialization (true ),
28+ implicitNull: false ,
2829 );
2930
30- $ this ->includeGeneratedBuilder (1 );
31+ $ this ->assertGeneratedBuilders (1 );
3132
3233 $ builderClassName = $ className . 'Builder ' ;
3334 $ builderObject = new $ builderClassName ();
@@ -43,7 +44,7 @@ public function testPopulateMethod(): void
4344 $ this ->assertEqualsCanonicalizing (['name ' => 'Albert ' , 'age ' => 65 ], $ builderObject ->getRawModelDataInput ());
4445
4546 $ this ->assertSame ('string ' , $ this ->getParameterTypeAnnotation ($ builderObject , 'setName ' ));
46- $ this ->assertSame ('int|null ' , $ this ->getParameterTypeAnnotation ($ builderObject , 'setAge ' ));
47+ $ this ->assertSame ('int ' , $ this ->getParameterTypeAnnotation ($ builderObject , 'setAge ' ));
4748 $ this ->assertSame ('string|null ' , $ this ->getReturnTypeAnnotation ($ builderObject , 'getName ' ));
4849 $ this ->assertSame ('int|null ' , $ this ->getReturnTypeAnnotation ($ builderObject , 'getAge ' ));
4950
@@ -64,15 +65,81 @@ public function testPopulateMethod(): void
6465 $ this ->assertEqualsCanonicalizing (['name ' => 'Albert ' , 'age ' => 65 ], $ validatedObject ->toArray ());
6566 }
6667
67- private function includeGeneratedBuilder (int $ expectedGeneratedBuilders ): void
68+ public function testImplicitNull (): void
69+ {
70+ $ className = $ this ->generateClassFromFile ('BasicSchema.json ' );
71+
72+ $ builderClassName = $ className . 'Builder ' ;
73+ $ builderObject = new $ builderClassName ();
74+
75+ $ this ->assertSame ('string ' , $ this ->getParameterTypeAnnotation ($ builderObject , 'setName ' ));
76+ $ this ->assertSame ('int|null ' , $ this ->getParameterTypeAnnotation ($ builderObject , 'setAge ' ));
77+ $ this ->assertSame ('string|null ' , $ this ->getReturnTypeAnnotation ($ builderObject , 'getName ' ));
78+ $ this ->assertSame ('int|null ' , $ this ->getReturnTypeAnnotation ($ builderObject , 'getAge ' ));
79+ }
80+
81+ public function testNestedObject (): void
82+ {
83+ $ className = $ this ->generateClassFromFile ('NestedObject.json ' );
84+
85+ $ this ->assertGeneratedBuilders (2 );
86+
87+ $ builderClassName = $ className . 'Builder ' ;
88+ $ builderObject = new $ builderClassName ();
89+
90+ $ nestedObjectClassName = null ;
91+ foreach ($ this ->getGeneratedFiles () as $ file ) {
92+ if (str_contains ($ file , 'Address ' )) {
93+ $ nestedObjectClassName = str_replace ('.php ' , '' , basename ($ file ));
94+
95+ break ;
96+ }
97+ }
98+
99+ $ this ->assertNotEmpty ($ nestedObjectClassName );
100+ $ expectedTypeHint = "$ nestedObjectClassName| {$ nestedObjectClassName }Builder|array|null " ;
101+ $ this ->assertSame ($ expectedTypeHint , $ this ->getParameterTypeAnnotation ($ builderObject , 'setAddress ' ));
102+ $ this ->assertSame ($ expectedTypeHint , $ this ->getReturnTypeAnnotation ($ builderObject , 'getAddress ' ));
103+
104+ // test generate nested object from array
105+ $ addressArray = ['street ' => 'Test street ' , 'number ' => 10 ];
106+ $ builderObject ->setAddress ($ addressArray );
107+ $ this ->assertSame ($ addressArray , $ builderObject ->getAddress ());
108+ $ this ->assertSame (['address ' => $ addressArray ], $ builderObject ->getRawModelDataInput ());
109+ $ object = $ builderObject ->validate ();
110+ $ this ->assertSame ('Test street ' , $ object ->getAddress ()->getStreet ());
111+ $ this ->assertSame (10 , $ object ->getAddress ()->getNumber ());
112+
113+ // test generate nested object from nested builder
114+ $ nestedBuilderClassName = $ nestedObjectClassName . 'Builder ' ;
115+ $ nestedBuilderObject = new $ nestedBuilderClassName ();
116+ $ this ->assertSame ('string|null ' , $ this ->getParameterTypeAnnotation ($ nestedBuilderObject , 'setStreet ' ));
117+ $ this ->assertSame ('int|null ' , $ this ->getParameterTypeAnnotation ($ nestedBuilderObject , 'setNumber ' ));
118+ $ this ->assertSame ('string|null ' , $ this ->getReturnTypeAnnotation ($ nestedBuilderObject , 'getStreet ' ));
119+ $ this ->assertSame ('int|null ' , $ this ->getReturnTypeAnnotation ($ nestedBuilderObject , 'getNumber ' ));
120+
121+ $ nestedBuilderObject ->setStreet ('Test street ' )->setNumber (10 );
122+ $ this ->assertSame ($ addressArray , $ nestedBuilderObject ->getRawModelDataInput ());
123+ $ builderObject ->setAddress ($ nestedBuilderObject );
124+ $ this ->assertSame ($ nestedBuilderObject , $ builderObject ->getAddress ());
125+ $ object = $ builderObject ->validate ();
126+ $ this ->assertSame ('Test street ' , $ object ->getAddress ()->getStreet ());
127+ $ this ->assertSame (10 , $ object ->getAddress ()->getNumber ());
128+
129+ // test add validated object
130+ $ nestedObject = new $ nestedObjectClassName ($ addressArray );
131+ $ builderObject ->setAddress ($ nestedObject );
132+ $ this ->assertSame ($ nestedObject , $ builderObject ->getAddress ());
133+ $ object = $ builderObject ->validate ();
134+ $ this ->assertSame ('Test street ' , $ object ->getAddress ()->getStreet ());
135+ $ this ->assertSame (10 , $ object ->getAddress ()->getNumber ());
136+ }
137+
138+ private function assertGeneratedBuilders (int $ expectedGeneratedBuilders ): void
68139 {
69140 $ dir = sys_get_temp_dir () . '/PHPModelGeneratorTest/Models ' ;
70141 $ files = array_filter (scandir ($ dir ), fn (string $ file ): bool => str_ends_with ($ file , 'Builder.php ' ));
71142
72143 $ this ->assertCount ($ expectedGeneratedBuilders , $ files );
73-
74- foreach ($ files as $ file ) {
75- require_once $ dir . DIRECTORY_SEPARATOR . $ file ;
76- }
77144 }
78145}
0 commit comments