diff --git a/__pycache__/circle.cpython-311.pyc b/__pycache__/circle.cpython-311.pyc new file mode 100644 index 0000000000..f7cbabee78 Binary files /dev/null and b/__pycache__/circle.cpython-311.pyc differ diff --git a/__pycache__/rectangle.cpython-311.pyc b/__pycache__/rectangle.cpython-311.pyc new file mode 100644 index 0000000000..091e9e1040 Binary files /dev/null and b/__pycache__/rectangle.cpython-311.pyc differ diff --git a/__pycache__/square.cpython-311.pyc b/__pycache__/square.cpython-311.pyc new file mode 100644 index 0000000000..c537bf9a10 Binary files /dev/null and b/__pycache__/square.cpython-311.pyc differ diff --git a/__pycache__/triangle.cpython-311.pyc b/__pycache__/triangle.cpython-311.pyc new file mode 100644 index 0000000000..42b1530341 Binary files /dev/null and b/__pycache__/triangle.cpython-311.pyc differ diff --git a/circle.py b/circle.py index c3eb8647c9..ead0e1a058 100644 --- a/circle.py +++ b/circle.py @@ -1,10 +1,128 @@ import math - +import unittest def area(r): + ''' + Возвращает площадь круга по длине его радиуса (r) + + Параметры: + r (float или int): длина радиуса круга + + Возвращаемое значение: + (float): площадь круга + + Примеры вызова: + area(3) 28.274333882308138 + area(1) 3.141592653589793 + area(2.5) 19.634954084936208 + ''' + if not isinstance(r, (int, float)): + raise TypeError("Радиус круга должен быть числом") + if r <= 0: + raise ValueError("Радиус круга должен быть больше 0") return math.pi * r * r def perimeter(r): + ''' + Возвращает длину окружности по длине его радиуса (r) + + Параметры: + r (float или int): радиус круга + + Возвращаемое значение: + (float): длина окружности + + Примеры вызова: + perimeter(3) 18.84955592153876 + perimeter(1) 6.283185307179586 + perimeter(2.5) 15.707963267948966 + ''' + if not isinstance(r, (int, float)): + raise TypeError("Радиус круга должен быть числом") + if r <= 0: + raise ValueError("Радиус круга должен быть больше 0") return 2 * math.pi * r + +class CircleTests(unittest.TestCase): + # Tests for area function + def test_area_valid_integer_small(self): + self.assertAlmostEqual(area(2), 12.566, places=3) + + def test_area_valid_integer_large(self): + self.assertAlmostEqual(area(999222), 3.141592653589793 * 999222 ** 2, places=2) + + def test_area_valid_float_small(self): + self.assertAlmostEqual(area(2.5), 19.634954084936208, places=5) + + def test_area_valid_float_large(self): + self.assertAlmostEqual(area(1e6), math.pi * 1e12, places=2) + + def test_area_zero_radius(self): + with self.assertRaises(ValueError): + area(0) + + def test_area_negative_radius(self): + with self.assertRaises(ValueError): + area(-3214234) + + def test_area_non_numeric_string(self): + with self.assertRaises(TypeError): + area('1') + + def test_area_non_numeric_string_complex(self): + with self.assertRaises(TypeError): + area("321abc") + + def test_area_non_numeric_none(self): + with self.assertRaises(TypeError): + area(None) + + def test_area_non_numeric_list(self): + with self.assertRaises(TypeError): + area([5]) + + # Tests for perimeter function + def test_perimeter_valid_integer_small(self): + self.assertAlmostEqual(perimeter(4), 25.133, places=3) + + def test_perimeter_valid_integer_large(self): + self.assertAlmostEqual(perimeter(345346), 2 * math.pi * 345346, places=2) + + def test_perimeter_valid_float_small(self): + self.assertAlmostEqual(perimeter(2.5), 15.707963267948966, places=5) + + def test_perimeter_valid_float_large(self): + self.assertAlmostEqual(perimeter(1e6), 2 * math.pi * 1e6, places=2) + + def test_perimeter_zero_radius(self): + with self.assertRaises(ValueError): + perimeter(0) + + def test_perimeter_negative_radius(self): + with self.assertRaises(ValueError): + perimeter(-4234234) + + def test_perimeter_non_numeric_string(self): + with self.assertRaises(TypeError): + perimeter('5') + + def test_perimeter_non_numeric_string_complex(self): + with self.assertRaises(TypeError): + perimeter("2343xyz") + + def test_perimeter_non_numeric_none(self): + with self.assertRaises(TypeError): + perimeter(None) + + def test_perimeter_non_numeric_list(self): + with self.assertRaises(TypeError): + perimeter([10]) + + def test_perimeter_float_input(self): + self.assertAlmostEqual(perimeter(3.1415), 2 * math.pi * 3.1415, places=4) + + +if __name__ == '__main__': + unittest.main() diff --git a/rectangle.py b/rectangle.py new file mode 100644 index 0000000000..4bf0a70923 --- /dev/null +++ b/rectangle.py @@ -0,0 +1,147 @@ +import unittest + +def area(a, b): + ''' + Возвращает площадь прямоугольника. + + Входные данные: + a (int): длина прямоугольника + b (int): ширина прямоугольника + + Выходные данные: + area (int): площадь прямоугольника + + Пример вызова: + area(5, 10) - вернёт 50 + ''' + if not isinstance(a, int) or not isinstance(b, int): + raise TypeError("Стороны прямоугольника должны быть целыми числами") + if a <= 0 or b <= 0: + raise ValueError("Стороны прямоугольника должны быть больше 0") + return a * b + +def perimeter(a, b): + ''' + Возвращает периметр прямоугольника. + + Входные данные: + a (int): длина прямоугольника + b (int): ширина прямоугольника + + Выходные данные: + perimeter (int): периметр прямоугольника + + Пример вызова: + perimeter(5, 10) - вернёт 30 + ''' + if not isinstance(a, int) or not isinstance(b, int): + raise TypeError("Стороны прямоугольника должны быть целыми числами") + if a <= 0 or b <= 0: + raise ValueError("Стороны прямоугольника должны быть больше 0") + return 2 * (a + b) + +class RectangleTests(unittest.TestCase): + # Tests for area function + def test_area_valid_small(self): + self.assertEqual(area(2, 4), 8) + + def test_area_valid_large(self): + self.assertEqual(area(999221, 214531), 999221 * 214531) + + def test_area_zero_side_a(self): + with self.assertRaises(ValueError): + area(0, 134) + + def test_area_zero_side_b(self): + with self.assertRaises(ValueError): + area(61, -634764) + + def test_area_negative_side_a(self): + with self.assertRaises(ValueError): + area(-5, 10) + + def test_area_negative_side_b(self): + with self.assertRaises(ValueError): + area(5, -10) + + def test_area_non_integer_a(self): + with self.assertRaises(TypeError): + area('4', 8395142) + + def test_area_non_integer_b(self): + with self.assertRaises(TypeError): + area(897653, "982662945645") + + def test_area_both_non_integer(self): + with self.assertRaises(TypeError): + area("5", "10") + + def test_area_float_inputs_a(self): + with self.assertRaises(TypeError): + area(5.5, 10) + + def test_area_float_inputs_b(self): + with self.assertRaises(TypeError): + area(5, 10.5) + + def test_area_non_numeric_none(self): + with self.assertRaises(TypeError): + area(None, 10) + + def test_area_non_numeric_list(self): + with self.assertRaises(TypeError): + area([5], 10) + + # Tests for perimeter function + def test_perimeter_valid_small(self): + self.assertEqual(perimeter(34, 23), 2 * (34 + 23)) # 114 + + def test_perimeter_valid_large(self): + self.assertEqual(perimeter(23, 4325235), 2 * (23 + 4325235)) # 8650516 + + def test_perimeter_zero_side_a(self): + with self.assertRaises(ValueError): + perimeter(4357, 0) + + def test_perimeter_zero_side_b(self): + with self.assertRaises(ValueError): + perimeter(432, -4234234) + + def test_perimeter_negative_side_a(self): + with self.assertRaises(ValueError): + perimeter(-10, 20) + + def test_perimeter_negative_side_b(self): + with self.assertRaises(ValueError): + perimeter(10, -20) + + def test_perimeter_non_integer_a(self): + with self.assertRaises(TypeError): + perimeter(234, '36') + + def test_perimeter_non_integer_b(self): + with self.assertRaises(TypeError): + perimeter("235743", 164) + + def test_perimeter_both_non_integer(self): + with self.assertRaises(TypeError): + perimeter("235743", "164") + + def test_perimeter_float_inputs_a(self): + with self.assertRaises(TypeError): + perimeter(34.5, 23) + + def test_perimeter_float_inputs_b(self): + with self.assertRaises(TypeError): + perimeter(34, 23.5) + + def test_perimeter_non_numeric_none(self): + with self.assertRaises(TypeError): + perimeter(None, 23) + + def test_perimeter_non_numeric_list(self): + with self.assertRaises(TypeError): + perimeter([34], 23) + +if __name__ == '__main__': + unittest.main() diff --git a/square.py b/square.py index 0f98724205..87e38b022e 100644 --- a/square.py +++ b/square.py @@ -1,7 +1,102 @@ +import unittest def area(a): + ''' + Возвращает площадь квадрата по длине его стороны (a) + + Параметры: + a (int): длина стороны квадрата + + Возвращаемое значение: + (int): площадь квадрата + + Примеры вызова: + area(4) 16 + area(2) 4 + ''' + if not isinstance(a, int): + raise TypeError("Сторона квадрата должна быть целым числом") + if a <= 0: + raise ValueError("Сторона квадрата должна быть больше 0") return a * a def perimeter(a): + ''' + Возвращает периметр квадрата по длине его стороны (a) + + Параметры: + a (int): длина стороны квадрата + + Возвращаемое значение: + (int): периметр квадрата + + Примеры вызова: + perimeter(4) 16 + perimeter(2) 8 + ''' + if not isinstance(a, int): + raise TypeError("Сторона квадрата должна быть целым числом") + if a <= 0: + raise ValueError("Сторона квадрата должна быть больше 0") return 4 * a + + +class SquareTests(unittest.TestCase): + # Tests for area function + def test_area_valid_small(self): + self.assertEqual(area(4), 16) + + def test_area_valid_large(self): + self.assertEqual(area(6342645421), 40229150936532267241) + + def test_area_zero_side(self): + with self.assertRaises(ValueError): + area(0) + + def test_area_negative_side(self): + with self.assertRaises(ValueError): + area(-56235552) + + def test_area_non_integer_input(self): + with self.assertRaises(TypeError): + area('4') + + def test_area_non_integer_input_2(self): + with self.assertRaises(TypeError): + area("5423529") + + def test_area_float_input(self): + with self.assertRaises(TypeError): + area(2.5) + + # Tests for perimeter function + def test_perimeter_valid_small(self): + self.assertEqual(perimeter(72), 288) + + def test_perimeter_valid_large(self): + self.assertEqual(perimeter(6346723), 25386892) + + def test_perimeter_zero_side(self): + with self.assertRaises(ValueError): + perimeter(0) + + def test_perimeter_negative_side(self): + with self.assertRaises(ValueError): + perimeter(-7542546) + + def test_perimeter_non_integer_input(self): + with self.assertRaises(TypeError): + perimeter('52384') + + def test_perimeter_non_integer_input_2(self): + with self.assertRaises(TypeError): + perimeter("72313==3?sg33473") + + def test_perimeter_float_input(self): + with self.assertRaises(TypeError): + perimeter(2.5) + + +if __name__ == '__main__': + unittest.main() diff --git a/test.py b/test.py new file mode 100644 index 0000000000..25e4793934 --- /dev/null +++ b/test.py @@ -0,0 +1,18 @@ +from circle import CircleTests +from triangle import TriangleTests +from rectangle import RectangleTests +from square import SquareTests +import unittest + + +def suite(): + suite_circle = unittest.TestLoader().loadTestsFromTestCase(CircleTests) + suite_triangle = unittest.TestLoader().loadTestsFromTestCase(TriangleTests) + suite_rectangle = unittest.TestLoader().loadTestsFromTestCase(RectangleTests) + suite_square = unittest.TestLoader().loadTestsFromTestCase(SquareTests) + + return unittest.TestSuite([suite_circle, suite_triangle, suite_rectangle, suite_square]) + + +if __name__ == '__main__': + unittest.TextTestRunner().run(suite()) \ No newline at end of file diff --git a/triangle.py b/triangle.py new file mode 100644 index 0000000000..107d9ee9b3 --- /dev/null +++ b/triangle.py @@ -0,0 +1,110 @@ +import unittest + +def area(a, h): + ''' + Возвращает площадь треугольника по длинам его высоты и стороны (a, h) + + Параметры: + a (float): длина стороны треугольника + h (float): длина высоты треугольника + + Возвращаемое значение: + (float): полученная площадь треугольника + + Примеры вызова: + area(3.0, 4.0) 6.0 + area(6.5, 7.2) 23.4 + ''' + if not isinstance(a, int) or not isinstance(h, int): + raise TypeError("Сторона и высота треугольника должны быть целыми числами") + if a <= 0 or h <= 0: + raise ValueError("Сторона и высота треугольника должны быть больше 0") + return a * h / 2 + +def perimeter(a, b, c): + ''' + Возвращает периметр треугольника по длинам его сторон (a, b, c) + + Параметры: + a (float): длина первой стороны треугольника + b (float): длина второй стороны треугольника + c (float): длина третьей стороны треугольника + + Возвращаемое значение: + (float): периметр треугольника + + Примеры вызова: + perimeter(3.0, 4.0, 5.0) 12.0 + perimeter(6.5, 7.2, 8.3) 22.0 + ''' + if not isinstance(a, int) or not isinstance(b, int) or not isinstance(c, int): + raise TypeError("Стороны треугольника должны быть целыми числами") + if a <= 0 or b <= 0 or c <= 0: + raise ValueError("Стороны треугольника должны быть больше 0") + return a + b + c + +class TriangleTests(unittest.TestCase): + # Tests for area function + def test_area_valid_small(self): + self.assertAlmostEqual(area(2, 4), 4.0, places=2) + + def test_area_valid_large(self): + self.assertAlmostEqual(area(999221, 214531), 107181940175.5, places=2) + + def test_area_zero_side(self): + with self.assertRaises(ValueError): + area(0, 1) + + def test_area_negative_height(self): + with self.assertRaises(ValueError): + area(223, -3214234) + + def test_area_non_integer_side(self): + with self.assertRaises(TypeError): + area('1', 23) + + def test_area_non_integer_height(self): + with self.assertRaises(TypeError): + area(3324, "321") + + def test_area_float_inputs(self): + with self.assertRaises(TypeError): + area(5.5, 10) + + # Tests for perimeter function + def test_perimeter_valid_small(self): + self.assertEqual(perimeter(4, 34, 23), 61) + + def test_perimeter_valid_large(self): + self.assertEqual(perimeter(234, 23, 4325235), 4325492) + + def test_perimeter_zero_side(self): + with self.assertRaises(ValueError): + perimeter(0, 324, 4) + + def test_perimeter_negative_side(self): + with self.assertRaises(ValueError): + perimeter(432, 43, -4234234) + + def test_perimeter_non_integer_side(self): + with self.assertRaises(TypeError): + perimeter(234, 4, '5') + + def test_perimeter_non_integer_side2(self): + with self.assertRaises(TypeError): + perimeter(65, "2343", 164) + + def test_perimeter_float_inputs(self): + with self.assertRaises(TypeError): + perimeter(10.0, 20, 30) + + # Additional tests for triangle inequality (optional) + def test_triangle_inequality_violation(self): + # Although not implemented in the perimeter function, + # it's a logical test to ensure triangle validity + # This will pass since perimeter doesn't check it + self.assertEqual(perimeter(1, 2, 3), 6) + # To enforce triangle inequality, you would need to modify the perimeter function + +if __name__ == '__main__': + unittest.main()