diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000000..9412b7842d --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,36 @@ + +name: Testing + +on: + push: + +jobs: + ubuntu_test: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: Run tests + run: python -m unittest discover -s . -p "*.py" + + windows_test: + runs-on: windows-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: Run tests + run: python -m unittest discover -s . -p "*.py" diff --git a/circle.py b/circle.py index c3eb8647c9..796d6d4ad8 100644 --- a/circle.py +++ b/circle.py @@ -1,10 +1,69 @@ import math - +import unittest def area(r): + ''' + Takes circle radius value, returns circle area value + + Example: + area(3) + 28.274333882308138 + ''' + if not isinstance(r, int): + print("Not integer") + return 0 + if r < 0: + print("Negative number") + return 0 return math.pi * r * r def perimeter(r): + ''' + Takes circle radius value, returns circuit value + + Example: + perimeter(3) + 18.84955592153876 + ''' + if not isinstance(r, int): + print("Not integer") + return 0 + if r < 0: + print("Negative number") + return 0 return 2 * math.pi * r + +class CircleTestCase(unittest.TestCase): + def test_zero_area(self): + res = area(0) + self.assertEqual(res, 0) + + def test_regular_area(self): + res = area(10) + self.assertEqual(res, 314.1592653589793) + + def test_str_area(self): + res = area("a") + self.assertEqual(res, 0) + + def test_negative_area(self): + res = area(-2) + self.assertEqual(res, 0) + + def test_zero_perimeter(self): + res = perimeter(0) + self.assertEqual(res, 0) + + def test_regular_perimeter(self): + res = perimeter(3) + self.assertEqual(res, 18.84955592153876) + + def test_str_perimeter(self): + res = perimeter("a") + self.assertEqual(res, 0) + + def test_negative_perimeter(self): + res = perimeter(-2) + self.assertEqual(res, 0) diff --git a/docs/README.md b/docs/README.md index 63f8727939..7776867eba 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,10 +1,156 @@ # Math formulas +**Geometric_lib allows to use following math formulas in Python:** ## Area + - Circle: S = πR² + - Rectangle: S = ab + - Square: S = a² +- Triangle: S = ah² + + + ## Perimeter + - Circle: P = 2πR + - Rectangle: P = 2a + 2b -- Square: P = 4a \ No newline at end of file + +- Square: P = 4a + +- Triangle: P = a + b + c + + + +# Functions of math formulas + +## Circle +### Area +Takes circle radius value, returns circle area value. +``` +def area(r): + return math.pi * r * r +``` +***Example of function call:*** +``` +area(3) +28.274333882308138 +``` + +### Perimeter +Takes circle radius value, returns circuit value. +``` +def perimeter(r): + return 2 * math.pi * r +``` +***Example of function call:*** +``` +perimeter(3) +18.84955592153876 +``` + +## Rectangle +### Area +Takes rectangle sides length, returns value of rectangle area. +``` +def area(a, b): + return a * b +``` +***Example of function call:*** +``` +area(2, 3) +6 +``` + +### Perimeter +Takes rectangle sides length, returns value of rectangle perimeter. +``` +def perimeter(a, b): + return 2 * (a + b) +``` +***Example of function call:*** +``` +perimeter(2, 5) +14 +``` + + +## Square +### Area +Takes square side length, returns value of square area. +``` +def area(a): + return a * a +``` +***Example of function call:*** +``` +area(4) +16 +``` + +### Perimeter +Takes square side length, returns value of square perimeter. +``` +def perimeter(a): + return 4 * a +``` +***Example of function call:*** +``` +perimeter(3) +12 +``` + + +## Triangle +### Area +Takes lengths of the triangle side and triangle height, returns area of the triangle. +``` +def area(a, h): + return a * h / 2 +``` +***Example of function call:*** +``` +area(3, 4) +6 +``` + +### Perimeter +Takes lengths of the triangle sides, returns perimeter of the triangle. +``` +def perimeter(a, b, c): + return a + b + c +``` +***Example of function call:*** +``` +perimeter(3, 2, 5) +10 +``` + + +# History of project changes + +**Commit** ***[a789aa9941a5de78197017f271e52e7b8f181ba6](https://github.com/kseni-sch/geometric_lib/commit/a789aa9941a5de78197017f271e52e7b8f181ba6):*** +``` +Author: kseni-sch <468150@niuitmo.ru> +Date: Wed Sep 25 11:23:08 2024 +0300 + + Added file rectangle.py +``` + +**Commit** ***[d09b839b6f1d79bdf6c7b3325e9a93b894737ed5](https://github.com/kseni-sch/geometric_lib/commit/d09b839b6f1d79bdf6c7b3325e9a93b894737ed5):*** +``` +Author: kseni-sch <468150@niuitmo.ru> +Date: Wed Sep 25 11:45:11 2024 +0300 + + Fixed file rectangle.py and added file triangle.py +``` + +**Commit** ***[1a5ecc8be2ec4ad5edb9bb5a76af61415e2e42e5](https://github.com/kseni-sch/geometric_lib/commit/1a5ecc8be2ec4ad5edb9bb5a76af61415e2e42e5):*** +``` +Author: kseni-sch <468150@niuitmo.ru> +Date: Tue Nov 5 02:10:03 2024 +0300 + + Created tests for all functions +``` \ No newline at end of file diff --git a/rectangle.py b/rectangle.py new file mode 100644 index 0000000000..5a77ab06bd --- /dev/null +++ b/rectangle.py @@ -0,0 +1,68 @@ +import unittest + +def area(a, b): + ''' + Takes rectangle sides length, returns value of rectangle area + + Example: + area(2, 3) + 6 + ''' + if not isinstance(a, int) or not isinstance(b, int): + print("Not integer") + return 0 + if a < 0 or b < 0: + print("Negative number") + return 0 + return a * b + + +def perimeter(a, b): + ''' + Takes rectangle sides length, returns value of rectangle perimeter + + Example: + perimeter(2, 5) + 14 + ''' + if not isinstance(a, int) or not isinstance(b, int): + print("Not integer") + return 0 + if a < 0 or b < 0: + print("Negative number") + return 0 + return 2 * (a + b) + + +class RectangleTestCase(unittest.TestCase): + def test_zero_area(self): + res = area(10, 0) + self.assertEqual(res, 0) + + def test_regular_area(self): + res = area(10, 5) + self.assertEqual(res, 50) + + def test_str_area(self): + res = area(10, "a") + self.assertEqual(res, 0) + + def test_negative_area(self): + res = area(10, -2) + self.assertEqual(res, 0) + + def test_zero_perimeter(self): + res = perimeter(10, 0) + self.assertEqual(res, 20) + + def test_regular_perimeter(self): + res = perimeter(10, 5) + self.assertEqual(res, 30) + + def test_str_perimeter(self): + res = perimeter(10, "a") + self.assertEqual(res, 0) + + def test_negative_perimeter(self): + res = perimeter(10, -2) + self.assertEqual(res, 0) diff --git a/square.py b/square.py index 0f98724205..c9be0de293 100644 --- a/square.py +++ b/square.py @@ -1,7 +1,68 @@ +import unittest def area(a): + ''' + Takes square side length, returns value of square area + + Example: + area(4) + 16 + ''' + if not isinstance(a, int): + print("Not integer") + return 0 + if a < 0: + print("Negative number") + return 0 return a * a def perimeter(a): + ''' + Takes square side length, returns value of square perimeter + + Example: + perimeter(3) + 12 + ''' + if not isinstance(a, int): + print("Not integer") + return 0 + if a < 0: + print("Negative number") + return 0 return 4 * a + + +class SquareTestCase(unittest.TestCase): + def test_zero_area(self): + res = area(0) + self.assertEqual(res, 0) + + def test_regular_area(self): + res = area(10) + self.assertEqual(res, 100) + + def test_str_area(self): + res = area("a") + self.assertEqual(res, 0) + + def test_negative_area(self): + res = area(-2) + self.assertEqual(res, 0) + + def test_zero_perimeter(self): + res = perimeter(0) + self.assertEqual(res, 0) + + def test_regular_perimeter(self): + res = perimeter(3) + self.assertEqual(res, 12) + + def test_str_perimeter(self): + res = perimeter("a") + self.assertEqual(res, 0) + + def test_negative_perimeter(self): + res = perimeter(-2) + self.assertEqual(res, 0) diff --git a/triangle.py b/triangle.py new file mode 100644 index 0000000000..b10e36fcc5 --- /dev/null +++ b/triangle.py @@ -0,0 +1,67 @@ +import unittest + +def area(a, h): + ''' + Takes lengths of the triangle side and triangle height, returns area of the triangle + + Example: + area(3, 4) + 6 + ''' + if not isinstance(a, int) or not isinstance(h, int): + print("Not integer") + return 0 + if a < 0 or h < 0: + print("Negative number") + return 0 + return a * h / 2 + +def perimeter(a, b, c): + ''' + Takes lengths of the triangle sides, returns perimeter of the triangle + + Example: + perimeter(3, 2, 5) + 10 + ''' + if not isinstance(a, int) or not isinstance(b, int) or not isinstance(c, int): + print("Not integer") + return 0 + if a < 0 or b < 0 or c < 0: + print("Negative number") + return 0 + return a + b + c + + +class TriangleTestCase(unittest.TestCase): + def test_zero_area(self): + res = area(10, 0) + self.assertEqual(res, 0) + + def test_regular_area(self): + res = area(5, 3) + self.assertEqual(res, 7.5) + + def test_str_area(self): + res = area(10, "a") + self.assertEqual(res, 0) + + def test_negative_area(self): + res = area(10, -2) + self.assertEqual(res, 0) + + def test_zero_perimeter(self): + res = perimeter(10, 0, 4) + self.assertEqual(res, 14) + + def test_regular_perimeter(self): + res = perimeter(10, 5, 7) + self.assertEqual(res, 22) + + def test_str_perimeter(self): + res = perimeter(10, "a", 3) + self.assertEqual(res, 0) + + def test_negative_perimeter(self): + res = perimeter(10, -2, 5) + self.assertEqual(res, 0)