#include <iostream>
#include "Fraction.h"
#include <fstream>
#include <cassert>
#include <string>
using namespace std;
using namespace cs_fraction;
void BasicTest();
void RelationTest();
void BinaryMathTest();
void MathAssignTest();
bool eof(ifstream& in);
string boolString(bool convertMe);
int main()
{
BasicTest();
RelationTest();
BinaryMathTest();
MathAssignTest();
}
void BasicTest()
{
cout << "\n----- Testing basic Fraction creation & printing\n";
cout << "(Fractions should be in reduced form, and as mixed numbers.)\n";
const Fraction fr[] = {Fraction(4, 8), Fraction(-15,21),
Fraction(10), Fraction(12, -3),
Fraction(), Fraction(28, 6), Fraction(0, 12)};
for (int i = 0; i < 7; i++){
cout << "Fraction [" << i <<"] = " << fr[i] << endl;
}
cout << "\n----- Now reading Fractions from file\n";
ifstream in("Fraction.txt");
assert(in);
while (!eof(in)) {
Fraction f;
if (in.peek() == '#') {
in.ignore(128, '\n'); //skip this line, it's a comment
} else {
in >> f;
cout << "Read Fraction = " << f << endl;
}
}
in.close();
}
bool eof(ifstream& in)
{
char ch;
in >> ch;
in.putback(ch);
return !in;
}
string boolString(bool convertMe) {
if (convertMe) {
return "true";
} else {
return "false";
}
}
void RelationTest()
{
cout << "\n----- Testing relational operators between Fractions\n";
const Fraction fr[] = {Fraction(3, 6), Fraction(-15, 30), Fraction(1, 2),
Fraction(1,10), Fraction(0,1), Fraction(0,2)};
for (int i = 0; i < 5; i++) {
cout << "Comparing " << fr[i] << " to " << fr[i+1] << endl;
cout << "\tIs left < right? " << boolString(fr[i] < fr[i+1]) << endl;
cout << "\tIs left <= right? " << boolString(fr[i] <= fr[i+1]) << endl;
cout << "\tIs left > right? " << boolString(fr[i] > fr[i+1]) << endl;
cout << "\tIs left >= right? " << boolString(fr[i] >= fr[i+1]) << endl;
cout << "\tDoes left == right? " << boolString(fr[i] == fr[i+1]) << endl;
cout << "\tDoes left != right ? " << boolString(fr[i] != fr[i+1]) << endl;
}
cout << "\n----- Testing relations between Fractions and integers\n";
Fraction f(-3,6);
int num = 2;
cout << "Comparing " << f << " to " << num << endl;
cout << "\tIs left < right? " << boolString(f < num) << endl;
cout << "\tIs left <= right? " << boolString(f <= num) << endl;
cout << "\tIs left > right? " << boolString(f > num) << endl;
cout << "\tIs left >= right? " << boolString(f >= num) << endl;
cout << "\tDoes left == right? " << boolString(f == num) << endl;
cout << "\tDoes left != right ? " << boolString(f != num) << endl;
Fraction g(1,4);
num = -3;
cout << "Comparing " << num << " to " << g << endl;
cout << "\tIs left < right? " << boolString(num < g) << endl;
cout << "\tIs left <= right? " << boolString(num <= g) << endl;
cout << "\tIs left > right? " << boolString(num > g) << endl;
cout << "\tIs left >= right? " << boolString(num >= g) << endl;
cout << "\tDoes left == right? " << boolString(num == g) << endl;
cout << "\tDoes left != right ? " << boolString(num != g) << endl;
}
void BinaryMathTest()
{
cout << "\n----- Testing binary arithmetic between Fractions\n";
const Fraction fr[] = {Fraction(1, 6), Fraction(1,3),
Fraction(-2,3), Fraction(5), Fraction(-4,3)};
for (int i = 0; i < 4; i++) {
cout << fr[i] << " + " << fr[i+1] << " = " << fr[i] + fr[i+1] << endl;
cout << fr[i] << " - " << fr[i+1] << " = " << fr[i] - fr[i+1] << endl;
cout << fr[i] << " * " << fr[i+1] << " = " << fr[i] * fr[i+1] << endl;
cout << fr[i] << " / " << fr[i+1] << " = " << fr[i] / fr[i+1] << endl;
}
cout << "\n----- Testing arithmetic between Fractions and integers\n";
Fraction f(-1, 2);
int num = 4;
cout << f << " + " << num << " = " << f + num << endl;
cout << f << " - " << num << " = " << f - num << endl;
cout << f << " * " << num << " = " << f * num << endl;
cout << f << " / " << num << " = " << f / num << endl;
Fraction g(-1, 2);
num = 3;
cout << num << " + " << g << " = " << num + g << endl;
cout << num << " - " << g << " = " << num - g << endl;
cout << num << " * " << g << " = " << num * g << endl;
cout << num << " / " << g << " = " << num / g << endl;
}
void MathAssignTest()
{
cout << "\n----- Testing shorthand arithmetic assignment on Fractions\n";
Fraction fr[] = {Fraction(1, 6), Fraction(4),
Fraction(-1,2), Fraction(5)};
for (int i = 0; i < 3; i++) {
cout << fr[i] << " += " << fr[i+1] << " = ";
cout << (fr[i] += fr[i+1]) << endl;
cout << fr[i] << " -= " << fr[i+1] << " = ";
cout << (fr[i] -= fr[i+1]) << endl;
cout << fr[i] << " *= " << fr[i+1] << " = ";
cout << (fr[i] *= fr[i+1]) << endl;
cout << fr[i] << " /= " << fr[i+1] << " = ";
cout << (fr[i] /= fr[i+1]) << endl;
}
cout << "\n----- Testing shorthand arithmetic assignment using integers\n";
Fraction f(-1, 3);
int num = 3;
cout << f << " += " << num << " = ";
cout << (f += num) << endl;
cout << f << " -= " << num << " = ";
cout << (f -= num) << endl;
cout << f << " *= " << num << " = ";
cout << (f *= num) << endl;
cout << f << " /= " << num << " = ";
cout << (f /= num) << endl;
cout << "\n----- Testing increment/decrement prefix and postfix\n";
Fraction g(-1, 3);
cout << "Now g = " << g << endl;
cout << "g++ = " << g++ << endl;
cout << "Now g = " << g << endl;
cout << "++g = " << ++g << endl;
cout << "Now g = " << g << endl;
cout << "g-- = " << g-- << endl;
cout << "Now g = " << g << endl;
cout << "--g = " << --g << endl;
cout << "Now g = " << g << endl;
}