From 39556c29e0913bdb4e597d4fc629fa101c555959 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 15 Jul 2016 16:21:12 +0100 Subject: Transform subnodes in NodeTransformer --- .../tests/ast/visitors/NodeTransformerTests.java | 57 ++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/test/java/org/zwobble/couscous/tests/ast/visitors/NodeTransformerTests.java (limited to 'src/test/java') diff --git a/src/test/java/org/zwobble/couscous/tests/ast/visitors/NodeTransformerTests.java b/src/test/java/org/zwobble/couscous/tests/ast/visitors/NodeTransformerTests.java new file mode 100644 index 0000000..7e42580 --- /dev/null +++ b/src/test/java/org/zwobble/couscous/tests/ast/visitors/NodeTransformerTests.java @@ -0,0 +1,57 @@ +package org.zwobble.couscous.tests.ast.visitors; + +import org.junit.Test; +import org.zwobble.couscous.ast.OperationNode; +import org.zwobble.couscous.ast.Operations; +import org.zwobble.couscous.ast.Operator; +import org.zwobble.couscous.ast.ReturnNode; +import org.zwobble.couscous.ast.visitors.NodeTransformer; + +import java.util.Optional; + +import static org.junit.Assert.assertEquals; +import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement; +import static org.zwobble.couscous.ast.LiteralNode.literal; +import static org.zwobble.couscous.ast.OperationNode.operation; +import static org.zwobble.couscous.ast.ReturnNode.returns; +import static org.zwobble.couscous.util.ExtraLists.list; + +public class NodeTransformerTests { + @Test + public void subNodesAreTransformedBeforeExpression() { + NodeTransformer transformer = NodeTransformer.builder() + .transformExpression(node -> { + if (node.equals(literal(1))) { + return Optional.of(literal(2)); + } else if (node instanceof OperationNode) { + return Optional.of(operation(Operator.ADD, ((OperationNode) node).getArguments(), node.getType())); + } else { + return Optional.empty(); + } + }) + .build(); + + assertEquals( + Operations.integerAdd(literal(2), literal(3)), + transformer.transformExpression(Operations.integerMultiply(literal(1), literal(3))) + ); + } + @Test + public void subNodesAreTransformedBeforeStatement() { + NodeTransformer transformer = NodeTransformer.builder() + .transformExpression(node -> Optional.of(literal(1))) + .transformStatement(node -> { + if (node instanceof ReturnNode) { + return Optional.of(list(expressionStatement(((ReturnNode) node).getValue()))); + } else { + return Optional.empty(); + } + }) + .build(); + + assertEquals( + list(expressionStatement(literal(1))), + transformer.transformStatement(returns(literal(0))) + ); + } +} -- cgit v1.2.3