Skip to content

Commit

Permalink
Pull the node traversal tests into their own class. Create a common tree
Browse files Browse the repository at this point in the history
creation method for both that uses string nodes so that we can run tree
traversals and assert orderings based on the nodes' string values.

This permits us to have a more complex and realistic tree and avoids the
duplicated boilerplate in creating the tree.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=256432611
  • Loading branch information
nanaze authored and EatingW committed Jul 8, 2019
1 parent 52f22ff commit ff3ce2e
Showing 1 changed file with 52 additions and 25 deletions.
77 changes: 52 additions & 25 deletions test/com/google/javascript/jscomp/NodeUtilTest.java
Expand Up @@ -38,6 +38,7 @@
import static com.google.javascript.rhino.testing.NodeSubject.assertNode;
import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;
import static org.mockito.Mockito.verify;

import com.google.common.base.Joiner;
import com.google.common.base.Predicates;
Expand Down Expand Up @@ -70,7 +71,7 @@
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
import org.mockito.InOrder;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;

/**
Expand Down Expand Up @@ -3541,44 +3542,70 @@ public void testIsBundledGoogModule_onlyIfInScript() {
IR.script(exprResult); // Call this for its side effect of modifying `exprResult`.
assertThat(NodeUtil.isBundledGoogModuleCall(callNode)).isTrue();
}
}

@RunWith(JUnit4.class)
public static class NodeTraversalTests {

@Test
public void testVisitPreOrder() {
Node parent = new Node(Token.GENERIC_TYPE);
Node child1 = new Node(Token.GENERIC_TYPE);
Node child2 = new Node(Token.GENERIC_TYPE);
parent.addChildToBack(child1);
parent.addChildToBack(child2);

NodeUtil.Visitor visitor = Mockito.mock(NodeUtil.Visitor.class);

NodeUtil.visitPreOrder(parent, visitor);

InOrder visitOrder = Mockito.inOrder(visitor);
visitOrder.verify(visitor).visit(parent);
visitOrder.verify(visitor).visit(child1);
visitOrder.verify(visitor).visit(child2);
NodeUtil.visitPreOrder(buildTestTree(), visitor);
assertThat(getNodeStringsFromMockVisitor(visitor))
.containsExactly("A", "B", "C", "D", "E", "F", "G")
.inOrder();
}

@Test
public void testVisitPostOrder() {
Node parent = new Node(Token.GENERIC_TYPE);
Node child1 = new Node(Token.GENERIC_TYPE);
Node child2 = new Node(Token.GENERIC_TYPE);
parent.addChildToBack(child1);
parent.addChildToBack(child2);

NodeUtil.Visitor visitor = Mockito.mock(NodeUtil.Visitor.class);
NodeUtil.visitPostOrder(buildTestTree(), visitor);
assertThat(getNodeStringsFromMockVisitor(visitor))
.containsExactly("C", "D", "B", "F", "G", "E", "A")
.inOrder();
}

NodeUtil.visitPostOrder(parent, visitor);
/**
* Builds a node tree of string {@link com.google.javascript.rhino.Node} with string labels that
* can be used to verify order in tests.
*
* <p>The resultant tree looks like this.
*
* <pre>
* A
* ↙ ↘
* B E
* ↙ ↘ ↙ ↘
* C D F G
* </pre>
*/
private static Node buildTestTree() {
Node a = Node.newString("A");

Node b = Node.newString("B");
b.addChildToBack(Node.newString("C"));
b.addChildToBack(Node.newString("D"));
a.addChildToBack(b);

Node e = Node.newString("E");
e.addChildToBack(Node.newString("F"));
e.addChildToBack(Node.newString("G"));
a.addChildToBack(e);

InOrder visitOrder = Mockito.inOrder(visitor);
visitOrder.verify(visitor).visit(child1);
visitOrder.verify(visitor).visit(child2);
visitOrder.verify(visitor).visit(parent);
return a;
}

private static ImmutableList<String> getNodeStringsFromMockVisitor(
NodeUtil.Visitor mockVisitor) {
ArgumentCaptor<Node> captor = ArgumentCaptor.forClass(Node.class);
verify(mockVisitor, Mockito.atLeastOnce()).visit(captor.capture());
return captor.getAllValues().stream()
.map(n -> n.getString())
.collect(ImmutableList.toImmutableList());
}
}


@RunWith(Parameterized.class)
public static final class ReferencesThisTest {
@Parameters(name = "{0} node in \"{1}\" referencesThis() should be {2}")
Expand Down

0 comments on commit ff3ce2e

Please sign in to comment.