From 0d23ced79ed9ef7dd923df4978d65985e877509e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B3=D0=BE=D1=80=20=D0=98=D0=B3=D0=BD=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BD=D0=BA=D0=BE?= Date: Wed, 13 Nov 2024 00:29:18 +0300 Subject: [PATCH 1/2] ready --- .DS_Store | Bin 0 -> 6148 bytes circle.py | 29 ++++++++- docs/README.md | 168 ++++++++++++++++++++++++++++++++++++++++++++++--- rectangle.py | 32 ++++++++++ square.py | 29 ++++++++- triangle.py | 39 ++++++++++++ 6 files changed, 285 insertions(+), 12 deletions(-) create mode 100644 .DS_Store create mode 100644 rectangle.py create mode 100644 triangle.py diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..092423f3af1fea2e04174e297f3d72a8a0e5e7ed GIT binary patch literal 6148 zcmeHKO^?$s5FK~RZlVgQ2axuHWQl9Fbjyc8TtZn6dnE`CfJ(BdmWU8{o0JMwm2!q3 z!?)#Eywb4QJUgQJ07UIAbeB@fYKM_AP7q$Uacn zF$x;f5l!gpX|ctY!2hTKKf935D5ojPwdZHf(!!+Zy*ZFup z>fU;8$~wu*@zf^d*%*{}Z}KuT^P!oQS!Hu$*Aaw4IO-lQ7K6d#o<4p!SoZYd$)MlU z5AHu&F2msV-Fr`8jy@HiOY_aHj1=BvYd1Y!!go|w>;4i?%fgiBh%rB;iY{nI2~=Et z0qe@BJ7BFV*r6KS92q5@@6uiIoaivi&~6=gjmM%Wta{KLpO+GFIgaflw6a;ZR float: + ''' + Вычисляет и возвращает площадь круга. + Параметры: + r (float): радиус круга, вещественное число + Возвращаемое значение: + c_area (float): площадь круга, вычесленная по формуле c_area = pi * r ^ 2 + Пример вызова: + Входные данные: 3.0 + Результат: 28.27433 + ''' def perimeter(r): return 2 * math.pi * r + c_area = math.pi * r * r + return c_area + + +def perimeter(r: float) -> float: + ''' + Вычисляет и возвращает периметр круга. + Параметры: + r (float): радиус круга, вещественное число + Возвращаемое значение: + c_perimeter (float): периметр круга, вычесленный по формуле c_perimeter = 2 * pi * r + Пример вызова: + Входные данные: 3.0 + Результат: 18.84955 + ''' + c_perimeter = 2 * math.pi * r + return c_perimeter \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index 63f8727939..f315129854 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,10 +1,158 @@ -# Math formulas -## Area -- Circle: S = πR² -- Rectangle: S = ab -- Square: S = a² - -## Perimeter -- Circle: P = 2πR -- Rectangle: P = 2a + 2b -- Square: P = 4a \ No newline at end of file +# Библиотека для работы с различными фигурами + +## Общее описание + +Библиотека предназначена для работы с основными геометрическими фигурами. Она включает в себя **четыре основных файла**: circle.py, rectangle.py, square.py, triangle.py, в каждом из которых реализованы две функции: вычисление площади и периметра фигуры. + +## Основные файлы библиотеки, их функции с примерами вызовов + +### circle.py + +#### Площадь окружности +Функция **принимает вещественное число** (*радиус окружности*) в качестве аргумента и **возвращает площадь окружности**, которая вычисляется по формуле: +``` +S = πR² +``` + +**Пример вызова:** +```python +area(3.0) +``` + +**Вывод:** +``` +28.27433 +``` + +#### Периметр окружности +Функция **принимает вещественное число** (*радиус окружности*) в качестве аргумента и **возвращает периметр окружности**, который вычисляется по формуле: +``` +P = 2πR +``` + +**Пример вызова:** +```python +perimeter(3.0) +``` + +**Вывод:** +``` +18.84955 +``` + +### rectangle.py + +#### Площадь прямоугольника +Функция **принимает вещественные числа** (*стороны прямоугольника*) в качестве аргументов и **возвращает площадь прямоугольника**, которая вычисляется по формуле: +``` +S = ab +``` + +**Пример вызова:** +```python +area(3.0, 5.0) +``` + +**Вывод:** +``` +15.0 +``` + +#### Периметр прямоугольника +Функция **принимает вещественные числа** (*стороны прямоугольника*) в качестве аргументов и **возвращает периметр прямоугольника**, который вычисляется по формуле: +``` +P = 2a + 2b +``` + +**Пример вызова:** +```python +perimeter(3.0, 5.0) +``` + +**Вывод:** +``` +16.0 +``` + +### square.py + +#### Площадь квадрата +Функция **принимает вещественное число** (*сторона квадрата*) в качестве аргумента и **возвращает площадь квадрата**, которая вычисляется по формуле: +``` +S = a² +``` + +**Пример вызова:** +```python +area(5.0) +``` + +**Вывод:** +``` +25.0 +``` + +#### Периметр квадрата +Функция **принимает вещественное число** (*сторона квадрата*) в качестве аргумента и **возвращает периметр квадрата**, который вычисляется по формуле: +``` +P = 4a +``` + +**Пример вызова:** +```python +perimeter(5.0) +``` + +**Вывод:** +``` +20.0 +``` + +### triangle.py + +#### Площадь треугольника +Функция **принимает вещественные числа** (*сторона треугольника и высота, падающая на эту сторону*) в качестве аргументов и **возвращает площадь треугольника**, которая вычисляется по формуле: +``` +S = ah/2 +``` + +**Пример вызова:** +```python +area(4.0, 6.0) +``` + +**Вывод:** +``` +12.0 +``` + +#### Периметр треугольника +Функция **принимает вещественные числа** (*стороны треугольника*) в качестве аргументов, проверяет треугольник на существование: +``` +a + b > c +a + c > b +b + c > a +``` + +и **возвращает периметр треугольника**, который вычисляется по формуле: +``` +P = a + b + c +``` + +**Примеры вызова:** +```python +perimeter(3.0, 4.0, 5.0) +``` + +```python +perimeter(100.0, 3.0, 5.0) +``` + +**Выводы:** +``` +12.0 +``` + +``` +-1.0 +``` \ No newline at end of file diff --git a/rectangle.py b/rectangle.py new file mode 100644 index 0000000000..ea151c426a --- /dev/null +++ b/rectangle.py @@ -0,0 +1,32 @@ +def area(a: float, b: float) -> float: + ''' + Вычисляет и возвращает площадь прямоугольника. + Параметры: + a (float): ширина прямоугольника, вещественное число + b (float): длина прямоугольника, вещественное число + Возвращаемое значение: + r_area (float): площадь прямоугольника, вычесленная по формуле r_area = a * b + Пример вызова: + Входные данные: 3.0, 5.0 + Результат: 15.0 + ''' + + r_area = a * b + return r_area + + +def perimeter(a: float, b: float) -> float: + ''' + Вычисляет и возвращает периметр прямоугольника. + Параметры: + a (float): ширина прямоугольника, вещественное число + b (float): длина прямоугольника, вещественное число + Возвращаемое значение: + r_perimeter (float): периметр прямоугольника, вычесленный по формуле r_perimeter = (a + b) * 2 + Пример вызова: + Входные данные: 3.0, 5.0 + Результат: 16.0 + ''' + + r_perimeter = (a + b) * 2 + return r_perimeter \ No newline at end of file diff --git a/square.py b/square.py index 0f98724205..75d7e4b9f0 100644 --- a/square.py +++ b/square.py @@ -1,7 +1,34 @@ - +def area(a: float) -> float: + ''' + Вычисляет и возвращает площадь квадрата. + Параметры: + a (float): длина стороны квадрата, вещественное число + Возвращаемое значение: + s_area (float): площадь квадрата, вычесленная по формуле s_area = a ^ 2 def area(a): return a * a + Пример вызова: + Входные данные: 5.0 + Результат: 25.0 + ''' + s_area = a * a + return s_area def perimeter(a): return 4 * a + +def perimeter(a: float) -> float: + ''' + Вычисляет и возвращает периметр квадрата. + Параметры: + a (float): длина стороны квадрата, вещественное число + Возвращаемое значение: + s_perimeter (float): периметр квадрата, вычесленный по формуле s_perimeter = 4 * a + Пример вызова: + Входные данные: 5.0 + Результат: 20.0 + ''' + + s_perimeter = 4 * a + return s_perimeter \ No newline at end of file diff --git a/triangle.py b/triangle.py new file mode 100644 index 0000000000..ce0b5ef694 --- /dev/null +++ b/triangle.py @@ -0,0 +1,39 @@ +def area(a: float, h: float) -> float: + ''' + Вычисляет и возвращает площадь треугольника. + Параметры: + a (float): сторона треугольника, вещественное число + h (float): высота треугольника, падающая на сторону a, вещественное число + Возвращаемое значение: + t_area (float): площадь треугольника, вычесленная по формуле t_area = a * h / 2 + Пример вызова: + Входные данные: 4.0, 6.0 + Результат: 12.0 + ''' + + t_area = a * h / 2 + return t_area + + +def perimeter(a: float, b: float, c: float) -> float: + ''' + Проверяет существование треугольника, вычисляет и возвращает его периметр. + Параметры: + a (float): 1 сторона треугольника, вещественное число + b (float): 2 сторона треугольника, вещественное число + c (float): 3 сторона треугольника, вещественное число + Возвращаемое значение: + t_perimeter (float): периметр треугольника, вычесленный по формуле t_perimeter = a + b + c + Пример вызова 1: + Входные данные: 3.0, 4.0, 5.0 + Результат: 12.0 + Пример вызова 2: + Входные данные: 100.0, 3.0, 5.0 + Результат: -1.0 + ''' + + if (a + b) <= c or (a + c) <= b or (b + c) <= a: + return -1.0 + + t_perimeter = a + b + c + return t_perimeter From 8f912683d5d199b0a8479eebecf223bb0d829b8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B3=D0=BE=D1=80=20=D0=98=D0=B3=D0=BD=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BD=D0=BA=D0=BE?= Date: Tue, 10 Dec 2024 22:59:03 +0300 Subject: [PATCH 2/2] tests --- circle.py | 40 +++-------- docs/README.md | 30 ++++++++- docs/geometric_lib/rectangle.py | 0 rectangle.py | 41 ++++-------- square.py | 38 +++-------- test_circle.py | 44 +++++++++++++ test_rectangle.py | 56 ++++++++++++++++ test_square.py | 44 +++++++++++++ test_triangle.py | 74 +++++++++++++++++++++ triangle.py | 113 +++++++++++++++++++++----------- 10 files changed, 352 insertions(+), 128 deletions(-) create mode 100644 docs/geometric_lib/rectangle.py create mode 100644 test_circle.py create mode 100644 test_rectangle.py create mode 100644 test_square.py create mode 100644 test_triangle.py diff --git a/circle.py b/circle.py index 8461e75445..50f0572be3 100644 --- a/circle.py +++ b/circle.py @@ -2,36 +2,16 @@ def area(r): + if not isinstance(r, (int, float)): + raise TypeError("Value must be number") + if r < 0: + raise ValueError("Value must be positive") return math.pi * r * r -def area(r: float) -> float: - ''' - Вычисляет и возвращает площадь круга. - Параметры: - r (float): радиус круга, вещественное число - Возвращаемое значение: - c_area (float): площадь круга, вычесленная по формуле c_area = pi * r ^ 2 - Пример вызова: - Входные данные: 3.0 - Результат: 28.27433 - ''' - -def perimeter(r): - return 2 * math.pi * r - c_area = math.pi * r * r - return c_area -def perimeter(r: float) -> float: - ''' - Вычисляет и возвращает периметр круга. - Параметры: - r (float): радиус круга, вещественное число - Возвращаемое значение: - c_perimeter (float): периметр круга, вычесленный по формуле c_perimeter = 2 * pi * r - Пример вызова: - Входные данные: 3.0 - Результат: 18.84955 - ''' - - c_perimeter = 2 * math.pi * r - return c_perimeter \ No newline at end of file +def perimeter(r): + if not isinstance(r, (int, float)): + raise TypeError("Value must be number") + if r < 0: + raise ValueError("Value must be positive") + return 2 * math.pi * r \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index f315129854..7f66ec5c5c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,6 +8,10 @@ ### circle.py +**ссылка на circle.py** + +[circle.py](../circle.py) + #### Площадь окружности Функция **принимает вещественное число** (*радиус окружности*) в качестве аргумента и **возвращает площадь окружности**, которая вычисляется по формуле: ``` @@ -42,6 +46,13 @@ perimeter(3.0) ### rectangle.py +**ссылка на rectangle.py** + + +[rectangle.py](../rectangle.py) + + + #### Площадь прямоугольника Функция **принимает вещественные числа** (*стороны прямоугольника*) в качестве аргументов и **возвращает площадь прямоугольника**, которая вычисляется по формуле: ``` @@ -76,6 +87,10 @@ perimeter(3.0, 5.0) ### square.py +**ссылка на square.py** + +[square.py](../square.py) + #### Площадь квадрата Функция **принимает вещественное число** (*сторона квадрата*) в качестве аргумента и **возвращает площадь квадрата**, которая вычисляется по формуле: ``` @@ -110,6 +125,10 @@ perimeter(5.0) ### triangle.py +**ссылка на triangle.py** + +[triangle.py](../triangle.py) + #### Площадь треугольника Функция **принимает вещественные числа** (*сторона треугольника и высота, падающая на эту сторону*) в качестве аргументов и **возвращает площадь треугольника**, которая вычисляется по формуле: ``` @@ -155,4 +174,13 @@ perimeter(100.0, 3.0, 5.0) ``` -1.0 -``` \ No newline at end of file +``` +# История изменения проекта с хешами комитов + +**commit 0d23ced79ed9ef7dd923df4978d65985e877509e** + +Добавлена документация + +**commit 8ba9aeb3cea847b63a91ac378a2a6db758682460** + +Внесены финальные изменения в документации \ No newline at end of file diff --git a/docs/geometric_lib/rectangle.py b/docs/geometric_lib/rectangle.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/rectangle.py b/rectangle.py index ea151c426a..8067fdb404 100644 --- a/rectangle.py +++ b/rectangle.py @@ -1,32 +1,15 @@ -def area(a: float, b: float) -> float: - ''' - Вычисляет и возвращает площадь прямоугольника. - Параметры: - a (float): ширина прямоугольника, вещественное число - b (float): длина прямоугольника, вещественное число - Возвращаемое значение: - r_area (float): площадь прямоугольника, вычесленная по формуле r_area = a * b - Пример вызова: - Входные данные: 3.0, 5.0 - Результат: 15.0 - ''' - r_area = a * b - return r_area +def area(a, b): + if not isinstance(a, (int, float)) or not isinstance(b, (int, float)): + raise TypeError("Values must be numbers") + if a < 0 or b < 0: + raise ValueError("Values must be positive") + return a * b -def perimeter(a: float, b: float) -> float: - ''' - Вычисляет и возвращает периметр прямоугольника. - Параметры: - a (float): ширина прямоугольника, вещественное число - b (float): длина прямоугольника, вещественное число - Возвращаемое значение: - r_perimeter (float): периметр прямоугольника, вычесленный по формуле r_perimeter = (a + b) * 2 - Пример вызова: - Входные данные: 3.0, 5.0 - Результат: 16.0 - ''' - - r_perimeter = (a + b) * 2 - return r_perimeter \ No newline at end of file +def perimeter(a, b): + if not isinstance(a, (int, float)) or not isinstance(b, (int, float)): + raise TypeError("Values must be numbers") + if a < 0 or b < 0: + raise ValueError("Values must be positive") + return 2 * a + 2 * b \ No newline at end of file diff --git a/square.py b/square.py index 75d7e4b9f0..7db6b73984 100644 --- a/square.py +++ b/square.py @@ -1,34 +1,14 @@ -def area(a: float) -> float: - ''' - Вычисляет и возвращает площадь квадрата. - Параметры: - a (float): длина стороны квадрата, вещественное число - Возвращаемое значение: - s_area (float): площадь квадрата, вычесленная по формуле s_area = a ^ 2 def area(a): + if not isinstance(a, (int, float)): + raise TypeError("Value must be number") + if a < 0: + raise ValueError("Value must be positive") return a * a - Пример вызова: - Входные данные: 5.0 - Результат: 25.0 - ''' - s_area = a * a - return s_area def perimeter(a): - return 4 * a - -def perimeter(a: float) -> float: - ''' - Вычисляет и возвращает периметр квадрата. - Параметры: - a (float): длина стороны квадрата, вещественное число - Возвращаемое значение: - s_perimeter (float): периметр квадрата, вычесленный по формуле s_perimeter = 4 * a - Пример вызова: - Входные данные: 5.0 - Результат: 20.0 - ''' - - s_perimeter = 4 * a - return s_perimeter \ No newline at end of file + if not isinstance(a, (int, float)): + raise TypeError("Value must be number") + if a < 0: + raise ValueError("Value must be positive") + return 4 * a \ No newline at end of file diff --git a/test_circle.py b/test_circle.py new file mode 100644 index 0000000000..062d8f2294 --- /dev/null +++ b/test_circle.py @@ -0,0 +1,44 @@ +import circle +import unittest + + +class CircleTestCase(unittest.TestCase): + def test_area_zero(self): + res = circle.area(0) + self.assertEqual(res, 0) + + def test_area_negative(self): + with self.assertRaises(ValueError): + circle.area(-10) + + def test_area_str_input(self): + with self.assertRaises(TypeError): + circle.area("a") + + def test_area_none_value(self): + with self.assertRaises(TypeError): + circle.area(None) + + def test_area_big_value(self): + res = circle.area(10**10) + self.assertEqual(res, 0) + + def test_area_small_velue(self): + res = circle.area(10 ** - 10) + self.assertEqual(res, 0) + + def test_perimeter_zero(self): + res = circle.perimeter(0) + self.assertEqual(res, 0) + + def test_perimeter_negative(self): + with self.assertRaises(ValueError): + circle.perimeter(-10) + + def test_perimeter_str_input(self): + with self.assertRaises(TypeError): + circle.perimeter("a") + + def test_perimeter_none_value(self): + with self.assertRaises(TypeError): + circle.perimeter(None) \ No newline at end of file diff --git a/test_rectangle.py b/test_rectangle.py new file mode 100644 index 0000000000..0c09532ad6 --- /dev/null +++ b/test_rectangle.py @@ -0,0 +1,56 @@ +import rectangle +import unittest + + +class RectangleTestCase(unittest.TestCase): + def test_area_zero(self): + res = rectangle.area(10, 0) + self.assertEqual(res, 0) + + def test_area_square(self): + res = rectangle.area(10, 10) + self.assertEqual(res, 100) + + def test_area_negative(self): + with self.assertRaises(ValueError): + rectangle.area(-10, 0) + + def test_area_str_input(self): + with self.assertRaises(TypeError): + rectangle.area("a", 10) + + def test_area_none_value(self): + with self.assertRaises(TypeError): + rectangle.area(None, 10) + with self.assertRaises(TypeError): + rectangle.area(10, None) + + def test_area_big_value(self): + res = rectangle.area(10**10, 10**5) + self.assertEqual(res, 0) + + def test_area_small_velue(self): + res = rectangle.area(10 ** - 10, 10 ** 5) + self.assertEqual(res, 0) + + def test_perimeter_zero(self): + res = rectangle.perimeter(10, 0) + self.assertEqual(res, 20) + + def test_perimeter_square(self): + res = rectangle.perimeter(10, 10) + self.assertEqual(res, 40) + + def test_perimeter_negative(self): + with self.assertRaises(ValueError): + rectangle.perimeter(-10, 0) + + def test_perimeter_str_input(self): + with self.assertRaises(TypeError): + rectangle.perimeter("a", 0) + + def test_perimeter_none_value(self): + with self.assertRaises(TypeError): + rectangle.perimeter(None, 10) + with self.assertRaises(TypeError): + rectangle.perimeter(10, None) \ No newline at end of file diff --git a/test_square.py b/test_square.py new file mode 100644 index 0000000000..39917986a3 --- /dev/null +++ b/test_square.py @@ -0,0 +1,44 @@ +import square +import unittest + + +class SquareTestCase(unittest.TestCase): + def test_area_zero_int(self): + res = square.area(0) + self.assertEqual(res, 0) + + def test_area_negative(self): + with self.assertRaises(ValueError): + square.area(-10) + + def test_area_str_input(self): + with self.assertRaises(TypeError): + square.area("a") + + def test_area_none_value(self): + with self.assertRaises(TypeError): + square.area(None) + + def test_area_big_value(self): + res = square.area(10**10) + self.assertEqual(res, 0) + + def test_area_small_velue(self): + res = square.area(10 ** - 10) + self.assertEqual(res, 0) + + def test_perimeter_zero(self): + res = square.perimeter(0) + self.assertEqual(res, 0) + + def test_perimeter_negative(self): + with self.assertRaises(ValueError): + square.perimeter(-10) + + def test_perimeter_str_input(self): + with self.assertRaises(TypeError): + square.perimeter("a") + + def test_perimeter_none_value(self): + with self.assertRaises(TypeError): + square.perimeter(None) \ No newline at end of file diff --git a/test_triangle.py b/test_triangle.py new file mode 100644 index 0000000000..e063e896fc --- /dev/null +++ b/test_triangle.py @@ -0,0 +1,74 @@ +import triangle +import unittest + + +class TriangleTestCase(unittest.TestCase): + def test_area_zero_int(self): + res = triangle.area(10, 0) + self.assertEqual(res, 0) + + def test_area_zero_float(self): + res = triangle.area(10.6, 0) + self.assertEqual(res, 0) + + def test_area_negative(self): + with self.assertRaises(ValueError): + triangle.area(-10, 10) + with self.assertRaises(ValueError): + triangle.area(10, -10) + + def test_area_str_input(self): + with self.assertRaises(TypeError): + triangle.area("a", 10) + with self.assertRaises(TypeError): + triangle.area(10, "a") + + def test_area_negative(self): + with self.assertRaises(ValueError): + triangle.perimeter(-10, 10, 10) + + def test_area_none_value(self): + with self.assertRaises(TypeError): + triangle.area(None, 10) + with self.assertRaises(TypeError): + triangle.area(10, None) + + def test_area_big_value(self): + res = triangle.area(10**10, 10**5) + self.assertEqual(res, 0) + + def test_area_small_velue(self): + res = triangle.area(10 ** - 10, 10 ** 5) + self.assertEqual(res, 0) + + def test_perimeter_zero_int(self): + res = triangle.perimeter(10, 0, 20) + self.assertEqual(res, 30) + + def test_perimeter_zero_float(self): + res = triangle.perimeter(10.5, 0, 10.5) + self.assertEqual(res, 21) + + def test_perimeter_equilateral_int(self): + res = triangle.perimeter(10, 10, 10) + self.assertEqual(res, 30) + + def test_perimeter_equilateral_float(self): + res = triangle.perimeter(10.5, 10.5, 10.5) + self.assertEqual(res, 31.5) + + def test_perimetr_str_input(self): + with self.assertRaises(TypeError): + triangle.perimeter("a", 50, 50) + with self.assertRaises(TypeError): + triangle.perimeter(50, "a", 50) + with self.assertRaises(TypeError): + triangle.perimeter(50, 50, "a") + + def test_perimeter_none_value(self): + with self.assertRaises(TypeError): + triangle.perimeter(None, 10, 50) + with self.assertRaises(TypeError): + triangle.perimeter(10, None, 50) + with self.assertRaises(TypeError): + triangle.perimeter(10, 10, None) \ No newline at end of file diff --git a/triangle.py b/triangle.py index ce0b5ef694..e063e896fc 100644 --- a/triangle.py +++ b/triangle.py @@ -1,39 +1,74 @@ -def area(a: float, h: float) -> float: - ''' - Вычисляет и возвращает площадь треугольника. - Параметры: - a (float): сторона треугольника, вещественное число - h (float): высота треугольника, падающая на сторону a, вещественное число - Возвращаемое значение: - t_area (float): площадь треугольника, вычесленная по формуле t_area = a * h / 2 - Пример вызова: - Входные данные: 4.0, 6.0 - Результат: 12.0 - ''' - - t_area = a * h / 2 - return t_area - - -def perimeter(a: float, b: float, c: float) -> float: - ''' - Проверяет существование треугольника, вычисляет и возвращает его периметр. - Параметры: - a (float): 1 сторона треугольника, вещественное число - b (float): 2 сторона треугольника, вещественное число - c (float): 3 сторона треугольника, вещественное число - Возвращаемое значение: - t_perimeter (float): периметр треугольника, вычесленный по формуле t_perimeter = a + b + c - Пример вызова 1: - Входные данные: 3.0, 4.0, 5.0 - Результат: 12.0 - Пример вызова 2: - Входные данные: 100.0, 3.0, 5.0 - Результат: -1.0 - ''' - - if (a + b) <= c or (a + c) <= b or (b + c) <= a: - return -1.0 - - t_perimeter = a + b + c - return t_perimeter +import triangle +import unittest + + +class TriangleTestCase(unittest.TestCase): + def test_area_zero_int(self): + res = triangle.area(10, 0) + self.assertEqual(res, 0) + + def test_area_zero_float(self): + res = triangle.area(10.6, 0) + self.assertEqual(res, 0) + + def test_area_negative(self): + with self.assertRaises(ValueError): + triangle.area(-10, 10) + with self.assertRaises(ValueError): + triangle.area(10, -10) + + def test_area_str_input(self): + with self.assertRaises(TypeError): + triangle.area("a", 10) + with self.assertRaises(TypeError): + triangle.area(10, "a") + + def test_area_negative(self): + with self.assertRaises(ValueError): + triangle.perimeter(-10, 10, 10) + + def test_area_none_value(self): + with self.assertRaises(TypeError): + triangle.area(None, 10) + with self.assertRaises(TypeError): + triangle.area(10, None) + + def test_area_big_value(self): + res = triangle.area(10**10, 10**5) + self.assertEqual(res, 0) + + def test_area_small_velue(self): + res = triangle.area(10 ** - 10, 10 ** 5) + self.assertEqual(res, 0) + + def test_perimeter_zero_int(self): + res = triangle.perimeter(10, 0, 20) + self.assertEqual(res, 30) + + def test_perimeter_zero_float(self): + res = triangle.perimeter(10.5, 0, 10.5) + self.assertEqual(res, 21) + + def test_perimeter_equilateral_int(self): + res = triangle.perimeter(10, 10, 10) + self.assertEqual(res, 30) + + def test_perimeter_equilateral_float(self): + res = triangle.perimeter(10.5, 10.5, 10.5) + self.assertEqual(res, 31.5) + + def test_perimetr_str_input(self): + with self.assertRaises(TypeError): + triangle.perimeter("a", 50, 50) + with self.assertRaises(TypeError): + triangle.perimeter(50, "a", 50) + with self.assertRaises(TypeError): + triangle.perimeter(50, 50, "a") + + def test_perimeter_none_value(self): + with self.assertRaises(TypeError): + triangle.perimeter(None, 10, 50) + with self.assertRaises(TypeError): + triangle.perimeter(10, None, 50) + with self.assertRaises(TypeError): + triangle.perimeter(10, 10, None) \ No newline at end of file