import java.io.*;

public class HeapTest {
	private final static int MAX_HEAP_SIZE = 200;

	public static void main(String[] args) throws Exception {
		// main() liest Prioritäten von der Standardeingabe und fügt diese 
		// in einen Heap ein.
		// Sobald eine Leerzeile gelesen wird, ist die Eingabe beendet 
		long prioIn = 0;
		Heap heap = new Heap(MAX_HEAP_SIZE);
		int cnt = 0;
		
		// Eingabestream bereitstellen
      	BufferedReader stdin =
        	new BufferedReader(
         	 new InputStreamReader(System.in)
			);

		// Prioritaeten einlesen
		System.out.println("Willkommen zum HeapTest!");
		
		try {
			Heap h = new Heap(2);
			h.insert("1", 1);
			h.insert("0", 0);
			if(2 != h.size()) {
				System.out.println("Die Methode size() ist nicht richtig implementiert.");
				System.out.println("=> In einen Heap sind zwei Elemente eingefuegt worden,");
				System.out.println("=> size() gibt als Resultat jedoch " + h.size() + " zurueck!");
				System.exit(0);
			}
			if(!h.isFull()){
				System.out.println("Die Methode isFull() ist nicht richtig implementiert.");
				System.out.println("=> In einen Heap(2) sind zwei Elemente eingefuegt worden,");
				System.out.println("=> isFull() gibt als Resultat jedoch false zurueck!");
				System.exit(0);
			}
		}
		catch(QueueFullException e){
			System.out.println("Der Konstruktor ist nicht richtig definiert, denn");
			System.out.println("wenn in ein Objekt Heap(2) zwei Elemente eingefuegt");
			System.out.println("werden so wird eine QueueFullException geworfen.");
			throw e;
		}
		catch(IndexOutOfBoundsException e){
			System.out.println("Die Methode insert(...) enthaelt einen Fehler; es");
			System.out.println("ist eine IndexOutOfBoundsException geworfen worden;");
			System.out.println("offensichtlich wird ausserhalb des Feldes zugegriffen.");
			throw e;
		}
		
		System.out.println("Prioritaeten durch ENTER getrennt eingeben und");
		System.out.println("mit Leerzeile die Eingabe beenden.");
		String str = "";
		do {
			try {
				str = stdin.readLine();
				if(!str.equals("")){
					prioIn = Long.parseLong(str);
					System.out.println("insert(" + prioIn+ ")");
					heap.insert(new Long(prioIn),prioIn);
					cnt++;
				}
			} 
			catch (IOException e) {
				System.err.println("Fehler: Kann nicht von stdin lesen! (" + e + ")");
			} 
			catch (NumberFormatException e) {	
				System.err.println("Warnung: Eingabe ist nicht vom Typ 'long'"
					+ "und wird deshalb ignoriert (" + e + ").");
			}
		}
		while(!str.equals("") && cnt < MAX_HEAP_SIZE);
		
		// Heap als Array mit Prioritaeten ausgeben	zur Kontrolle auf stdout		
		long[] longHeap = heap.toLongArray();

		System.out.println("Heap als Array dargestellt:");
		cnt = 0;
		while (cnt < longHeap.length) {
			System.out.print(longHeap[cnt] + " ");
			cnt++;
		}
		
		// Elemente aufsteigend sortiert ausgeben
		System.out.println("");
		System.out.println("Nach Prioritaeten sortiert:");
		
		long old = Long.MIN_VALUE;
		boolean ok = true;
		while (!heap.isEmpty()) {
			Long l = (Long) heap.deleteMin();
			System.out.print(l + " ");
			ok = ok && (old <= (old=l.longValue()));
		}
		System.out.println();
		if(!ok)
			System.out.println("Die Ordnungseigenschaft ist nicht erfuellt!!!");
	}

} 
