Summary Files Commits Branches @commit @diff @stats
path: root / Year 1 / Object-oriented Programming / 06-Practice-29.03.2022 / ex2 / Tests.cpp
blob: 1df52f56126c5f7c1ad4b5fe4bf5e3e3e8a2bfa9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#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();