/* dynComplexTest.c */
#include "dynComplex.c"
#include <stdio.h>


void outOfMemoryExit() {
  puts("Out of memory. Program exited.");
  exit(1);
}


/*
 * Test some Complex operations.
 */
int main() {
  Complex *zp1, *zp2, *zp3, *zp4, *zp5;

  zp1 = createComplex(3, 4);
  if (!zp1) outOfMemoryExit();  // tedious but good habit
  printComplex("zp1", zp1);
  puts("");

  zp2 = cloneComplex(zp1);
  if (!zp2) outOfMemoryExit();
  printComplex("zp2",zp2);
  puts("");


  deleteComplex(zp2);
//zp2 = NULL;                   // immediately used again
                                // so we resign from assigning NULL
  zp2 = conjComplex(zp1);
  if (!zp2) outOfMemoryExit();
  printComplex("zp1",zp1);
  puts("");

  zp3 = createComplex(11, 22);
  if (!zp3) outOfMemoryExit();
  zp4 = createComplex(33, 77);
  if (!zp4) outOfMemoryExit();
  zp5 = addComplex(zp3, zp4);
  if (!zp5) outOfMemoryExit();
  printComplex("zp5",zp5);
  puts("");

  deleteComplex(zp3);
  zp3 = createComplex(88.88, 22.22);
  if (!zp3) outOfMemoryExit();
  deleteComplex(zp4);
  zp4 = createComplex(33.33, 33.33);
  if (!zp4) outOfMemoryExit();
  deleteComplex(zp5);
  zp5 = subComplex(zp3, zp4);
  if (!zp5) outOfMemoryExit();
  printComplex("zp5",zp5);
  puts("");

  deleteComplex(zp3);
  zp3 = createComplex(2, 3);
  if (!zp3) outOfMemoryExit();
  deleteComplex(zp4);
  zp4 = createComplex(4, 5);
  if (!zp4) outOfMemoryExit();
  deleteComplex(zp5);
  zp5 = multComplex(zp3, zp4);
  if (!zp5) outOfMemoryExit();
  printComplex("zp5",zp5);
  puts("");

  deleteComplex(zp3);
  zp3 = createComplex(20, 30);
  if (!zp3) outOfMemoryExit();
  deleteComplex(zp5);
  zp5 = divComplex(zp3, zp4);
  if (!zp5) outOfMemoryExit();
  printComplex("zp5",zp5);
  puts("");


  deleteComplex(zp1);

  zp1 = NULL;
  deleteComplex(zp1);
  zp2 = NULL;
  deleteComplex(zp2);
  zp3 = NULL;
  deleteComplex(zp3);
  zp4 = NULL;
  deleteComplex(zp4);
  zp5 = NULL;
  deleteComplex(zp5);

  return 0;
}
