import BinaryTree;
import BinaryTreeCursor;
import BinaryTreePrinter;
import NodeBasedBinaryTree;
import NodeBasedBinaryTreeCursor;
import SimpleOutput;

/**
 * A very simple tester for node-based binary trees.
 */
public class NBBT_Tester {
  // +--------+--------------------------------------------------
  // | Fields |
  // +--------+

  SimpleOutput out;
  NodeBasedBinaryTree tree;
  BinaryTreePrinter printer;

  // +-------------+---------------------------------------------
  // | Constructor |
  // +-------------+

  public NBBT_Tester() {
    out = new SimpleOutput();
    tree = new NodeBasedBinaryTree();
    printer = new BinaryTreePrinter();
  } // NBBT_Tester()

  // +---------+-------------------------------------------------
  // | Methods |
  // +---------+

  /**
   * Summarize the status of the tree.
   */
  public void summarize(String caption) {
    out.println("*** " + caption + " ***");
    out.println("Size: " + tree.size());
    out.println("Depth: " + tree.depth());
    printer.printTree(out, tree);
    out.println();
  } // summarize(String)

  // +---------+-------------------------------------------------
  // | Methods |
  // +---------+

  public static void main(String[] args) {
    // Create the tester.
    NBBT_Tester tester = new NBBT_Tester();
    tester.summarize("Empty Tree");
    // A cursor for use with this tree.
    BinaryTreeCursor cursor;
    // Set the root.
    tester.tree.setRoot("A");
    tester.summarize("A at root");
    // Set the left child.
    cursor = tester.tree.rootCursor();
    cursor.setLeft("B");
    tester.summarize("After setting the left child");
    // Set the right child.
    cursor.setRight("C");
    tester.summarize("After setting the right child");
    // Set the leftmost grandchild.
    cursor.downLeft();
    cursor.setLeft("D");
    tester.summarize("After setting B's left child");
    // Move up and replace A by X
    cursor.up();
    cursor.setValue("X");
    tester.summarize("After setting A to X");
    // Delete the B subtree.
    cursor.downLeft();
    cursor.delete();
    tester.summarize("After deleting B's subtree");
  } // main(String[])
} // class NBBT_Tester

