#include #include #include "fraction.hpp" using namespace FractionNS; class FractionTest : public QObject { Q_OBJECT public: FractionTest(); ~FractionTest(); private slots: void test_constructor(); void test_display(); void test_equivalence(); void test_addition(); void test_inequivalence(); void test_substraction(); void test_multiplication(); void test_division(); }; FractionTest::FractionTest() {}; FractionTest::~FractionTest() {}; void FractionTest::test_constructor() { // Normal fraction Fraction f1 = Fraction(1, 2); QCOMPARE(f1.getNumerator(), 1); QCOMPARE(f1.getDenominator(), 2); // Reducible fraction Fraction f2 = Fraction(2, 4); QCOMPARE(f2.getNumerator(), 1); QCOMPARE(f2.getDenominator(), 2); // Negative fractions Fraction f3 = Fraction(-1, 3); QCOMPARE(f3.getNumerator(), -1); QCOMPARE(f3.getDenominator(), 3); Fraction f4 = Fraction(1, -3); QCOMPARE(f4.getNumerator(), -1); QCOMPARE(f4.getDenominator(), 3); // Double negative (positive) fraction Fraction f5 = Fraction(-2, -3); QCOMPARE(f5.getNumerator(), 2); QCOMPARE(f5.getDenominator(), 3); } void FractionTest::test_display() { // Normal fraction Fraction f1 = Fraction(1, 2); QCOMPARE(f1.display(), "1/2"); Fraction f2 = Fraction(1, 3); QCOMPARE(f2.display(), "1/3"); // Fractions that reduce Fraction f3 = Fraction(2, 4); QCOMPARE(f3.display(), "1/2"); Fraction f4 = Fraction(982929, 123456); QCOMPARE(f4.display(), "327643/41152"); // Negative Fractions Fraction f5 = Fraction(-5, 2); QCOMPARE(f5.display(), "-5/2"); } void FractionTest::test_equivalence() { Fraction f1 = Fraction(1, 1); Fraction f2 = Fraction(1, 1); Fraction f3 = Fraction(-1, 1); QCOMPARE(f1, f2); QCOMPARE(f1, 1); QCOMPARE(f1, 1.0); QCOMPARE(f1, 1.0f); QCOMPARE(f2, 1); QCOMPARE(f2, 1.0); QCOMPARE(f2, 1.0f); QCOMPARE(f3, -1); QCOMPARE(f3, -1.0); QCOMPARE(f3, -1.0f); Fraction f4 = Fraction(2, 3); Fraction f5 = Fraction(-2, 3); Fraction f6 = Fraction(2, -3); Fraction f7 = Fraction(-2, -3); QCOMPARE(f4, f7); QCOMPARE(f5, f6); QCOMPARE(f4, 2.0f / 3.0f); QCOMPARE(f4, 2.0 / 3.0); QCOMPARE(f7, 2.0f / 3.0f); QCOMPARE(f7, 2.0 / 3.0); QCOMPARE(f5, -2.0f / 3.0f); QCOMPARE(f5, -2.0 / 3.0); QCOMPARE(f6, -2.0f / 3.0f); QCOMPARE(f6, -2.0 / 3.0); } void FractionTest::test_inequivalence() { Fraction f1 = Fraction(1, 1); Fraction f2 = Fraction(-1, 1); Fraction f3 = Fraction(2, 3); QVERIFY(f1 != f2); QVERIFY(f2 != f3); QVERIFY(f3 != f1); QVERIFY(f3 != 1); QVERIFY(f3 != 1.0); QVERIFY(f3 != 1.0f); } void FractionTest::test_addition() { Fraction f1 = Fraction(1, 2); QCOMPARE(f1 + 1, 1.5f); QCOMPARE(f1, 0.5f); f1 += 1; QCOMPARE(f1, 1.5); Fraction f2 = Fraction(1, 2); QCOMPARE(f2 + 1, 1.5f); QCOMPARE(f2, 0.5f); Fraction f3 = Fraction(-2, 9); QCOMPARE(f3, -(2.0 / 9.0)); QCOMPARE(f3, -(2.0f / 9.0f)); f3 += Fraction(2, 9); QCOMPARE(f3, 0); QCOMPARE(f3, 0.0); QCOMPARE(f3, 0.0f); } void FractionTest::test_substraction() { Fraction f1 = Fraction(11) - 10; QCOMPARE(f1, 1); Fraction f2 = Fraction(2, 3); QCOMPARE(f1 - f2, Fraction(1, 3)); QCOMPARE(f2 - f1, Fraction(-1, 3)); Fraction f3 = Fraction(8, 3); f3 -= Fraction(2, 3); QCOMPARE(f3, Fraction(6, 3)); Fraction f4 = Fraction(9, 3); f4 -= 3; QCOMPARE(f4, 0); Fraction f5 = Fraction(8, 3); // (8/3) - ((2/3) - 1) //=(8/3) + (1/3) //= 9/3 //= 3 f5 -= Fraction(2, 3) - 1; QCOMPARE(f5, 3); Fraction f6 = Fraction(-2, 199); // (-2/199) + 8 //=(-2/199) + (1592/199 //=(1590/199) f6 -= Fraction(-4) - 4; QCOMPARE(f6, Fraction(1590, 199)); } void FractionTest::test_multiplication() { Fraction f1 = Fraction(1, 1); const Fraction f2 = Fraction(2, 1); QCOMPARE(f1 * 2, f2); f1 *= 2; QCOMPARE(f1, f2); f1 *= 3; QCOMPARE(f1, 6); QCOMPARE(f1 * Fraction(2, 3), 4); } void FractionTest::test_division() { Fraction f1 = Fraction(1, 1); const Fraction f2 = Fraction(1, 2); QCOMPARE(f1 / 2, f2); f1 /= 2; qDebug() << f1.display(); QCOMPARE(f1, 0.5); QCOMPARE(f1 / 2, 0.25); QCOMPARE((f1 / 2) / Fraction(2, 3), Fraction(3, 8)); } QTEST_APPLESS_MAIN(FractionTest) #include "tst_fractiontest.moc"