Skip to content

Commit

Permalink
Story/3511/with meta address and location (#911)
Browse files Browse the repository at this point in the history
* implement setting address and location

* add test for setting location on object
  • Loading branch information
davidalk authored Jan 30, 2025
1 parent 70e9fb7 commit a0aea37
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,105 @@ public class FunctionGeneratorMetaTest {
@Inject
CodeGeneratorTestHelper generatorTestHelper;

//TODO:canSetMetaLocationOnFunctionBasicOutput
@Test
void canSetMetaLocationOnFunctionObjectOutput() {
var model = """
metaType location string
type Foo:
field string (1..1)
func MyFunc:
output:
result Foo (1..1)
[metadata location]
set result -> field: "someValue"
set result -> location: "someAddress"
""";

var code = generatorTestHelper.generateCode(model);

var classes = generatorTestHelper.compileToClasses(code);
var myFunc = functionGeneratorHelper.createFunc(classes, "MyFunc");

var result = functionGeneratorHelper.invokeFunc(myFunc, FieldWithMeta.class);

var expected = generatorTestHelper.createInstanceUsingBuilder(classes, new RosettaJavaPackages.RootPackage("com.rosetta.test.model.metafields"), "FieldWithMetaFoo", Map.of(
"value", generatorTestHelper.createInstanceUsingBuilder(classes, new RosettaJavaPackages.RootPackage("com.rosetta.test.model"), "Foo", Map.of(
"field", "someValue"
)),
"meta", MetaFields.builder().setLocation("someAddress")
));

assertEquals(expected, result);
}

@Test
void canSetMetaLocationOnFunctionBasicOutput() {
var model = """
metaType location string
func MyFunc:
output:
result string (1..1)
[metadata location]
set result: "someValue"
set result -> location: "someAddress"
""";

var code = generatorTestHelper.generateCode(model);

var classes = generatorTestHelper.compileToClasses(code);
var myFunc = functionGeneratorHelper.createFunc(classes, "MyFunc");

var result = functionGeneratorHelper.invokeFunc(myFunc, FieldWithMeta.class);

var expected = generatorTestHelper.createInstanceUsingBuilder(classes, new RosettaJavaPackages.RootPackage("com.rosetta.model.metafields"), "FieldWithMetaString", Map.of(
"value", "someValue",
"meta", MetaFields.builder().setLocation("someAddress")
));

assertEquals(expected, result);
}

@Test
void canSetMetaAddressOnFunctionObjectOutput() {
var model = """
metaType address string
type Foo:
field string (1..1)
func MyFunc:
output:
result Foo (1..1)
[metadata address]
set result -> field: "someValue"
set result -> address: "someLocation"
""";

var code = generatorTestHelper.generateCode(model);

generatorTestHelper.writeClasses(code, "canSetMetaAddressOnFunctionObjectOutput");

var classes = generatorTestHelper.compileToClasses(code);

var myFunc = functionGeneratorHelper.createFunc(classes, "MyFunc");

var result = functionGeneratorHelper.invokeFunc(myFunc, FieldWithMeta.class);

var expected = generatorTestHelper.createInstanceUsingBuilder(classes, new RosettaJavaPackages.RootPackage("com.rosetta.test.model.metafields"), "ReferenceWithMetaFoo", Map.of(
"value", generatorTestHelper.createInstanceUsingBuilder(classes, new RosettaJavaPackages.RootPackage("com.rosetta.test.model"), "Foo", Map.of(
"field", "someValue"
)),
"reference", Reference.builder().setReference("someLocation")
));

assertEquals(expected, result);
}

@Test
void canSetMetaAddressOnFunctionBasicOutput() {
void canSetAddressOnFunctionBasicOutput() {
var model = """
metaType address string
Expand All @@ -45,7 +139,7 @@ result string (1..1)
""";

var code = generatorTestHelper.generateCode(model);

var classes = generatorTestHelper.compileToClasses(code);


Expand All @@ -63,7 +157,7 @@ result string (1..1)


@Test
void canSetExternalIdOnFunctionObjectOutput() {
void canSetExternalIdOnFunctionBasicOutput() {
var model = """
metaType id string
Expand Down Expand Up @@ -139,7 +233,7 @@ result Foo (1..1)
""";

var code = generatorTestHelper.generateCode(model);

var classes = generatorTestHelper.compileToClasses(code);
var myFunc = functionGeneratorHelper.createFunc(classes, "MyFunc");

Expand All @@ -154,7 +248,7 @@ result Foo (1..1)

@Disabled //TODO: implement setting nested meta
@Test
void canSetMetaOnFunctionObjectOutputAndNestedMetaField() {
void canSetMetaOnFunctionObjectOutputAndNestedBasicMetaField() {
var model = """
type Foo:
a string (1..1)
Expand Down Expand Up @@ -192,7 +286,7 @@ result Foo (1..1)
}

@Test
void canSetMetaSchemeOnFunctionObjectOutput() {
void canSetSchemeOnFunctionObjectOutput() {
var model = """
type Foo:
a string (1..1)
Expand Down Expand Up @@ -225,7 +319,7 @@ result Foo (1..1)
}

@Test
void canSetMetaSchemeOnFunctionBasicOutput() {
void canSetSchemeOnFunctionBasicOutput() {
var model = """
func MyFunc:
output:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -486,7 +486,7 @@ class FunctionGenerator {
expr = JavaExpression.from(
'''
«oldExpr»
«generateMetaWrapperCreator(prop, outputExpressionType)».«IF op.ROperationType == ROperationType.ADD»add«ELSE»set«ENDIF»«seg.toPojoPropertyNames.toFirstUpper»(«it»)''',
«generateMetaWrapperCreator(seg, prop, outputExpressionType)».«IF op.ROperationType == ROperationType.ADD»add«ELSE»set«ENDIF»«seg.toPojoPropertyNames.toFirstUpper»(«it»)''',
JavaPrimitiveType.VOID
)
} else {
Expand All @@ -503,10 +503,12 @@ class FunctionGenerator {
}
}

private def StringConcatenationClient generateMetaWrapperCreator(JavaPojoProperty prop, RJavaWithMetaValue outputExpressionType) {
private def StringConcatenationClient generateMetaWrapperCreator(RFeature seg, JavaPojoProperty prop, RJavaWithMetaValue outputExpressionType) {
switch (outputExpressionType) {
RJavaFieldWithMeta: '''.«prop.getOrCreateName»()'''
RJavaReferenceWithMeta: '''«IF prop.name === "reference"».«prop.getOrCreateName»()«ENDIF»'''
RJavaFieldWithMeta: '''«IF seg instanceof RMetaAttribute».getOrCreateMeta()«ELSE».«prop.getOrCreateName»()«ENDIF»'''
RJavaReferenceWithMeta case seg instanceof RMetaAttribute && seg.name == "address": '''.«prop.getOrCreateName»()'''
RJavaReferenceWithMeta case !(seg instanceof RMetaAttribute): '''.getOrCreateValue()'''
default: ''''''
}
}

Expand All @@ -515,7 +517,7 @@ class FunctionGenerator {
if (seg instanceof RMetaAttribute && outputExpressionType.itemType instanceof RJavaFieldWithMeta) {
(outputExpressionType as JavaPojoInterface).findProperty("meta")
} else if (seg instanceof RMetaAttribute && outputExpressionType.itemType instanceof RJavaReferenceWithMeta) {
(outputExpressionType as JavaPojoInterface).findProperty(toPojoPropertyNames(seg))
(outputExpressionType as JavaPojoInterface).findProperty("reference")
} else if (outputExpressionType.itemType instanceof RJavaWithMetaValue) {
(outputExpressionType as JavaPojoInterface).findProperty("value")
} else {
Expand Down

0 comments on commit a0aea37

Please sign in to comment.