#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN #include "doctest.h" #include "Rational.h" TEST_SUITE_BEGIN("ClassRational"); TEST_SUITE("Constructors") { TEST_CASE("DefaltCtor_HasValueOf1Over1_Always") { Rational r; CHECK_EQ(r.get_numerator(), 1); CHECK_EQ(r.get_denumerator(), 1); } TEST_CASE("Ctor_SavesValues_WhenGivenCorrectInts") { int num, denum; SUBCASE("Positives") { num = 5, denum = 19; } SUBCASE("Negatives") { num = -13, denum = -14; } SUBCASE("0Numerator") { num = 0, denum = 2; } Rational r(num, denum); CHECK_EQ(r.get_numerator(), num); CHECK_EQ(r.get_denumerator(), denum); } TEST_CASE("Ctor_SavesDefault_WhereThereIs0s") { int num, denum; SUBCASE("0Denumerator") { num = 38, denum = 0; } // a/0 is undefined for all integer values of a, default must be saved! SUBCASE("0DenumeratorAndEnumerator") { num = denum = 0; } // 0/0 is undefined, default must be saved! Rational r(num, denum); CHECK_EQ(r.get_numerator(), 1); CHECK_EQ(r.get_denumerator(), 1); } } TEST_SUITE("GettersAndSetters") { TEST_CASE("NumeratorGetter_ReturnsCorrectValue_WhenCtorGivenCorrectInt") { int num, denum = 2; SUBCASE("Positive") { num = 86; } SUBCASE("Negative") { num = -1653; } SUBCASE("0") { num = 0; } Rational r(num, denum); CHECK_EQ(r.get_numerator(), num); } TEST_CASE("NumeratorSetter_SetsValue_WhenGivenCorrectInt") { Rational r(173, 57); int newNumerator; SUBCASE("Positive") { newNumerator = 3; } SUBCASE("Negative") { newNumerator = -82; }; SUBCASE("0") { newNumerator = 0; } r.set_numerator(newNumerator); CHECK_EQ(r.get_numerator(), newNumerator); } TEST_CASE("DenumeratorGetter_ReturnsCorrectValue_WhenCtorGivenCorrectInt") { int num = 2, denum; SUBCASE("Positive") { denum = 35; } SUBCASE("Negative") { denum = -571; } Rational r(num, denum); CHECK_EQ(r.get_denumerator(), denum); } TEST_CASE("DenumeratorGetter_ReturnsDefault_WhenCtorGiven0") { Rational r(2, 0); CHECK_EQ(r.get_denumerator(), 1); } TEST_CASE("DenumeratorSetter_SetsValue_WhenGivenCorrectInt") { Rational r(712, 32); int newDenumerator; SUBCASE("Positive") { newDenumerator = 33; } SUBCASE("Negative") { newDenumerator = -21; }; r.set_denumerator(newDenumerator); CHECK_EQ(r.get_denumerator(), newDenumerator); } TEST_CASE("DenumeratorSetter_SetsDefault_WhenGiven0") { Rational r(42, 90); r.set_denumerator(0); CHECK_EQ(r.get_denumerator(), 1); } } TEST_CASE("Canonize_SimplifiesExpression_Always") { int num, denum, sNum, sDenum; SUBCASE("SimplifiedGreaterThan1") { num = sNum = 5, denum = sDenum = 4; }; SUBCASE("SimplifiedPositiveLessThan1") { num = sNum = 2, denum = sDenum = 9; }; SUBCASE("SimplifiedNegativeMoreThan-1") { num = sNum = -7, denum = sDenum = 8; }; SUBCASE("SimplifiedLessThan-1") { num = sNum = -27, denum = sDenum = 13; }; SUBCASE("NumeratorDivisibleByDenumerator") { num = 161, denum = 23, sNum = 7, sDenum = 1; } SUBCASE("NegativeNumeratorDivisibleByDenumerator") { num = -161, denum = 23, sNum = -7, sDenum = 1; } SUBCASE("NumeratorDivisibleByNegativeDenumerator") { num = 161, denum = -23, sNum = 7, sDenum = -1; } SUBCASE("DenumeratorDivisbleByNumerator") { num = 19, denum = 171, sNum = 1, sDenum = 9; } SUBCASE("NegativeDenumeratorDivisbleByNumerator") { num = 19, denum = -171, sNum = 1, sDenum = -9; } SUBCASE("DenumeratorDivisbleByNegativeNumerator") { num = -19, denum = 171, sNum = -1, sDenum = 9; } SUBCASE("NumeratorDenumeratorBothMultipliedBySameValue") { num = 6867, denum = 924, sNum = 327, sDenum = 44; } Rational r(num, denum); r.canonize(); CHECK_EQ(r.get_numerator(), sNum); CHECK_EQ(r.get_denumerator(), sDenum); } TEST_SUITE("Operators") { TEST_CASE("+_SumsRationals_WhenGivenProperValues") { int num1, denum1, num2, denum2, numRes, denumRes; SUBCASE("Positives") { num1 = 73, denum1 = 4, num2 = 14, denum2 = 99, numRes = 7283, denumRes = 396; } SUBCASE("Negatives") { num1 = -73, denum1 = 4, num2 = -14, denum2 = 99, numRes = -7283, denumRes = 396; } Rational r1(num1, denum1), r2(num2, denum2), sum = r1 + r2; // sum.canonize(); CHECK_EQ(sum.get_numerator(), numRes); CHECK_EQ(sum.get_denumerator(), denumRes); } TEST_CASE("+_ActsLike-_WhenSecondNumIsNegative") { Rational r1(24, 13), r2(-46, 56), sum = r1 + r2; sum.canonize(); CHECK_EQ(sum.get_numerator(), 373); CHECK_EQ(sum.get_denumerator(), 364); } TEST_CASE("-_SubtractsRationals_WhenGivenProperValues") { int num1, denum1, num2, denum2, numRes, denumRes; SUBCASE("Positives") { num1 = 47, denum1 = 9, num2 = 13, denum2 = 53, numRes = 2374, denumRes = 477; } SUBCASE("Negatives") { num1 = -47, denum1 = 9, num2 = -13, denum2 = 53, numRes = -2374, denumRes = 477; } Rational r1(num1, denum1), r2(num2, denum2), sub = r1 - r2; sub.canonize(); CHECK_EQ(sub.get_numerator(), numRes); CHECK_EQ(sub.get_denumerator(), denumRes); } TEST_CASE("-_ActsLike+_WhenSecondNumIsNegative") { Rational r1(913, 31), r2(-53, 2), sub = r1 - r2; sub.canonize(); CHECK_EQ(sub.get_numerator(), 3469); CHECK_EQ(sub.get_denumerator(), 62); } TEST_CASE("*_MultipliesRationals_WhenGivenProperValues") { int num1, denum1, num2, denum2, numRes, denumRes; SUBCASE("Positives") { num1 = 92, denum1 = 123, num2 = 13, denum2 = 7, numRes = 1196, denumRes = 861; } SUBCASE("Negatives") { num1 = -92, denum1 = 123, num2 = -13, denum2 = 7, numRes = 1196, denumRes = 861; } SUBCASE("FirstNegative") { num1 = -92, denum1 = 123, num2 = 13, denum2 = 7, numRes = -1196, denumRes = 861; } SUBCASE("SecondNegative") { num1 = 92, denum1 = 123, num2 = -13, denum2 = 7, numRes = -1196, denumRes = 861; } SUBCASE("Reciprocals") { num1 = denum2 = 73184, denum1 = num2 = 28413, numRes = 1, denumRes = 1; } Rational r1(num1, denum1), r2(num2, denum2), mult = r1 * r2; mult.canonize(); CHECK_EQ(mult.get_numerator(), numRes); CHECK_EQ(mult.get_denumerator(), denumRes); } TEST_CASE("/_DividesRationals_WhenGivenProperValues") { int num1, denum1, num2, denum2, numRes, denumRes; SUBCASE("Positives") { num1 = 92, denum1 = 23, num2 = 13, denum2 = 7, numRes = 28, denumRes = 13; } SUBCASE("Negatives") { num1 = -92, denum1 = 23, num2 = -13, denum2 = 7, numRes = -28, denumRes = -13; } SUBCASE("FirstNegative") { num1 = -92, denum1 = 23, num2 = 13, denum2 = 7, numRes = -28, denumRes = 13; } SUBCASE("SecondNegative") { num1 = 92, denum1 = 23, num2 = -13, denum2 = 7, numRes = 28, denumRes = -13; } SUBCASE("SameValues") { num1 = num2 = 73184, denum1 = denum2 = 28413, numRes = 1, denumRes = 1; } Rational r1(num1, denum1), r2(num2, denum2), div = r1 / r2; div.canonize(); CHECK_EQ(div.get_numerator(), numRes); CHECK_EQ(div.get_denumerator(), denumRes); } } TEST_CASE("NumCmp_ReturnsProperValues_WhenGivenCorrectValues") { int num1, denum1, num2, denum2, expectedRes; SUBCASE("FirstLargerThanSecond") { num1 = 8364, denum1 = 921, num2 = 6510, denum2 = 947, expectedRes = 1; } SUBCASE("SecondLargerThanFirst") { num1 = 19332, denum1 = 8477, num2 = 9947, denum2 = 2411, expectedRes = -1; } SUBCASE("Equal") { num1 = denum1 = 3231, num2 = denum2 = 461, expectedRes = 0; } Rational r1(num1, denum1), r2(num2, denum2); int result = r1.numcmp(r2); CHECK_EQ(result, expectedRes); } TEST_SUITE_END();