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,71 @@ 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+ Map <String , Object > properties = new HashMap <>();
3608+ properties .put (APIS , false );
3609+ properties .put (API_DOCS , false );
3610+ properties .put (API_TESTS , false );
3611+ properties .put (MODEL_DOCS , false );
3612+ properties .put (MODEL_TESTS , false );
3613+
3614+ Generator generator = new DefaultGenerator ();
3615+ CodegenConfigurator configurator = new CodegenConfigurator ()
3616+ .setInputSpec ("src/test/resources/3_1/issue_21051.yaml" )
3617+ .setGeneratorName ("java" )
3618+ .setAdditionalProperties (properties )
3619+ .setOutputDir (output .getAbsolutePath ());
3620+ ClientOptInput clientOptInput = configurator .toClientOptInput ();
3621+ generator .opts (clientOptInput )
3622+ .generate ();
3623+ System .out .println ("Generator Settings: " + clientOptInput .getGeneratorSettings ());
3624+ String outputPath = output .getAbsolutePath () + "/src/main/java/org/openapitools" ;
3625+ File testModel = new File (outputPath , "/client/model/TestCase.java" );
3626+ String fileContent = Files .readString (testModel .toPath ());
3627+
3628+ System .out .println (fileContent );
3629+ TestUtils .assertValidJavaSourceCode (fileContent );
3630+ CompilationUnit compilationUnit = StaticJavaParser .parse (testModel );
3631+ Map <String , FieldDeclaration > defaultFields = compilationUnit .getType (0 ).getFields ().stream ()
3632+ .collect (Collectors .toMap ((f ) -> f .getVariable (0 ).getName ().asString (), (f ) -> f ));
3633+ //chain method calls for object initialization
3634+ class MethodCallVisitor extends VoidVisitorAdapter <Void > {
3635+ Map <String , Expression > expressionMap = new HashMap <>();
3636+ @ Override
3637+ public void visit (MethodCallExpr n , Void arg ) {
3638+ expressionMap .put (n .getNameAsString (), n .getArgument (0 ));
3639+ if (n .getScope ().isPresent ()) {
3640+ n .getScope ().get ().accept (this , arg );
3641+ }
3642+ }
3643+
3644+ }
3645+ MethodCallVisitor visitor = new MethodCallVisitor ();
3646+ defaultFields .get ("testComplexInlineObject" ).getVariable (0 ).getInitializer ().get ().asMethodCallExpr ()
3647+ .accept (visitor , null );
3648+ Map <String , Expression > expressionMap = visitor .expressionMap ;
3649+ assertTrue (expressionMap .get ("foo" ).isStringLiteralExpr ());
3650+ assertTrue (expressionMap .get ("fooInt" ).isIntegerLiteralExpr ());
3651+ assertTrue (expressionMap .get ("fooLong" ).isLongLiteralExpr ());
3652+ assertTrue (expressionMap .get ("fooBool" ).isBooleanLiteralExpr ());
3653+ assertTrue (expressionMap .get ("fooFloat" ).isDoubleLiteralExpr ());
3654+ assertTrue (expressionMap .get ("fooDouble" ).isDoubleLiteralExpr ());
3655+ assertTrue (expressionMap .containsKey ("_void" ));
3656+
3657+ assertFalse (expressionMap .containsKey ("nonExistentDefault" ));
3658+ assertFalse (expressionMap .containsKey ("nonDefaultedProperty" ));
3659+
3660+ assertTrue (defaultFields .get ("testEmptyInlineObject" ).getVariable (0 ).getInitializer ().get ().isObjectCreationExpr ());
3661+ assertTrue (defaultFields .get ("testNullableEmptyInlineObject" ).getVariable (0 ).getInitializer ().get ().isObjectCreationExpr ());
3662+ assertTrue (defaultFields .get ("testNullableComplexInlineObject" ).getVariable (0 ).getInitializer ().get ().isMethodCallExpr ());
3663+ assertTrue (defaultFields .get ("testEmptyReference" ).getVariable (0 ).getInitializer ().get ().isObjectCreationExpr ());
3664+ assertTrue (defaultFields .get ("testComplexReference" ).getVariable (0 ).getInitializer ().get ().isMethodCallExpr ());
3665+ assertTrue (defaultFields .get ("testNullableEmptyReference" ).getVariable (0 ).getInitializer ().get ().isObjectCreationExpr ());
3666+ assertTrue (defaultFields .get ("testNullableComplexReference" ).getVariable (0 ).getInitializer ().get ().isMethodCallExpr ());
3667+ }
35953668}
0 commit comments