// testComputeSplitTime5.cc
// P. Conrad 03/06/06  for CISC181
// write test cases for the computeSplitTime function

// split out the computeSplitTime function to a separate file


#include <iostream>
#include <iomanip> // for use of setprecision
#include <cmath> // for use of fabs
using namespace std;

// we use "const char * const" instead of just "char *"
// because we want to be able to pass in string literals such as "1:51.0"
// The keyword const means that we cannot modify either the pointer,
// or the data pointed to.


#include "computeSplitTime.h"  // use quotes because it is MY .h file

void testComputeSplitTime(const char * const splitTimePtr, 
			  double expectedResult);

void testSecondsPart(double splitTime,
			  double expectedResult);

void testMinutesPart(double splitTime,
			  int expectedResult);

int main(void)
{
  testComputeSplitTime("1:51.0",111.0);
  testComputeSplitTime("2:00.0",120.0);
  testComputeSplitTime("1:51.9",111.9);  
  testComputeSplitTime("0:00.0",0.0);  



  testSecondsPart(111.0 , 51.0);
  testSecondsPart(120.0 , 0.0);
  testSecondsPart(111.9 , 51.9); // failed... how come?
  testSecondsPart(111.8 , 51.8); 
  testSecondsPart(111.25 , 51.25); 
  testSecondsPart(0.0 , 0.0);
  
  testMinutesPart(111.0 , 1);
  testMinutesPart(120.0 , 2);
  testMinutesPart(111.9 , 1);
  testMinutesPart(0.0 , 0);


  return 0;
}


void testComputeSplitTime(const char * const splitTimePtr, 
			  double expectedResult)
{

  double result = computeSplitTime(splitTimePtr);

  if (result == expectedResult)
    cout << "testComputeSplitTime Passed" << endl;
  else
    cout << "testComputeSplitTime Failed" << endl;

  return; 
}

void testSecondsPart(double splitTime,
			  double expectedResult)

{

  double result = secondsPart(splitTime);

  double diff = result - expectedResult;

  
  // don't test floating point numbers for equality
  // NOT this !!!  if (result == expectedResult)

  const double tolerance = 1E-5; // 1/100000 of a second. 

  if ( fabs(diff) < tolerance)  // instead, check abs value of diff < tolerance
    {
      cout << "testSecondsPart Passed" << endl;
    }
  else
    {
      cout << "testSecondsPart Failed.. actual=" << setprecision (10) << result << " expected =" << setprecision (10) << expectedResult << endl;
      cout << "diff = " << setprecision(10) << diff << endl;
    }
  return; 
}

void testMinutesPart(double splitTime,
		     int expectedResult)

{

  int result = minutesPart(splitTime);

  if (result == expectedResult)
    cout << "testMinutesPart Passed" << endl;
  else
    cout << "testMinutesPart Failed" << endl;

  return; 
}




