Skip to content

Commit

Permalink
fix setting enum value on meta fields (#942)
Browse files Browse the repository at this point in the history
* fix setting enum value on meta fields

* use coercion to get appropriate type
  • Loading branch information
davidalk authored Mar 4, 2025
1 parent 40ed991 commit 886ff00
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 2 deletions.
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 @@ -283,8 +283,8 @@ class ExpressionGenerator extends RosettaExpressionSwitch<JavaStatementBuilder,
}

def JavaStatementBuilder enumCall(RosettaEnumValue feature, JavaType expectedType) {
val itemType = expectedType.itemType
return JavaExpression.from('''«itemType».«feature.convertValue»''', itemType)
val itemType = expectedType.getItemValueType
JavaExpression.from('''«itemType».«feature.convertValue»''', itemType)
}

def JavaStatementBuilder metaCall(JavaStatementBuilder receiverCode, RMetaAnnotatedType receiverType, RosettaMetaType feature, JavaScope scope) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,13 @@ public <T> JavaParameterizedType<T> 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)) {
Expand Down

0 comments on commit 886ff00

Please sign in to comment.