From 886ff00cbfb5878070ec5481d7d92ad6cde1fb20 Mon Sep 17 00:00:00 2001 From: David Al-Kanani Date: Tue, 4 Mar 2025 15:51:31 +0000 Subject: [PATCH] fix setting enum value on meta fields (#942) * fix setting enum value on meta fields * use coercion to get appropriate type --- .../function/FunctionGeneratorMetaTest.java | 79 +++++++++++++++++++ .../java/expression/ExpressionGenerator.xtend | 4 +- .../generator/java/types/JavaTypeUtil.java | 7 ++ 3 files changed, 88 insertions(+), 2 deletions(-) diff --git a/rosetta-integration-tests/src/test/java/com/regnosys/rosetta/generator/java/function/FunctionGeneratorMetaTest.java b/rosetta-integration-tests/src/test/java/com/regnosys/rosetta/generator/java/function/FunctionGeneratorMetaTest.java index 745cb9fc0..9a202d7a9 100644 --- a/rosetta-integration-tests/src/test/java/com/regnosys/rosetta/generator/java/function/FunctionGeneratorMetaTest.java +++ b/rosetta-integration-tests/src/test/java/com/regnosys/rosetta/generator/java/function/FunctionGeneratorMetaTest.java @@ -29,6 +29,85 @@ public class FunctionGeneratorMetaTest { FunctionGeneratorHelper functionGeneratorHelper; @Inject CodeGeneratorTestHelper generatorTestHelper; + + + @Test + void canSetEnumOnReferenceWithMeta() { + var model = """ + metaType reference string + + enum MyEnum: + A + B + C + + type Foo: + myEnumField MyEnum (1..1) + [metadata reference] + + func MyFunc: + output: + foo Foo (1..1) + + set foo -> myEnumField: MyEnum -> B + """; + + + var code = generatorTestHelper.generateCode(model); + + var classes = generatorTestHelper.compileToClasses(code); + + var myFunc = functionGeneratorHelper.createFunc(classes, "MyFunc"); + + var result = functionGeneratorHelper.invokeFunc(myFunc, RosettaModelObject.class); + + var expected = generatorTestHelper.createInstanceUsingBuilder(classes, new RosettaJavaPackages.RootPackage("com.rosetta.test.model"), "Foo", Map.of( + "myEnumField", generatorTestHelper.createInstanceUsingBuilder(classes, new RosettaJavaPackages.RootPackage("com.rosetta.test.model.metafields"), "ReferenceWithMetaMyEnum", Map.of( + "value", generatorTestHelper.createEnumInstance(classes, "MyEnum", "B") + )) + + )); + + assertEquals(expected, result); + } + + @Test + void canSetEnumOnFieldWithMeta() { + var model = """ + enum MyEnum: + A + B + C + + type Foo: + myEnumField MyEnum (1..1) + [metadata scheme] + + func MyFunc: + output: + foo Foo (1..1) + + set foo -> myEnumField: MyEnum -> B + """; + + + var code = generatorTestHelper.generateCode(model); + + var classes = generatorTestHelper.compileToClasses(code); + + var myFunc = functionGeneratorHelper.createFunc(classes, "MyFunc"); + + var result = functionGeneratorHelper.invokeFunc(myFunc, RosettaModelObject.class); + + var expected = generatorTestHelper.createInstanceUsingBuilder(classes, new RosettaJavaPackages.RootPackage("com.rosetta.test.model"), "Foo", Map.of( + "myEnumField", generatorTestHelper.createInstanceUsingBuilder(classes, new RosettaJavaPackages.RootPackage("com.rosetta.test.model.metafields"), "FieldWithMetaMyEnum", Map.of( + "value", generatorTestHelper.createEnumInstance(classes, "MyEnum", "B") + )) + + )); + + assertEquals(expected, result); + } @Test void canSetSingleCardinalityMetaToListOfMetaUsingConstructor() { diff --git a/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/java/expression/ExpressionGenerator.xtend b/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/java/expression/ExpressionGenerator.xtend index 153295332..c8beab798 100644 --- a/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/java/expression/ExpressionGenerator.xtend +++ b/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/java/expression/ExpressionGenerator.xtend @@ -283,8 +283,8 @@ class ExpressionGenerator extends RosettaExpressionSwitch JavaParameterizedType wrapExtendsIfNotFinal(JavaGenericTypeDeclara public boolean hasWildcardArgument(JavaType t) { return t instanceof JavaParameterizedType && ((JavaParameterizedType) t).getArguments().get(0) instanceof JavaWildcardTypeArgument; } + public JavaType getItemValueType(JavaType t) { + JavaType itemType = getItemType(t); + if (itemType instanceof RJavaWithMetaValue) { + return ((RJavaWithMetaValue) itemType).valueType; + } + return itemType; + } public JavaType getItemType(JavaType t) { if (isWrapper(t)) {