/*
 * Created on Mar 12, 2006
 */

public class JUnitTestUtilityMethods {

    static Token openBraceToken = new Token(Type.SYMBOL, "{");
    static Token closeBraceToken = new Token(Type.SYMBOL, "}");

    
    /**
     * Creates a Tree from a given String. The string has the form
     * "root { subtree1 subtree2 ... subtreeN }", where each subtree
     * has the same form.
     * 
     * For example, "+{2 *{3 4}}" yields the tree
     * <pre>    +
     *         / \
     *        2   *
     *           / \
     *          3   4  </pre>
     * 
     * @param input The String to turn into a Tree.
     * @return The newly created Tree.
     */
    public static Tree<Token> tree(String input) {
        assert input != null;
        LogoTokenizer tokenizer = new LogoTokenizer(input);
        assert tokenizer.hasNext();
        Tree<Token> root = new Tree<Token>((Token) tokenizer.next());
        addChildrenIfAny(root, tokenizer);
        return root;
    }
    
    private static void addChildrenIfAny(Tree<Token> root, Tokenizer tokenizer) {
        Token token = (Token) tokenizer.next();
        if (token.equals(openBraceToken)) {
            token = (Token) tokenizer.next();
            while (!token.equals(closeBraceToken)) {
                Tree<Token> child = new Tree<Token>(token);
                root.addChild(child);
                addChildrenIfAny(child, tokenizer);
                token = (Token) tokenizer.next();
            }
            return;
        }
        else { // No children
            tokenizer.putBack(1);
            return;
        }
    }
    
}

