Skip to content

Commit 27ac6ac

Browse files
committed
test: add all the tests for the true_round function with different rounding cases
1 parent f581be2 commit 27ac6ac

1 file changed

Lines changed: 107 additions & 0 deletions

File tree

tests/test_round.py

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
from pycustomrand.custom_round import true_round
2+
import unittest
3+
4+
5+
class TestTrueRound(unittest.TestCase):
6+
7+
# -------------------- Базовые тесты --------------------
8+
9+
def test_integers(self):
10+
"""Проверка: целые числа не должны меняться."""
11+
self.assertEqual(true_round(5), 5)
12+
self.assertEqual(true_round(0), 0)
13+
self.assertEqual(true_round(100), 100)
14+
15+
def test_basic_rounding_down(self):
16+
"""Проверка: округление вниз."""
17+
self.assertEqual(true_round(1.1), 1)
18+
self.assertEqual(true_round(1.4), 1)
19+
self.assertEqual(true_round(1.4999), 2)
20+
21+
def test_basic_rounding_up(self):
22+
"""Проверка: округление вверх (числа > 0.5)."""
23+
self.assertEqual(true_round(1.6), 2)
24+
self.assertEqual(true_round(1.9), 2)
25+
self.assertEqual(true_round(0.99), 1)
26+
27+
def test_rounding_half_up(self):
28+
"""
29+
ГЛАВНАЯ ПРОВЕРКА: Округление 0.5
30+
В стандартном Python round(2.5) == 2 (банковское округление).
31+
Функция true_round должна давать 3 (математическое округление).
32+
"""
33+
self.assertEqual(true_round(0.5), 1)
34+
self.assertEqual(true_round(1.5), 2)
35+
self.assertEqual(true_round(2.5), 3)
36+
self.assertEqual(true_round(3.5), 4)
37+
38+
def test_precision_1_digit(self):
39+
"""Проверка: округление до 1 знака"""
40+
self.assertEqual(true_round(0.14, 1), 0.1)
41+
self.assertEqual(true_round(0.15, 1), 0.2)
42+
self.assertEqual(true_round(0.16, 1), 0.2)
43+
44+
def test_precision_cascade(self):
45+
"""
46+
Проверка каскадного округления.
47+
Пример: 1.99 при округлении до 1 знака должно стать 2.0
48+
"""
49+
self.assertEqual(true_round(1.99, 1), 2.0)
50+
self.assertEqual(true_round(9.99, 1), 10.0)
51+
52+
# Проверка сложного случая: 0.445 -> 0.45 -> 0.5 (при округлении до 1 знака)
53+
self.assertEqual(true_round(0.445, 1), 0.5)
54+
55+
# -------------------- Продвинутые тесты --------------------
56+
57+
def test_float_representation_fix(self):
58+
"""
59+
Тест на 'проблему 2.675'.
60+
Стандартный round(2.675, 2) дает 2.67.
61+
Математическое округление должно давать 2.68.
62+
"""
63+
self.assertEqual(true_round(2.675, 2), 2.68)
64+
self.assertEqual(true_round(1.005, 2), 1.01)
65+
66+
def test_heavy_cascade(self):
67+
"""
68+
Тест 'Эффект Домино'.
69+
9.999 при округлении до 2 знаков должно стать 10.0
70+
"""
71+
# 9.999 -> 9.9(9+1) -> 9.(9+1)0 -> (9+1).00 -> 10.0
72+
self.assertEqual(true_round(9.999, 2), 10.0)
73+
74+
# 89.999 -> 90.0
75+
self.assertEqual(true_round(89.999, 2), 90.0)
76+
77+
def test_small_numbers(self):
78+
"""Работа с очень маленькими числами."""
79+
# 0.0005 -> округляем до 3 знаков -> 0.001
80+
self.assertEqual(true_round(0.0005, 3), 0.001)
81+
82+
# 0.0004 -> округляем до 3 знаков -> 0.0
83+
self.assertEqual(true_round(0.0004, 3), 0.0)
84+
85+
def test_rounding_to_zero_length(self):
86+
"""
87+
Явное указание length=0.
88+
Должно работать так же, как без указания length.
89+
"""
90+
self.assertEqual(true_round(5.6, 0), 6)
91+
self.assertIsInstance(true_round(5.6, 0), int)
92+
93+
def test_negative_numbers(self):
94+
"""
95+
Отрицательные числа.
96+
Математически: -1.5 округляется до -2 (по модулю).
97+
"""
98+
self.assertEqual(true_round(-1.5), -2)
99+
self.assertEqual(true_round(-1.1), -1)
100+
101+
102+
if __name__ == '__main__':
103+
# Запуск конкретного теста:
104+
# unittest.main(defaultTest='TestTrueRound.test_negative_numbers')
105+
106+
# Запуск всех тестов:
107+
unittest.main()

0 commit comments

Comments
 (0)