Skip to content

Commit

Permalink
fix setting enum value on meta fields
Browse files Browse the repository at this point in the history
  • Loading branch information
davidalk committed Mar 4, 2025
1 parent 40ed991 commit 1755268
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,15 @@ class ExpressionGenerator extends RosettaExpressionSwitch<JavaStatementBuilder,

def JavaStatementBuilder enumCall(RosettaEnumValue feature, JavaType expectedType) {
val itemType = expectedType.itemType
return JavaExpression.from('''«itemType».«feature.convertValue»''', itemType)
return switch itemType {
RJavaWithMetaValue: {
val valueType = itemType.valueType
return JavaExpression.from('''«itemType».builder().setValue(«valueType».«feature.convertValue»)''', itemType)
}
default: {
JavaExpression.from('''«itemType».«feature.convertValue»''', itemType)
}
}
}

def JavaStatementBuilder metaCall(JavaStatementBuilder receiverCode, RMetaAnnotatedType receiverType, RosettaMetaType feature, JavaScope scope) {
Expand Down

0 comments on commit 1755268

Please sign in to comment.