diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000000..125988a1d9 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,35 @@ +name: CI + +on: + push: + branches-ignore: + - 'main' + - 'lab_work_2_466894' + - 'lab_work_3_466894' + - 'lab_work_4_466894' + + workflow_dispatch: + +jobs: + test: + name: Run Unit Tests + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: [ubuntu-latest, windows-latest] + + steps: + # parsing the code from the repository + - name: Checkout repository + uses: actions/checkout@v3 + + # python set-up + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: 3.11 + + # Running unit-tests + - name: Run Unit Tests + run: python -m unittest discover diff --git a/circle.py b/circle.py index c3eb8647c9..c017c319c5 100644 --- a/circle.py +++ b/circle.py @@ -2,9 +2,40 @@ def area(r): + """ + Принимает радиус, возвращает площадь круга + + Параметр: + r (int): радиус + Возвращаемое значачение: + math.pi * r * r (float): площадь круга + + Примеры: + area(3) --> 9pi + area(2) --> 4pi + """ + + if r <= 0: + raise ValueError("radius can't be negative or equal to zero") + return math.pi * r * r def perimeter(r): - return 2 * math.pi * r + """ + Принимает радиус, возвращает периметр круга + Параметр: + r (int): радиус + Возвращаемое значение: + 2 * math.pi * r (float): периметр круга + + Примеры: + perimeter(3) --> 6pi + perimeter(2) --> 4pi + """ + + if r <= 0: + raise ValueError("radius can't be or equal to zero") + + return 2 * math.pi * r diff --git a/docs/README.md b/docs/README.md index 63f8727939..7b0df86697 100644 --- a/docs/README.md +++ b/docs/README.md @@ -7,4 +7,51 @@ ## Perimeter - Circle: P = 2πR - Rectangle: P = 2a + 2b -- Square: P = 4a \ No newline at end of file +- Square: P = 4a +--- +*Hash of the commit, which the following documentation was added in:* `[3fea8dcd2794d25b67fc722559d68d46335c3a1b](https://github.com/MurzikKrot/geometric_lib/commit/3fea8dcd2794d25b67fc722559d68d46335c3a1b)` +# **[Сircle.py](https://github.com/MurzikKrot/geometric_lib/blob/lab_work_2_466894/circle.py) description** +This file contains 2 functions `area` and `perimeter`. +## **area** +This function calculates an area of a circle of given radius. +### Parameters +**`r`** - radius of the circle of type `int` . +### Return Value +Area of the circle of type `float`. +### Examples +\(pi rounded to 3,14) +- `area(5)` --> `78,5` +- `area(6)` --> `113,04` + +## **perimeter** +This function calculates a perimeter of a circle of given radius. +### Parameters +**`r`** - radius of the circle of type `int` . +### Return Value +Perimeter of the circle of type `float`. +### Examples +\(pi rounded to 3,14) +- `perimeter(5)` --> `31,4` +- `perimeter(6)` --> `37,68` +--- +# **[Square.py](https://github.com/MurzikKrot/geometric_lib/blob/lab_work_2_466894/square.py) description** +This file contains 2 functions `area` and `perimeter`. +## **area** +This function calculates an area of a square of given length of a side. +### Parameters +**`a`** - length of a side of the square of type `int` . +### Return Value +Area of the square of tupe `int`. +### Examples +- `area(5)` --> `25` +- `area(6)` --> `36` + +## **perimeter** +This function calculates a perimeter of a square of given length of a side. +### Parameters +**`a`** - length of a side of the square of type `int` . +### Return Value +Perimeter of the square of tнpe `int`. +### Examples +- `perimeter(5)` --> `20` +- `perimeter(6)` --> `24` \ No newline at end of file diff --git a/rectangle.py b/rectangle.py new file mode 100644 index 0000000000..d9e7073e86 --- /dev/null +++ b/rectangle.py @@ -0,0 +1,44 @@ +def area(a, b): + """ + Принимает длину и ширину, возвращает площадь прямоугольника + + Параметры: + a (int): длина + h (int): ширина + Возвращаемое значачение: + a * h (int): площадь прямоугольника + + Примеры: + area(3, 5) --> 15 + area(1, 2) --> 2 + """ + + if a <= 0: + raise ValueError("length can't be negative or equal to zero") + elif b <= 0: + raise ValueError("width can't be negative or equal to zero") + + return a * b + + +def perimeter(a, b): + """ + Принимает длину и ширину, возвращает периметр прямоугольника + + Параметры: + a (int): длина + h (int): ширина + Возвращаемое значачение: + (a + h)*2 (int): периметр прямоугольника + + Примеры: + perimeter(3, 5) --> 16 + perimeter(1, 2) --> 6 + """ + + if a <= 0: + raise ValueError("length can't be negative or equal to zero") + elif b <= 0: + raise ValueError("width can't be negative or equal to zero") + + return (a + b)*2 diff --git a/square.py b/square.py index 0f98724205..5bcc62a0f4 100644 --- a/square.py +++ b/square.py @@ -1,7 +1,39 @@ def area(a): + """ + Принимает длину стороны квадрата, возвращает его площадь + + Параметр: + a (int): длина стороны квадрата + Возвращаемое значение: + a * a (int): площадь квадрата + + Примеры: + area(3) --> 9 + area(2) --> 4 + """ + + if a <= 0: + raise ValueError("length can't be negative or equal to zero") + return a * a def perimeter(a): + """ + Принимает длину стороны квадрата, возвращает его периметр + + Параметр: + a (int): длина стороны квадрата + Возвращаемое значение: + 4 * a (int): периметр квадрата + + Примеры: + perimeter(3) --> 12 + perimeter(2) --> 8 + """ + + if a <= 0: + raise ValueError("length can't be negative or equal to zero") + return 4 * a diff --git a/testCircle.py b/testCircle.py new file mode 100644 index 0000000000..6301f5e084 --- /dev/null +++ b/testCircle.py @@ -0,0 +1,20 @@ +import unittest +import circle + + +class TestCircle(unittest.TestCase): + def test_area(self): + self.assertAlmostEqual(circle.area(3), 28.274, 3) + self.assertAlmostEqual(circle.area(2), 12.566, 3) + + self.assertRaises(ValueError, circle.area, -5) + + def test_perimeter(self): + self.assertAlmostEqual(circle.perimeter(3), 18.850, 3) + self.assertAlmostEqual(circle.perimeter(2), 12.566, 3) + + self.assertRaises(ValueError, circle.perimeter, -5) + + +if __name__ == '__main__': + unittest.main() diff --git a/testRectangle.py b/testRectangle.py new file mode 100644 index 0000000000..38a25e4ed3 --- /dev/null +++ b/testRectangle.py @@ -0,0 +1,24 @@ +import unittest +import rectangle + + +class TestRectangle(unittest.TestCase): + def test_area(self): + self.assertEqual(rectangle.area(3, 5), 15) + self.assertEqual(rectangle.area(1, 2), 2) + + self.assertRaises(ValueError, rectangle.area, -5, 1) + self.assertRaises(ValueError, rectangle.area, 5, -1) + self.assertRaises(ValueError, rectangle.area, -5, -1) + + def test_perimeter(self): + self.assertEqual(rectangle.perimeter(3, 5), 16) + self.assertEqual(rectangle.perimeter(1, 2), 6) + + self.assertRaises(ValueError, rectangle.perimeter, -5, 1) + self.assertRaises(ValueError, rectangle.perimeter, 5, -1) + self.assertRaises(ValueError, rectangle.perimeter, -5, -1) + + +if __name__ == '__main__': + unittest.main() diff --git a/testSquare.py b/testSquare.py new file mode 100644 index 0000000000..20e0d74a4d --- /dev/null +++ b/testSquare.py @@ -0,0 +1,20 @@ +import unittest +import square + + +class Testsquare(unittest.TestCase): + def test_area(self): + self.assertEqual(square.area(3), 9) + self.assertEqual(square.area(2), 4) + + self.assertRaises(ValueError, square.area, -5) + + def test_perimeter(self): + self.assertEqual(square.perimeter(3), 12) + self.assertEqual(square.perimeter(2), 8) + + self.assertRaises(ValueError, square.perimeter, -5) + + +if __name__ == '__main__': + unittest.main() diff --git a/testTriangle.py b/testTriangle.py new file mode 100644 index 0000000000..c5f22b18c7 --- /dev/null +++ b/testTriangle.py @@ -0,0 +1,24 @@ +import unittest +import triangle + + +class TestTriangle(unittest.TestCase): + def test_area(self): + self.assertEqual(triangle.area(3, 5), 7.5) + self.assertEqual(triangle.area(1, 2), 1.0) + + self.assertRaises(ValueError, triangle.area, -5, 1) + self.assertRaises(ValueError, triangle.area, 5, -1) + self.assertRaises(ValueError, triangle.area, -5, -1) + + def test_perimeter(self): + self.assertEqual(triangle.perimeter(3, 5, 6), 14) + self.assertEqual(triangle.perimeter(1, 2, 3), 6) + + self.assertRaises(ValueError, triangle.perimeter, -5, 1, 3) + self.assertRaises(ValueError, triangle.perimeter, 5, -1, 3) + self.assertRaises(ValueError, triangle.perimeter, -5, -1, -3) + + +if __name__ == '__main__': + unittest.main() diff --git a/triangle.py b/triangle.py new file mode 100644 index 0000000000..3d36b18c33 --- /dev/null +++ b/triangle.py @@ -0,0 +1,47 @@ +def area(a: int, h: int): + """ + Принимает длину основания и высоту, возвращает площадь треугольника + + Параметры: + a (int): длина основания + h (int): высота + Возвращаемое значение: + a * h / 2 (float): площадь треугольника + + Примеры: + area(3, 5) --> 7.5 + area(1, 2) --> 1.0 + """ + + if a <= 0: + raise ValueError("length can't be negative or equal to zero") + elif h <= 0: + raise ValueError("height can't be negative or equal to zero") + + return a * h / 2 + + +def perimeter(a, b, c): + """ + Принимает длины 3-х сторон, возвращает периметр треугольника + + Параметры: + a (int): длина 1 стороны + b (int): длина 2 стороны + c (int): длина 3 стороны + Возвращаемое значение: + a + b + c (int): периметр треугольника + + Примеры: + perimeter(3, 5, 6) --> 14 + perimeter(1, 2, 3) --> 6 + """ + + if a <= 0: + raise ValueError("length can't be negative or equal to zero") + elif b <= 0: + raise ValueError("length can't be negative or equal to zero") + elif c <= 0: + raise ValueError("length can't be negative or equal to zero") + + return a + b + c