// quadTest.cc  P. Conrad CISC181  06S

#include <iostream>
using std::endl;
using std::cout;

#include <cstdlib> // for exit fn prototype

#include <cmath> // for fabs

#include "quadFunctions.h" // user defined header file

#include "complex.h"

bool approxEquals(double x, double y, double tolerance = 0.005)
{
  return ( fabs(x-y) <= tolerance);
}


bool approxEquals(Complex_C x, Complex_C y, double tolerance = 0.005)
{
  return ( approxEquals(x.getReal(),y.getReal(),tolerance) &&
	   approxEquals(x.getImag(),y.getImag(),tolerance));
}


void testQuadSolver(double a, double b, double c, 
		    Complex_C expectedRoot1, 
		    Complex_C expectedRoot2)
{
  Complex_C actualRoot1 = complexQuadSolve1(a,b,c);
  Complex_C actualRoot2 = complexQuadSolve2(a,b,c);

  if ( approxEquals(actualRoot1,expectedRoot1) &&
       approxEquals(actualRoot2,expectedRoot2) )
    cout << "Passed" << endl;
  else
    cout << "Failed" << endl;

}


void testQuadSolver(double a, double b, double c, 
		    double expectedRoot1, 
		    double expectedRoot2)
{
  double actualRoot1 = quadSolve1(a,b,c);
  double actualRoot2 = quadSolve2(a,b,c);

  if ( approxEquals(actualRoot1,expectedRoot1) &&
       approxEquals(actualRoot2,expectedRoot2) )
    cout << "Passed" << endl;
  else
    cout << "Failed" << endl;

}

int main(void)
{
  testQuadSolver(1.0,-1.0,-2.0, 2.0, -1.0);
  testQuadSolver(1.0, 4.0, 4.0, -2.0, -2.0) ; 

  testQuadSolver(1.0,-1.0,-2.0, Complex_C(2.0, 0.0), Complex_C(-1.0,0.0));
  testQuadSolver(1.0, 4.0, 4.0, Complex_C(-2.0,0.0), Complex_C(-2.0,0.0)); 

  testQuadSolver(1.0, 2.0, 3.0, Complex_C(-1.0,sqrt(2.0)), Complex_C(-1.0,-sqrt(2.0))); 

  return 0;
}




