import java.io.*;
import BinTrees.*;
public class TestBinaryTree {
   private static void ClearScreen(){
     for (int i=0;i<25;i++)
        System.out.println("");
   }

   public static void menu(){
      System.out.println("Test per BinaryTree.java .............................");
      System.out.println("");
      System.out.println(" 1. numero elementi nell'albero");
      System.out.println(" 2. elimina tutti gli elementi dall'albero");
      System.out.println(" 3. controlla se l'albero e' vuoto");
      System.out.println(" 4. inserisci un elemento come figlio sx del cursore");
      System.out.println(" 5. inserisci un elemento come figlio dx del cursore"); 
      System.out.println(" 6. cancella la foglia su cui si trova il cursore");

      System.out.println(" 7. reset del cursore");
      System.out.println(" 8. sposta il cursore sul figlio sinistro");
      System.out.println(" 9. sposta il cursore sul figlio destro");
      System.out.println("10. sposta il cursore sul padre");
  
      System.out.println("11. stampa pre-order degli elementi dell'albero");
      System.out.println("12. stampa post-order degli elementi dell'albero");
      System.out.println("13. stampa in-order degli elementi dell'albero");
      System.out.println("14. numero di S-nodi");
      System.out.println("15. ritorna true se l'albero e' bilanciato");
      System.out.println("16. nodi interni per livelli da dx a sx");

      System.out.println("");
      System.out.println("0.  ESCI");
      System.out.println("");
      System.out.println("......................................................");
   }

   public static void main(String[] args) {
      int risposta;
      InputStream in=System.in;
      BinaryTree tree = new BinaryTree();
      String s;
      int valore;
      BufferedReader d = new  BufferedReader(new InputStreamReader(in));
      try{
         do {
            ClearScreen();
            menu();
            risposta = Integer.parseInt(d.readLine());
            String testo = "";
	    Integer t = new Integer(0);
	    boolean b = true;
            switch (risposta){
               case 1: // size
		  System.out.println("l'albero ha " + tree.size()+
                       (tree.size()==1?" elemento.":" elementi."));
		  break;

               case 2 :// clear
		  tree.clear();
		  System.out.println("Albero svuotato.");
		  break;
               case 3: // isEmpty
                  System.out.println("L'albero "+(tree.isEmpty()? "" :"non ")+
                       "e' vuoto");
                  break;
               case 4 :// insert sx
                 try {
          	     System.out.print("Valore: ");
 		     t=Integer.valueOf(d.readLine());
                 } catch(Exception ex) { 
                      System.out.println("eccezione in lettura "+
                                         ex.toString()); 
                      b = false;
                 }
		 if (b)
                    if (tree.insertLeft(t))
 		       System.out.println("Inserimento effettuato");
                    else
		       System.out.println("cursore non valido: inserimento non"
			   + " permesso");
		 else
		     System.out.println("Inserimento non eseguito"); 
		  break;
               case 5 :// insert dx
                 try {
          	     System.out.print("Valore: ");
 		     t=Integer.valueOf(d.readLine());
                 } catch(Exception ex) { 
                      System.out.println("eccezione in lettura "+
                                         ex.toString()); 
                      b = false;
                 }
		 if (b)
                    if (tree.insertRight(t))
 		       System.out.println("Inserimento effettuato");
                    else
		       System.out.println("cursore non valido: inserimento non"
			   + " permesso");
		 else
		     System.out.println("Inserimento non eseguito"); 
		  break;
	       case 6: // remove di una foglia
		   if (tree.isEmpty()) {
   		      System.out.println("Albero vuoto!");
		      break;
		   }
    		   t = (Integer)tree.remove();
                   if (t != null)
 		      System.out.println("Elemento rimosso: " + t);
                   else
		      System.out.println("cursore non valido: " +
                      "cancellazione non permessa");

		  break;
	       case 7: // reset
                  tree.reset();
                  System.out.println("Cursore riportato sulla radice");
		  break;
               case 8: // moveLeft
		   if (tree.isEmpty()) {
                     System.out.println("Albero vuoto!");
                     break;
		   }
		  if (tree.moveLeft()) 
                     System.out.println("moveLeft effettuata");
                  else
		     System.out.println("moveLeft non permessa");
                  break;
               case 9: // moveRight
		   if (tree.isEmpty()) {
                     System.out.println("Albero vuoto!");
                     break;
		   }
		  if (tree.moveRight()) 
                     System.out.println("moveRight effettuata");
                  else
		     System.out.println("moveRight non permessa");
                  break;
	       case 10: // moveUp
		   if (tree.isEmpty()) {
                     System.out.println("Albero vuoto!");
                     break;
		   }
		  if (tree.moveUp()) 
                     System.out.println("moveUp effettuata");
                  else
		     System.out.println("moveUp non permessa");
                  break;
	       case 11: // preorder visit 
                     System.out.println(tree.preorderVisit());
                     break;
	       case 12: // post-order visit
                     System.out.println(tree.postorderVisit());
                     break;
	       case 13: // in-order visit  
                     System.out.println(tree.inorderVisit());
                     break;
	       case 14: // numero di S-nodi
  	           System.out.println("numero di S-nodi " + tree.Snumber());
		   break;
	       case 15: // albero bilanciato?
		   if (tree.isBalanced())
		       System.out.println("albero bilanciato");
		   else
		       System.out.println("albero non bilanciato");
		   break;
	       case 16: // nodi interni per livelli da dx a sx
  	           System.out.println(tree.interniDxSx());
		   break;
	       default:
                  break;
            }	    
            if (risposta!=-2) {	       
               System.out.println("(Premere Invio)");	       
               d.readLine();	    
            }         
         }while (risposta!=0);      
      }catch (Exception ex){          
         ex.printStackTrace();          
         System.out.println(ex.toString());      
      }   
   }
}

