@@ -170,8 +170,75 @@ public void oneOfWithDiscriminatorTest() throws IOException {
170170
171171 List <File > files = generator .opts (clientOptInput ).generate ();
172172
173- // Verify that oneOf models were generated
174- assertTrue (files .size () > 0 );
173+ // Verify expected oneOf model files are generated
174+ TestUtils .ensureContainsFile (files , output , "src/main/scala/org/openapitools/client/models/FruitReqDisc.scala" );
175+ TestUtils .ensureContainsFile (files , output , "src/main/scala/org/openapitools/client/models/FruitInlineDisc.scala" );
176+ TestUtils .ensureContainsFile (files , output , "src/main/scala/org/openapitools/client/models/FruitOneOfEnumMappingDisc.scala" );
177+
178+ // Verify edge case files (regular traits)
179+ TestUtils .ensureContainsFile (files , output , "src/main/scala/org/openapitools/client/models/FruitOneOfDisc.scala" );
180+ TestUtils .ensureContainsFile (files , output , "src/main/scala/org/openapitools/client/models/FruitType.scala" );
181+
182+ // Read and verify sealed trait with inlined members (common case)
183+ File fruitReqDiscFile = new File (output , "src/main/scala/org/openapitools/client/models/FruitReqDisc.scala" );
184+ String fruitReqDiscContent = Files .readString (fruitReqDiscFile .toPath ());
185+
186+ // Assert sealed trait keyword
187+ assertTrue (fruitReqDiscContent .contains ("sealed trait FruitReqDisc" ),
188+ "FruitReqDisc should be a sealed trait" );
189+
190+ // Assert inlined case classes in same file
191+ assertTrue (fruitReqDiscContent .contains ("case class AppleReqDisc" ),
192+ "AppleReqDisc should be inlined in FruitReqDisc file" );
193+ assertTrue (fruitReqDiscContent .contains ("case class BananaReqDisc" ),
194+ "BananaReqDisc should be inlined in FruitReqDisc file" );
195+
196+ // Assert extends relationship
197+ assertTrue (fruitReqDiscContent .contains ("extends FruitReqDisc" ),
198+ "Inlined classes should extend parent trait" );
199+
200+ // Assert discriminator handling in encoder
201+ assertTrue (fruitReqDiscContent .contains ("case obj: AppleReqDisc => obj.asJson.mapObject" ),
202+ "Encoder should handle discriminator" );
203+ assertTrue (fruitReqDiscContent .contains ("\" fruitType\" " ),
204+ "Discriminator property name should be present" );
205+
206+ // Assert discriminator handling in decoder
207+ assertTrue (fruitReqDiscContent .contains ("cursor.downField(\" fruitType\" )" ),
208+ "Decoder should read discriminator property" );
209+ assertTrue (fruitReqDiscContent .contains ("case \" AppleReqDisc\" => cursor.as[AppleReqDisc]" ),
210+ "Decoder should handle discriminator values" );
211+ assertTrue (fruitReqDiscContent .contains ("DecodingFailure" ),
212+ "Decoder should handle unknown discriminator values" );
213+
214+ // Assert Scala 3 syntax
215+ assertTrue (fruitReqDiscContent .contains ("import cats.syntax.functor.*" ),
216+ "Should use Scala 3 wildcard import syntax" );
217+ assertTrue (fruitReqDiscContent .contains ("given encoder" ),
218+ "Should use Scala 3 given syntax" );
219+
220+ // Read and verify regular trait (edge case)
221+ File fruitOneOfDiscFile = new File (output , "src/main/scala/org/openapitools/client/models/FruitOneOfDisc.scala" );
222+ String fruitOneOfDiscContent = Files .readString (fruitOneOfDiscFile .toPath ());
223+
224+ // Assert regular trait (not sealed) for edge case
225+ assertTrue (fruitOneOfDiscContent .contains ("trait FruitOneOfDisc" ),
226+ "FruitOneOfDisc should be a trait" );
227+ assertFalse (fruitOneOfDiscContent .contains ("sealed trait FruitOneOfDisc" ),
228+ "FruitOneOfDisc should NOT be sealed (edge case)" );
229+
230+ // Verify that inlined members don't have separate files
231+ TestUtils .ensureDoesNotContainFile (files , output , "src/main/scala/org/openapitools/client/models/AppleReqDisc.scala" );
232+ TestUtils .ensureDoesNotContainFile (files , output , "src/main/scala/org/openapitools/client/models/BananaReqDisc.scala" );
233+
234+ // Verify discriminator mapping case
235+ File fruitMappingFile = new File (output , "src/main/scala/org/openapitools/client/models/FruitOneOfEnumMappingDisc.scala" );
236+ String fruitMappingContent = Files .readString (fruitMappingFile .toPath ());
237+
238+ assertTrue (fruitMappingContent .contains ("case \" APPLE\" =>" ),
239+ "Discriminator mapping should use mapped values" );
240+ assertTrue (fruitMappingContent .contains ("case \" BANANA\" =>" ),
241+ "Discriminator mapping should use mapped values" );
175242 }
176243
177244}
0 commit comments