1717
1818package org .openapitools .codegen .java ;
1919
20+ import com .github .javaparser .StaticJavaParser ;
21+ import com .github .javaparser .ast .CompilationUnit ;
22+ import com .github .javaparser .ast .body .FieldDeclaration ;
23+ import com .github .javaparser .ast .expr .Expression ;
24+ import com .github .javaparser .ast .expr .MethodCallExpr ;
25+ import com .github .javaparser .ast .visitor .*;
2026import com .google .common .collect .ImmutableMap ;
2127import io .swagger .parser .OpenAPIParser ;
2228import io .swagger .v3 .oas .models .OpenAPI ;
6066import static org .assertj .core .api .Assertions .assertThat ;
6167import static org .assertj .core .api .Assertions .entry ;
6268import static org .assertj .core .api .InstanceOfAssertFactories .FILE ;
63- import static org .openapitools .codegen .CodegenConstants .SERIALIZATION_LIBRARY ;
69+ import static org .openapitools .codegen .CodegenConstants .* ;
6470import static org .openapitools .codegen .TestUtils .newTempFolder ;
6571import static org .openapitools .codegen .TestUtils .validateJavaSourceFiles ;
6672import static org .openapitools .codegen .languages .JavaClientCodegen .*;
@@ -3592,4 +3598,74 @@ public void testClassesAreValidJavaOkHttpGson() {
35923598 "public some.pkg.B getsomepkgB() throws ClassCastException {"
35933599 );
35943600 }
3601+
3602+ @ Test (description = "Issue #21051" )
3603+ public void givenComplexObjectHasDefaultValueWhenGenerateThenDefaultAssignmentsAreValid () throws Exception {
3604+ File output = Files .createTempDirectory ("test" ).toFile ().getCanonicalFile ();
3605+ output .deleteOnExit ();
3606+
3607+ JavaClientCodegen codegen = new JavaClientCodegen ();
3608+ codegen .setOutputDir (output .getAbsolutePath ());
3609+ Map <String , Object > properties = new HashMap <>();
3610+ properties .put (APIS , false );
3611+ properties .put (API_DOCS , false );
3612+ properties .put (API_TESTS , false );
3613+ properties .put (MODEL_DOCS , false );
3614+ properties .put (MODEL_TESTS , false );
3615+
3616+ codegen .additionalProperties ().putAll (properties );
3617+ Generator generator = new DefaultGenerator ();
3618+ CodegenConfigurator configurator = new CodegenConfigurator ()
3619+ .setInputSpec ("src/test/resources/3_1/issue_21051.yaml" )
3620+ .setGeneratorName ("java" )
3621+ .setAdditionalProperties (properties )
3622+ .setOutputDir (output .getAbsolutePath ());
3623+ ClientOptInput clientOptInput = configurator .toClientOptInput ();
3624+ generator .opts (clientOptInput )
3625+ .generate ();
3626+ System .out .println ("Generator Settings: " + clientOptInput .getGeneratorSettings ());
3627+ String outputPath = output .getAbsolutePath () + "/src/main/java/org/openapitools" ;
3628+ File testModel = new File (outputPath , "/client/model/Test.java" );
3629+ String fileContent = Files .readString (testModel .toPath ());
3630+
3631+ System .out .println (fileContent );
3632+ TestUtils .assertValidJavaSourceCode (fileContent );
3633+ CompilationUnit compilationUnit = StaticJavaParser .parse (testModel );
3634+ Map <String , FieldDeclaration > defaultFields = compilationUnit .getType (0 ).getFields ().stream ()
3635+ .collect (Collectors .toMap ((f ) -> f .getVariable (0 ).getName ().asString (), (f ) -> f ));
3636+ //chain method calls for object initialization
3637+ class MethodCallVisitor extends VoidVisitorAdapter <Void > {
3638+ Map <String , Expression > expressionMap = new HashMap <>();
3639+ @ Override
3640+ public void visit (MethodCallExpr n , Void arg ) {
3641+ expressionMap .put (n .getNameAsString (), n .getArgument (0 ));
3642+ if (n .getScope ().isPresent ()) {
3643+ n .getScope ().get ().accept (this , arg );
3644+ }
3645+ }
3646+
3647+ }
3648+ MethodCallVisitor visitor = new MethodCallVisitor ();
3649+ defaultFields .get ("testComplexInlineObject" ).getVariable (0 ).getInitializer ().get ().asMethodCallExpr ()
3650+ .accept (visitor , null );
3651+ Map <String , Expression > expressionMap = visitor .expressionMap ;
3652+ assertTrue (expressionMap .get ("foo" ).isStringLiteralExpr ());
3653+ assertTrue (expressionMap .get ("fooInt" ).isIntegerLiteralExpr ());
3654+ assertTrue (expressionMap .get ("fooLong" ).isLongLiteralExpr ());
3655+ assertTrue (expressionMap .get ("fooBool" ).isBooleanLiteralExpr ());
3656+ assertTrue (expressionMap .get ("fooFloat" ).isDoubleLiteralExpr ());
3657+ assertTrue (expressionMap .get ("fooDouble" ).isDoubleLiteralExpr ());
3658+ assertTrue (expressionMap .containsKey ("_void" ));
3659+
3660+ assertFalse (expressionMap .containsKey ("nonExistentDefault" ));
3661+ assertFalse (expressionMap .containsKey ("nonDefaultedProperty" ));
3662+
3663+ assertTrue (defaultFields .get ("testEmptyInlineObject" ).getVariable (0 ).getInitializer ().get ().isObjectCreationExpr ());
3664+ assertTrue (defaultFields .get ("testNullableEmptyInlineObject" ).getVariable (0 ).getInitializer ().get ().isObjectCreationExpr ());
3665+ assertTrue (defaultFields .get ("testNullableComplexInlineObject" ).getVariable (0 ).getInitializer ().get ().isMethodCallExpr ());
3666+ assertTrue (defaultFields .get ("testEmptyReference" ).getVariable (0 ).getInitializer ().get ().isObjectCreationExpr ());
3667+ assertTrue (defaultFields .get ("testComplexReference" ).getVariable (0 ).getInitializer ().get ().isMethodCallExpr ());
3668+ assertTrue (defaultFields .get ("testNullableEmptyReference" ).getVariable (0 ).getInitializer ().get ().isObjectCreationExpr ());
3669+ assertTrue (defaultFields .get ("testNullableComplexReference" ).getVariable (0 ).getInitializer ().get ().isMethodCallExpr ());
3670+ }
35953671}
0 commit comments