we were given an assgnment to write test drivers for our two previous assgnments: class'Can' and class'Array', where we have to test each function in the program and show all the results and error messages going to a file, and the messages "Command number x completed" and "Testing completed" outputted to the screen. The 'Can' part was pretty easy because it just had a different functions with different names and we only had to test one operator: the input extraction, plus the copy constructor was easy to figure out:
PHP Code:
// Test driver
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include "Can.h"
using namespace std;
int main()
{
int numCommands;
ifstream ins;
ofstream outs;
string inName;
string outName;
string label;
string command;
can cannis;
cout << "Enter the name of input file; press return.\n";
cin >> inName;
ins.open(inName.c_str());
cout << "Enter the name of output file; press return.\n";
cin >> outName;
outs.open(outName.c_str());
cout << "Enter the name of the test run; press return.\n";
cin >> label;
outs << label << endl;
numCommands = 0;
ins >> command;
while (command != "Quit")
{
if (command == "operator")
{
float wt, rad, ht;
numCommands++;
ins >> wt >> rad >> ht;
if ( wt > 0 && rad > 0 && ht > 0)
{
outs << "\nOperator is good" << endl;
outs << wt << rad << ht << endl;
}
else
{
outs << "File contains one or more values of invalid data \n";
}
cout << "Command number " << numCommands << " completed.\n";
}
else if (command == "can")
{
ins >> cannis;
cannis.getWeight();
cannis.getHeight();
cannis.getRadius();
outs << cannis.getWeight() << endl;
outs << cannis.getHeight() << endl;
outs << cannis.getRadius() << endl;
}
else if (command == "gramsProduct")
{
int productVol;
numCommands ++;
ins >> productVol;
cannis.gramsProduct(productVol);
if (productVol < 0 )
outs << "Invalid data in file\n";
else
outs << productVol << endl;
cout << "Command number " << numCommands << " completed.\n";
}
else if (command == "getWeight")
{
numCommands ++;
outs << cannis.getWeight() << endl;
cout << "Command number " << numCommands << " completed.\n";
}
else if (command == "getRadius")
{
outs << cannis.getRadius() << endl;
numCommands ++;
cout << "Command number " << numCommands << " completed.\n";
}
else if (command == "getHeight")
{
outs << cannis.getHeight() << endl;
numCommands ++;
cout << "Command number " << numCommands << " completed.\n";
}
else if (command == "volume")
{
outs << cannis.volume() << endl;
numCommands ++;
cout << "Command number " << numCommands << " completed.\n";
}
ins >> command;
}
outs << "Testing completed.\n";
ins.close();
outs.close();
return 0;
}
PHP Code:
// input file:
operator
6 9 3
can
6 9 3
gramsProduct
-4
getWeight
getRadius
getHeight
volume
operator
6 9 -3
Quit
but the 'Array' program has a lot of different operators, and even though they do different things, they basically all have the same names. not only that, i can't test the Array copy constructor the way i did in Can because of all the operators...or at least...i thin k that's the problem:
PHP Code:
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
#include <cassert>
#include <cstdlib>
#include "array.h"
//
// Default constructor
//
Array::Array()
{
size = 0;
}
//
// Copy constructor
//
Array::Array( const Array& a )
{
for (int j = 0; j < a.size; ++j)
data[j] = a.data[j];
size = a.size;
}
//
// Assignment operator
//
Array& Array:: operator = (const Array& a)
{
for (int j = 0; j < a.size; ++j)
data[j] = a.data[j];
size = a.size;
return *this;
}
//
// Equality operator
//
bool Array:: operator == (const Array& a) const
{
bool equal = size == a.size;
int j = 0;
while (j < size && equal)
if (data[j] != a.data[j])
equal = false;
else
++j;
return equal;
}
//
// Subscript operator with range checking
//
Element& Array:: operator [] (int index)
{
assert( index >= 0 && index < size );
return data[index];
}
// Multiplication operator
Element Array:: operator * (const Array& a)
{
Element product = 0;
assert(size == a.size);
for (int i = 0; i < size; i++)
product += data[i] * a.data[i];
return product;
}
//
// Revised Input extraction operator
//
istream& operator >> (istream& in, Array& a)
{
a.size = MaxArraySize;
int i = 0;
in >> a.data[i];
i++;
while ( i < a.size && !in.fail() && !in.eof())
{
in >> a.data[i];
++i;
}
if(!in.fail() || !in.eof())
{
in >> a.data[i];
if(!in.fail())
{
in.setstate(ios::failbit);
a.size = 0;
}
}
else if(in.eof())
{
in.clear();
a.size = i - 1;
}
else
a.size = 0;
return in;
}
//
// Output insertion operator
//
ostream& operator << (ostream& out, const Array& a)
{
for (int i = 0; i < a.size; ++i)
out << setw( 4 ) << a.data[i];
out << endl;
return out;
}
i can't do:
if (command == " operator")
because they all say operator.
and i can't say:
"operator
operator
operator
etc."
in the input file...
and i have no idea how to test the copy constructor with all those operators...i need help
i hope i'm saying all of this right
i think i gave all the info that i needed to...but if you think i left anything out...then i can show everything else