// testHeap.cc   P. Conrad CISC220 06J
// test-driven development for a min-heap class

#include <iostream>
#include <cassert>
using namespace std;

#include "runTests.h"

#include "heap.h"

int main(void)
{

  RunTests_C test;
  Heap_C a;  // invokes default constructor


  test.assertEquals(a.parentOf(1),0);
  test.assertEquals(a.leftChildOf(0),1);
  test.assertEquals(a.rightChildOf(0),2);

  test.assertEquals(a.isEmpty(),true);
  test.assertEquals(a.isFull(),false);

  a.add(3);
  test.assertEquals(a.isEmpty(),false);
  test.assertEquals(a.deleteMin(),3);
  test.assertEquals(a.isEmpty(),true);

  a.add(3);
  a.add(2);
  test.assertEquals(a.isEmpty(),false);
  test.assertEquals(a.deleteMin(),2);
  test.assertEquals(a.deleteMin(),3);
  test.assertEquals(a.isEmpty(),true);

  a.add(2);
  a.add(3);
  test.assertEquals(a.isEmpty(),false);
  test.assertEquals(a.deleteMin(),2);
  test.assertEquals(a.deleteMin(),3);
  test.assertEquals(a.isEmpty(),true);

  a.add(2);
  a.add(1);
  a.add(3);
  test.assertEquals(a.isEmpty(),false);
  test.assertEquals(a.deleteMin(),1);
  test.assertEquals(a.deleteMin(),2);
  test.assertEquals(a.deleteMin(),3);
  test.assertEquals(a.isEmpty(),true);

  a.add(2);
  a.add(1);
  a.add(2);
  a.add(3);
  test.assertEquals(a.isEmpty(),false);
  test.assertEquals(a.deleteMin(),1);
  test.assertEquals(a.deleteMin(),2);
  test.assertEquals(a.deleteMin(),2);
  test.assertEquals(a.deleteMin(),3);
  test.assertEquals(a.isEmpty(),true);

  a.add(100);
  a.add(1);
  a.add(2);
  test.assertEquals(a.deleteMin(),1);
  a.add(62);
  a.add(12);
  a.add(2);
  a.add(13);
  test.assertEquals(a.isEmpty(),false); 
  test.assertEquals(a.deleteMin(),2);
  test.assertEquals(a.deleteMin(),2);
  test.assertEquals(a.deleteMin(),12);
  test.assertEquals(a.deleteMin(),13);
  test.assertEquals(a.deleteMin(),62);
  test.assertEquals(a.deleteMin(),100);
  test.assertEquals(a.isEmpty(),true);

  a.testPrivateMemberFunctions(test);
  
  test.print();
  test.finish();

}





