// runTests.h  Class for Test-Driven Development
// P. Conrad for CISC220, 06J

// A barebones class for doing test-driven development (TDD)
// in the stule of "Agile" or "eXtreme Programming".
// Inspired by suites such as JUnit for Java TDD


#include "runTests.h"

#include <iostream>
#include <cstring>
#include <string>
using std::string;

void RunTests_C::print(std::ostream & out) const
{
  out << "tests run: " << run 
      << " passed: " << passed
      << " failed: " << failed << std::endl;
}

void RunTests_C::assertEquals(const char * const s1,
		    const char * const s2)
{
  run++;
  if (strcmp(s1, s2) == 0)
    {
      passed++;
      std::cerr << "Passed: assertEquals(\"" <<
	s1 << "\",\"" << s2 << "\")" << std::endl;
    }
  else
    {
      failed++;
      std::cerr << " *Failed: assertEquals(\"" <<
	s1 << "\",\"" << s2 << "\")" << std::endl;
    }
}

void RunTests_C::assertEquals(string s1,
		    const char * const s2)
{
  assertEquals(s1.c_str(),s2);
}


void RunTests_C::assertEquals(const char * const s1,
		    string s2)
{
  assertEquals(s1,s2.c_str());
}


template<typename T>
void RunTests_C::assertEquals(T x, T y)
{
  run++;
  if (x == y)
    {
      passed++;
      std::cerr << "Passed: assertEquals(" << x << "," << y << ")" 
		<< std::endl;
    }
  else
    {
      failed++;
      std::cerr << " *Failed: assertEquals(" << x << "," << y << ")" 
		<< std::endl;
    }
}


void RunTests_C::generateInstances()
{
  // this might not be necessary, but I was having trouble
  // getting the linker to find a version of assertEquals(int, int);

  int x=1; int y=2;
  assertEquals(x,y); // generates a version for ints

  // update: this seems to NOT be necessary with CC, but it DOES
  // seem to be necessary with g++

  char a='x'; char b='x';
  assertEquals(a,b);

  bool c=true; bool d=true;

  assertEquals(c,d);

  string s1,s2;

  assertEquals(s1,s2);

}



