import java.io.*;
import Dizionario.*;
public class TestDizHashHD {

  private static void ClearScreen(){
     for (int i=0;i<25;i++) System.out.println("");
  }

  private static void menu(){
     System.out.println("Test classe DizHashHD...................................");
     System.out.println("");
     System.out.println("1.  Numero elementi nel dizionario");
     System.out.println("2.  elimina tutti gli elementi dal dizionario");
     System.out.println("3.  controlla se il dizionario e' vuoto");
     System.out.println("4.  inserisci una coppia (key,elem) nel dizionario");
     System.out.println("5.  cerca una chiave nel dizionario"); 
     System.out.println("6.  cancella una chiave dal dizionario");
     System.out.println("7.  stampa gli elementi del dizionario");
     System.out.println("8.  fattore di carico della tabella hash");
     System.out.println("9.  totale accessi alla tabella hash");
     System.out.println("10. capacita' attuale della tabella hash");
     System.out.println("11. rehash");

     System.out.println("0.  ESCI");
     System.out.println("");
     System.out.println(".......................................................");
  }

  public static void main(String[] args) {

     int risposta;
     DizHashHD diz = new DizHashHD();
     String testo;
     int chiave;
     boolean b;
     String elem;

     InputStream in=System.in;
     BufferedReader d = new  BufferedReader(new InputStreamReader(in));
     try{
        do {
            ClearScreen();
            menu();
            risposta = Integer.parseInt(d.readLine());
            testo = "";
	    chiave = 0;
            b = true;
            switch (risposta){
              case 1 :// numero elementi
		  System.out.println("Totale elementi: " + diz.size());
		  break;
              case 2 :// clear
		  diz.clear();
       		  System.out.println("Eliminati tutti gli elementi dal dizionario");
		  break;
              case 3 :// dizionario vuoto?
                  if (diz.isEmpty())
       		     System.out.println("Il dizionario e' vuoto");
                  else
		      System.out.println("Il dizionario non e' vuoto");
		  break;
              case 4 ://inserisci elemento
                 try {
                    System.out.print("chiave da inserire = ");
                    chiave = Integer.parseInt(d.readLine());
                    System.out.print("elemento associato = ");
                    testo = d.readLine();
                 } catch(Exception ex) { 
                      System.out.println("eccezione in lettura "+
                                         ex.toString()); 
                      b = false;
                 }
		 if (b && chiave >=0 && testo != null) {
		    if (diz.insert(chiave, testo))
		        System.out.println("coppia (" + chiave + "," + testo + ") inserita nel dizionario");
		    else
		        System.out.println("coppia (" + chiave + "," + testo + ") non inserita");
		 }
                 else		 
		    System.out.println("inserimento elemento non eseguito: chiave negativa o elemento nullo");
		 break;

              case 5 ://cerca la chiave specificata nel dizionario
                 try {
                    System.out.print("chiave = ");
                    chiave = Integer.parseInt(d.readLine());
                 } catch(Exception ex) { 
                      System.out.println("eccezione in lettura  "+
                                         ex.toString()); 
                      b = false;
                 }

		 if (b && chiave >=0) {
		     testo = (String)diz.search(chiave);
                    if (testo != null)
		       System.out.println("elemento associato: " + testo);
                    else
		       System.out.println("chiave non presente nel dizionario");
		 }
                 else		 
		    System.out.println("Ricerca chiave non effettuata: chiave negativa");
		 break;
              case 6 ://cancellazione di una chiave dal dizionario
                 try {
                    System.out.print("chiave da cancellare = ");
                    chiave = Integer.parseInt(d.readLine());
                 } catch(Exception ex) { 
                      System.out.println("eccezione in lettura  "+
                                         ex.toString()); 
                      b = false;
                 }

		 if (b && chiave >=0)
                    if (diz.delete(chiave))
		       System.out.println("chiave rimossa dal dizionario");
                    else
		       System.out.println("chiave non rimossa dal dizionario");
                 else		 
		    System.out.println("rimozione chiave non eseguita: chiave negativa");
		 break;
              case 7 :// stampa elementi del dizionario
       		  System.out.println("Elementi del dizionario: " + 
                                      diz.toString());
		  break;
              case 8 :// fattore di carico della tabella hash
       		  System.out.println("Fattore di carico della tabella: " + 
                                      diz.loadFactor());
		  break;
              case 9 :// totale accessi alla tabella hash
       		  System.out.println("Totale accessi alla tabella: " + 
                                      diz.getStatistics());
		  break;

              case 10 :// capacita' attuale della tabella hash
       		  System.out.println("Capacita' attuale della tabella: " + 
                                      diz.getCapacity());
		  break;
              case 11 :// rehash
		  if (diz.rehash())
		      System.out.println("rehash eseguito con successo");
		  else
		      System.out.println("rehash non eseguito o non andato a buon fine");
		  break;
              default:
                  break;
            }

            System.out.println("(Premere Invio)");
            d.readLine();

        }while (risposta!=0);
     }catch (Exception ex){System.out.println(ex.toString());}
  }

}

