//---------------------------------------------------------------------------
// ŠNikolai V. Shokhirev, 2004-2008  <nikolai@shokhirev.com> http://www.shokhirev.com/nikolai.html
// Test program for the struct implementation of complex numbers
//---------------------------------------------------------------------------
#include <iostream>
#include "Complex.h"
#include "StringUtils.h"        // BoolToStr, ComplexToStr

using namespace std;

int main()
{
  Complex c0 = cmplx(1.0, 2.0);
  Complex c1 = cmplx(1.0, -1.0);


  Complex c2 = c0;
  cout << "c0 = c2 : " << BoolToStr(Equal(c2, c0)) << endl;

  cout << "Cadd(c0, c1) : " << BoolToStr(Equal(Cadd(c0, c1), 2.0, 1.0)) << endl;
  cout << "Cadd(c0, -1.0) : " << BoolToStr(Equal(Cadd(c0, -1.0), 0.0, 2.0)) << endl;
  cout << "Cadd(1.0, c1) : " << BoolToStr(Equal(Cadd(1.0, c1), 2.0, -1.0)) << endl;

  cout << "Cadd(Real(1),Img(2)) : " << BoolToStr(Equal(Cadd(Real(1.0),Img(2.0)), c0)) << endl;

  cout << "Csub(c0, c1) : " <<  BoolToStr(Equal(Csub(c0, c1), 0.0, 3.0)) << endl;
  cout << "Csub(c0, 1.0) : " << BoolToStr(Equal(Csub(c0, 1.0), 0.0, 2.0)) << endl;
  cout << "Csub(3.0, c1) : " << BoolToStr(Equal(Csub(3.0, c1), 3.0, -3.0)) << endl;

  cout << "c2 = conjug(c1) : " << BoolToStr(Equal(conjug(c1), 1.0, 1.0)) << endl;

  c2 = Cmul(c0,conjug(c0));
  cout << "c0*conjug(c0)=mod2(c0) : " << BoolToStr(Equal(c2, mod2(c0), 0.0)) << endl;

  cout << "Cmul(c0, c1) : " <<  BoolToStr(Equal(Cmul(c0, c1), 3.0, 1.0)) << endl;
  cout << "Cmul(c0, 3.0) : " << BoolToStr(Equal(Cmul(c0, 3.0), 3.0, 6.0)) << endl;
  cout << "Cmul(3.0, c1) : " << BoolToStr(Equal(Cmul(3.0, c1), 3.0, -3.0)) << endl;

  cout << "Cdiv(c0, c0) : " << BoolToStr(Equal(Cdiv(c0, c0), 1.0, 0.0)) << endl;

  Complex c3 = Cdiv(c1, c0);  c2 = Cmul(c3, c0);
  cout << "Cdiv(c1, c0) : " << BoolToStr(Equal(c2, c1)) << endl;

  c2 = Cdiv(3.0, c0); c2 = Cmul(c2, c0);
  cout << "(3.0/c0)*c0 : " << BoolToStr(Equal(c2, 3.0, 0.0)) << endl;

  c2 = Cdiv(c0, 3.0); c2 = Cmul(c2, 3.0);
  cout << "(c0/3.0)*3.0 : " << BoolToStr(Equal(c2, c0)) << endl;

  c2 = Csqrt(c0);
  cout << "Csqrt(c0) = " << ComplexToStr(c2);
  c2 = Cmul(c2, c2);
  cout << " : " << BoolToStr(Equal(c2, c0)) << endl;

  return 0;
}