add custom testcases and handle division by 0
This commit is contained in:
parent
dc1d287204
commit
93552eb95a
@ -0,0 +1,8 @@
|
||||
Sandipsinh Rathod
|
||||
sdr5549@psu.edu
|
||||
|
||||
I have compiled in one of the machines of SUN LAB with the command:
|
||||
|
||||
g++ -ansi -pedantic -Wall main.cxx exact_number.cxx -o exact_number
|
||||
|
||||
./exact_number
|
@ -18,6 +18,9 @@ ExactNumber::ExactNumber(){
|
||||
}
|
||||
|
||||
ExactNumber::ExactNumber(int n, int d){
|
||||
if (!d) {
|
||||
throw logic_error("Denominator can not be zero.");
|
||||
}
|
||||
numer = n;
|
||||
denom = d;
|
||||
simplify();
|
||||
@ -62,6 +65,9 @@ ExactNumber& ExactNumber::operator/=(const ExactNumber& rhs) {
|
||||
numer *= rhs.denom;
|
||||
denom *= rhs.numer;
|
||||
simplify();
|
||||
if (!denom) {
|
||||
throw logic_error("Division by 0");
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
255
main.cxx
255
main.cxx
@ -1,7 +1,16 @@
|
||||
// Name: Sandipsinh Rathod
|
||||
// Email: sdr5549@psu.edu
|
||||
// Class: CMPSC 330
|
||||
// Program Exact Number
|
||||
// Current Date: 4/11/24 4:25 PM
|
||||
// Due Date: 5/11/24
|
||||
//
|
||||
// Description:
|
||||
// Implementation for +, -, *, /, =, +=, -=, *=, /=, ==, !=, <, >, <=, >= etc.
|
||||
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <limits>
|
||||
#include <cmath>
|
||||
#include <string>
|
||||
#include "exact_number.h"
|
||||
|
||||
@ -274,33 +283,16 @@ int main() {
|
||||
|
||||
// operator/ involving 0
|
||||
num_tests++;
|
||||
n4 = n5 / n6;
|
||||
try {
|
||||
n4 = n5 / n6;
|
||||
if (static_cast<double>(n4) != ExactNumber(1, 0))
|
||||
throw error_msg("operator/ involving 0", n4, 0.0 / 1.0);
|
||||
}
|
||||
catch (string m) {
|
||||
cout << m << endl;
|
||||
num_failed++;
|
||||
catch (const exception& m) {
|
||||
cout << m.what() << endl;
|
||||
}
|
||||
|
||||
/* Do not modify the code below */
|
||||
|
||||
|
||||
// the famous FDIV bug
|
||||
// https://en.wikipedia.org/wiki/Pentium_FDIV_bug
|
||||
ExactNumber n7(4195835, 3145727);
|
||||
num_tests++;
|
||||
n4 = n7;
|
||||
try {
|
||||
if (static_cast<double>(n4) != (4195835.0 / 3145727.0))
|
||||
throw error_msg("operator/=", n4, 4195835.0 / 3145727.0);
|
||||
}
|
||||
catch (string m) {
|
||||
cout << m << endl;
|
||||
num_failed++;
|
||||
}
|
||||
|
||||
if (num_failed == 0) {
|
||||
cout << "passed all " << num_tests << " default test cases" << endl;
|
||||
} else {
|
||||
@ -308,6 +300,227 @@ int main() {
|
||||
}
|
||||
cout << endl;
|
||||
|
||||
num_tests = 0;
|
||||
ExactNumber one(1, 1), two(2, 1), negative_one_point_five(-3, 2), zero(0, 1), three_point_five(7, 2), one_again(2,
|
||||
2), fdiv_test_case(
|
||||
4195835, 3145727);
|
||||
|
||||
// 1. FDIV bug check
|
||||
num_tests++;
|
||||
try {
|
||||
if (static_cast<double>(fdiv_test_case) != (4195835.0 / 3145727.0))
|
||||
throw runtime_error("FDIV bug check failed.");
|
||||
} catch (const exception &e) {
|
||||
cout << e.what() << endl;
|
||||
num_failed++;
|
||||
}
|
||||
|
||||
// 2. Test: Equal
|
||||
num_tests++;
|
||||
try {
|
||||
if (!(one == one_again))
|
||||
throw runtime_error("Equality check failed.");
|
||||
} catch (const exception &e) {
|
||||
cout << e.what() << endl;
|
||||
num_failed++;
|
||||
}
|
||||
|
||||
// 3. Test: Not Equal
|
||||
num_tests++;
|
||||
try {
|
||||
if (one != one)
|
||||
throw runtime_error("Inequality check failed.");
|
||||
} catch (const exception &e) {
|
||||
cout << e.what() << endl;
|
||||
num_failed++;
|
||||
}
|
||||
|
||||
// 4. Test: Greater Than
|
||||
num_tests++;
|
||||
try {
|
||||
if (!(two > one))
|
||||
throw runtime_error("Greater than check failed.");
|
||||
} catch (const exception &e) {
|
||||
cout << e.what() << endl;
|
||||
num_failed++;
|
||||
}
|
||||
|
||||
// 5. Test: Less Than
|
||||
num_tests++;
|
||||
try {
|
||||
if (!(negative_one_point_five < one))
|
||||
throw runtime_error("Less than check failed.");
|
||||
} catch (const exception &e) {
|
||||
cout << e.what() << endl;
|
||||
num_failed++;
|
||||
}
|
||||
|
||||
// 6. Test: Greater Than or Equal
|
||||
num_tests++;
|
||||
try {
|
||||
if (!(two >= one))
|
||||
throw runtime_error("Greater than or equal check failed.");
|
||||
} catch (const exception &e) {
|
||||
cout << e.what() << endl;
|
||||
num_failed++;
|
||||
}
|
||||
|
||||
// 7. Test: Less Than or Equal
|
||||
num_tests++;
|
||||
try {
|
||||
if (!(negative_one_point_five <= one))
|
||||
throw runtime_error("Less than or equal check failed.");
|
||||
} catch (const exception &e) {
|
||||
cout << e.what() << endl;
|
||||
num_failed++;
|
||||
}
|
||||
|
||||
// 8. Test: Addition
|
||||
ExactNumber sum = one + two;
|
||||
num_tests++;
|
||||
try {
|
||||
if (static_cast<double>(sum) != 3.0)
|
||||
throw runtime_error("Addition check failed.");
|
||||
} catch (const exception &e) {
|
||||
cout << e.what() << endl;
|
||||
num_failed++;
|
||||
}
|
||||
|
||||
// 9. Test: Subtraction
|
||||
ExactNumber difference = two - one;
|
||||
num_tests++;
|
||||
try {
|
||||
if (static_cast<double>(difference) != 1.0)
|
||||
throw runtime_error("Subtraction check failed.");
|
||||
} catch (const exception &e) {
|
||||
cout << e.what() << endl;
|
||||
num_failed++;
|
||||
}
|
||||
|
||||
// 10. Test: Multiplication
|
||||
ExactNumber product = two * negative_one_point_five;
|
||||
num_tests++;
|
||||
try {
|
||||
if (static_cast<double>(product) != -3.0)
|
||||
throw runtime_error("Multiplication check failed.");
|
||||
} catch (const exception &e) {
|
||||
cout << e.what() << endl;
|
||||
num_failed++;
|
||||
}
|
||||
|
||||
// 11. Test: Division
|
||||
ExactNumber quotient = two / one;
|
||||
num_tests++;
|
||||
try {
|
||||
if (static_cast<double>(quotient) != 2.0)
|
||||
throw runtime_error("Division check failed.");
|
||||
} catch (const exception &e) {
|
||||
cout << e.what() << endl;
|
||||
num_failed++;
|
||||
}
|
||||
|
||||
// 12. Edge Case: Division by Zero
|
||||
num_tests++;
|
||||
try {
|
||||
ExactNumber div_by_zero_result = one / zero;
|
||||
throw runtime_error("Division by zero check failed (expected exception).");
|
||||
} catch (const exception &e) {
|
||||
cout << "Caught division by zero as expected (skipping)" << endl;
|
||||
}
|
||||
|
||||
// 13. Addition with Negative
|
||||
ExactNumber addition_with_negative = negative_one_point_five + one;
|
||||
num_tests++;
|
||||
try {
|
||||
if (static_cast<double>(addition_with_negative) != -0.5)
|
||||
throw runtime_error("Addition with negative check failed.");
|
||||
} catch (const exception &e) {
|
||||
cout << e.what() << endl;
|
||||
num_failed++;
|
||||
}
|
||||
|
||||
// 14. Subtraction with Negative
|
||||
ExactNumber subtraction_with_negative = one - negative_one_point_five;
|
||||
num_tests++;
|
||||
try {
|
||||
if (static_cast<double>(subtraction_with_negative) != 2.5)
|
||||
throw runtime_error("Subtraction with negative check failed.");
|
||||
} catch (const exception &e) {
|
||||
cout << e.what() << endl;
|
||||
num_failed++;
|
||||
}
|
||||
|
||||
// 15. Negative Multiplication
|
||||
ExactNumber negative_product = negative_one_point_five * negative_one_point_five;
|
||||
num_tests++;
|
||||
try {
|
||||
if (static_cast<double>(negative_product) != 2.25)
|
||||
throw runtime_error("Negative multiplication check failed.");
|
||||
} catch (const exception &e) {
|
||||
cout << e.what() << endl;
|
||||
num_failed++;
|
||||
}
|
||||
|
||||
// 16. Negative Division
|
||||
ExactNumber negative_division = negative_one_point_five / two;
|
||||
num_tests++;
|
||||
try {
|
||||
if (static_cast<double>(negative_division) != -0.75)
|
||||
throw runtime_error("Negative division check failed.");
|
||||
} catch (const exception &e) {
|
||||
cout << e.what() << endl;
|
||||
num_failed++;
|
||||
}
|
||||
|
||||
// 17. Multiplication by Zero
|
||||
ExactNumber multiplication_by_zero = zero * two;
|
||||
num_tests++;
|
||||
try {
|
||||
if (static_cast<double>(multiplication_by_zero) != 0.0)
|
||||
throw runtime_error("Multiplication by zero check failed.");
|
||||
} catch (const exception &e) {
|
||||
cout << e.what() << endl;
|
||||
num_failed++;
|
||||
}
|
||||
|
||||
// 18. Self Assignment
|
||||
num_tests++;
|
||||
try {
|
||||
if (static_cast<double>(one) != 1.0)
|
||||
throw runtime_error("Self-assignment check failed.");
|
||||
} catch (const exception &e) {
|
||||
cout << e.what() << endl;
|
||||
num_failed++;
|
||||
}
|
||||
|
||||
// 19. Negative Self Multiplication
|
||||
ExactNumber negative_self_multiplication = negative_one_point_five * ExactNumber(-1, 1);
|
||||
num_tests++;
|
||||
try {
|
||||
if (static_cast<double>(negative_self_multiplication) != 1.5)
|
||||
throw runtime_error("Negative self-multiplication check failed.");
|
||||
} catch (const exception &e) {
|
||||
cout << e.what() << endl;
|
||||
num_failed++;
|
||||
}
|
||||
|
||||
// 20. Fraction Reduction Check
|
||||
ExactNumber fraction_reduction(10, 20);
|
||||
num_tests++;
|
||||
try {
|
||||
if (static_cast<double>(fraction_reduction) != 0.5)
|
||||
throw runtime_error("Fraction reduction check failed.");
|
||||
} catch (const exception &e) {
|
||||
cout << e.what() << endl;
|
||||
num_failed++;
|
||||
}
|
||||
|
||||
if (!num_failed) {
|
||||
cout << "passed all " << num_tests << " custom test cases" << endl;
|
||||
} else {
|
||||
cout << "failed " << num_failed << " custom test cases out of " << num_tests << " custom test cases" << endl;
|
||||
}
|
||||
cout << endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user