code: private ComparisonState compareNodeLists(Iterable<Node> controlSeq,
                                               final XPathContext controlContext,
                                               Iterable<Node> testSeq,
                                               final XPathContext testContext) {
          ComparisonState chain = new OngoingComparisonState();
  
          Iterable<Map.Entry<Node, Node>> matches =
              getNodeMatcher().match(controlSeq, testSeq);
          List<Node> controlList = Linqy.asList(controlSeq);
          List<Node> testList = Linqy.asList(testSeq);
          Set<Node> seen = new HashSet<Node>();
          for (Map.Entry<Node, Node> pair : matches) {
              final Node control = pair.getKey();
              seen.add(control);
              final Node test = pair.getValue();
              seen.add(test);
              int controlIndex = controlList.indexOf(control);
              int testIndex = testList.indexOf(test);
  
              controlContext.navigateToChild(controlIndex);
              testContext.navigateToChild(testIndex);
              try {
                  chain =
                      chain.andThen(new Comparison(ComparisonType.CHILD_NODELIST_SEQUENCE,
                                                   control, getXPath(controlContext),
                                                   Integer.valueOf(controlIndex), getParentXPath(controlContext),
                                                   test, getXPath(testContext),
                                                   Integer.valueOf(testIndex), getParentXPath(testContext)))
                      .andThen(new DeferredComparison() {
                              @Override
                              public ComparisonState apply() {
                                  return compareNodes(control, controlContext,
                                                      test, testContext);
                              }
                          });
              } finally {
                  testContext.navigateToParent();
                  controlContext.navigateToParent();
              }
          }
  
          return chain.andThen(new UnmatchedControlNodes(controlList, controlContext, seen, testContext))
              .andThen(new UnmatchedTestNodes(testList, testContext, seen, controlContext));
      }
docs: Matches nodes of two node lists and invokes compareNode on each pair.
  
  <p>Also performs CHILD_LOOKUP comparisons for each node that
  couldn't be matched to one of the "other" list.</p>