diff options
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java | 23 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/couscous/tests/frontends/java/NodeMatchers.java | 39 |
2 files changed, 59 insertions, 3 deletions
diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java index 7055ecd..72646bc 100644 --- a/src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java +++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java @@ -8,6 +8,7 @@ import org.zwobble.couscous.types.Types; import java.util.List; import static java.util.Collections.emptyList; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.zwobble.couscous.ast.ArrayNode.array; import static org.zwobble.couscous.ast.AssignmentNode.assign; @@ -20,12 +21,12 @@ import static org.zwobble.couscous.ast.LiteralNode.literal; import static org.zwobble.couscous.ast.MethodCallNode.methodCall; import static org.zwobble.couscous.ast.MethodCallNode.staticMethodCall; import static org.zwobble.couscous.ast.Operations.*; -import static org.zwobble.couscous.ast.Operations.unboxInt; import static org.zwobble.couscous.ast.TernaryConditionalNode.ternaryConditional; import static org.zwobble.couscous.ast.ThisReferenceNode.thisReference; import static org.zwobble.couscous.ast.TypeCoercionNode.typeCoercion; import static org.zwobble.couscous.ast.VariableReferenceNode.reference; import static org.zwobble.couscous.tests.frontends.java.JavaReading.*; +import static org.zwobble.couscous.tests.frontends.java.NodeMatchers.*; import static org.zwobble.couscous.types.ParameterizedType.parameterizedType; import static org.zwobble.couscous.util.ExtraLists.list; @@ -74,12 +75,12 @@ public class ExpressionReadingTests { } @Test - public void canReadExplicitFieldReference() { + public void canReadFieldReferenceWithExplicitThis() { canReadFieldReference("this.name"); } @Test - public void canReadImplicitFieldReference() { + public void canReadFieldReferenceWithImplicitThis() { canReadFieldReference("name"); } @@ -100,6 +101,22 @@ public class ExpressionReadingTests { } @Test + public void canReadFieldReferenceWithVariableReceiver() { + ClassNode classNode = readClass( + "private String name;" + + "public String getName() {" + + " Example self = this;" + + " return self.name;" + + "}"); + + ReturnNode returnNode = (ReturnNode) classNode.getMethods().get(0).getBody().get().get(1); + assertThat(returnNode.getValue(), isFieldAccess( + fieldHasReceiver(isVariableReference("self", ScalarType.of("com.example.Example"))), + fieldHasName("name"), + expressionHasType(Types.STRING))); + } + + @Test public void canReadExplicitStaticFieldReferenceWithSimplyNamedClassAsReceiver() { canReadStaticFieldReference("Example.name"); } diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/NodeMatchers.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/NodeMatchers.java new file mode 100644 index 0000000..739d664 --- /dev/null +++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/NodeMatchers.java @@ -0,0 +1,39 @@ +package org.zwobble.couscous.tests.frontends.java; + +import org.hamcrest.Matcher; +import org.zwobble.couscous.ast.*; +import org.zwobble.couscous.types.Type; + +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.equalTo; +import static org.zwobble.couscous.tests.util.ExtraMatchers.hasFeature; +import static org.zwobble.couscous.tests.util.ExtraMatchers.isInstance; + +public class NodeMatchers { + @SafeVarargs + public static Matcher<ExpressionNode> isFieldAccess(Matcher<? super FieldAccessNode>... matchers) { + return isInstance(FieldAccessNode.class, allOf(matchers)); + } + + public static Matcher<ExpressionNode> isVariableReference(String name, Type type) { + return isInstance(VariableReferenceNode.class, allOf( + hasFeature("variable name", node -> node.getReferent().getName(), equalTo(name)), + expressionHasType(type))); + } + + public static Matcher<FieldAccessNode> fieldHasReceiver(Matcher<ExpressionNode> receiverMatcher) { + return hasFeature("receiver", FieldAccessNode::getLeft, isInstanceReceiver(receiverMatcher)); + } + + public static Matcher<Receiver> isInstanceReceiver(Matcher<ExpressionNode> receiverMatcher) { + return isInstance(InstanceReceiver.class, hasFeature("value", receiver -> receiver.getExpression(), receiverMatcher)); + } + + public static Matcher<FieldAccessNode> fieldHasName(String name) { + return hasFeature("field name", FieldAccessNode::getFieldName, equalTo(name)); + } + + public static Matcher<ExpressionNode> expressionHasType(Type type) { + return hasFeature("type", ExpressionNode::getType, equalTo(type)); + } +} |
