@Before
  public void setUp() {
    String cols[] = new String[2];

    cols[0] = "A";
    cols[1] = "B";

    metadata = new CursorMetadata(cols);
    row = new Object[] {"1", "2"};
    rs =
        MockResultSet.create(
            MockResultSet.cols("A", "B"), MockResultSet.data(MockResultSet.row(row)));
  }
  @Test
  public void testForeachGroupingBasic() throws Exception {
    Cursor cursor =
        ResultSetWrapper.wrap(
            MockResultSet.create(
                cols("A", "B", "C", "D"),
                data(row("A", 1, 3, 1), row("A", 2, 3, 2), row("B", 3, 3, 3), row("B", 4, 3, 4))));

    ForEachNode rootNode = new ForEachNode(null);
    rootNode.setGroupingColumn("a");
    rootNode.setRows(new SimpleExpression("rows"));
    rootNode.setGroupDataObject("group_A");
    ForEachNode aNode = new ForEachNode(null);
    aNode.setRows(new SimpleExpression("group_A"));

    TestingNode rootTestNode = new TestingNode("A");
    rootNode.getChildren().add(rootTestNode);
    rootNode.getChildren().add(aNode);

    TestingNode aTestNode = new TestingNode("B");
    aNode.getChildren().add(aTestNode);

    parameters.put("rows", cursor);

    rootNode.process(context);

    assertEquals(4, aTestNode.getSize());
    verifyResults(aTestNode, 1, 2, 3, 4);

    assertEquals(2, rootTestNode.getSize());
    verifyResults(rootTestNode, "A", "B");
  }
 private void writeObjectsToFile(File file) throws IOException, SQLException {
   FileOutputStream fileOut = new FileOutputStream(file);
   try {
     ObjectOutputStream objectOut = new ObjectOutputStream(fileOut);
     rs =
         MockResultSet.create(
             MockResultSet.cols("A", "B"), MockResultSet.data(MockResultSet.row(row)));
     try {
       objectOut.writeObject(metadata);
       rs.next();
       metadata.writeRow(objectOut, new ResultSetWrapper(rs));
       rs.next();
       metadata.writeRow(objectOut, new ResultSetWrapper(rs));
     } finally {
       objectOut.close();
     }
   } finally {
     fileOut.close();
   }
 }
  @Test
  public void testForeachWithoutParams() throws Exception {
    Cursor cursor =
        ResultSetWrapper.wrap(
            MockResultSet.create(
                cols("A", "B", "C", "D"),
                data(
                    row(1, 11, 3, 1),
                    row(1, 11, 3, 2),
                    row(1, 22, 3, 3),
                    row(1, 22, 3, 4),
                    row(2, 33, 3, 5),
                    row(2, 33, 3, 6),
                    row(2, 44, 3, 7),
                    row(2, 44, 3, 8))));

    ForEachNode rootNode = new ForEachNode(null);
    rootNode.setRows(new SimpleExpression("rows"));
    rootNode.setGroupingColumn("A");
    rootNode.setGroupDataObject("group_A");
    ForEachNode aNode = new ForEachNode(null);
    aNode.setRows(new SimpleExpression("group_A"));
    aNode.setGroupingColumn("B");
    aNode.setGroupDataObject("group_B");
    aNode.setVar("A_row");
    ForEachNode bNode = new ForEachNode(null);
    bNode.setRows(new SimpleExpression("group_B"));
    bNode.setVar("B_row");

    rootNode.getChildren().add(aNode);

    TestingNode aTestNode = new TestingNode("group_A.first() ? A_row.B : \"\"");
    aNode.getChildren().add(aTestNode);
    aNode.getChildren().add(bNode);

    TestingNode bTestNode = new TestingNode("group_B.last() ? B_row.D : \"\"");
    bNode.getChildren().add(bTestNode);

    parameters.put("rows", cursor);

    rootNode.process(context);

    assertEquals(8, bTestNode.getSize());
    verifyResults(bTestNode, "", 2, "", 4, "", 6, "", 8);

    assertEquals(4, aTestNode.getSize());
    verifyResults(aTestNode, 11, "", 33, "");
  }