|
| 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