commit ba1b4b80df4eef1e0cc706ba0dcb68ca9369bbec Author: Randell Dawson Date: Tue Sep 29 10:14:39 2020 -0700 initial commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..21e4598 --- /dev/null +++ b/README.md @@ -0,0 +1,76 @@ +### Assignment + +In this project you will use object oriented programming to create a Rectangle class and a Square class. The Square class should be a subclass of Rectangle and inherit methods and attributes. + +#### Rectangle class +When a Rectangle object is created, it should be initialized with `width` and `height` attributes. The class should also contain the following methods: +* `set_width` +* `set_height` +* `get_area`: Returns area (`width * height`) +* `get_perimeter`: Returns perimeter (`2 * width + 2 * height`) +* `get_diagonal`: Returns diagonal (`(width ** 2 + height ** 2) ** .5`) +* `get_picture`: Returns a string that represents the shape using lines of "\*". The number of lines should be equal to the height and the number of "\*" in each line should be equal to the width. There should be a new line (`\n`) at the end of each line. If the width or height is larger than 50, this should return the string: "Too big for picture.". +* `get_amount_inside`: Takes another shape (square or rectangle) as an argument. Returns the number of times the passed in shape could fit inside the shape (with no rotations). For instance, a rectangle with a width of 4 and a height of 8 could fit in two squares with sides of 4. + +Additionally, if an instance of a Rectangle is represented as a string, it should look like: `Rectangle(width=5, height=10)` + +#### Square class +The Square class should be a subclass of Rectangle. When a Square object is created, a single side length is passed in. The `__init__` method should store the side length in both the `width` and `height` attributes from the Rectangle class. + +The Square class should be able to access the Rectangle class methods but should also contain a `set_side` method. If an instance of a Square is represented as a string, it should look like: `Square(side=9)` + +Additionally, the `set_width` and `set_height` methods on the Square class should set both the width and height. + +#### Usage example +```py +rect = shape_calculator.Rectangle(10, 5) +print(rect.get_area()) +rect.set_height(3) +print(rect.get_perimeter()) +print(rect) +print(rect.get_picture()) + +sq = shape_calculator.Square(9) +print(sq.get_area()) +sq.set_side(4) +print(sq.get_diagonal()) +print(sq) +print(sq.get_picture()) + +rect.set_height(8) +rect.set_width(16) +print(rect.get_amount_inside(sq)) +``` +That code should return: +``` +50 +26 +Rectangle(width=10, height=3) +********** +********** +********** + +81 +5.656854249492381 +Square(side=4) +**** +**** +**** +**** + +8 +``` + +The unit tests for this project are in `test_module.py`. + +### Development + +Write your code in `shape_calculator.py`. For development, you can use `main.py` to test your `shape_calculator()` function. Click the "run" button and `main.py` will run. + +### Testing + +We imported the tests from `test_module.py` to `main.py` for your convenience. The tests will run automatically whenever you hit the "run" button. + +### Submitting + +Copy your project's URL and submit it to freeCodeCamp. diff --git a/main.py b/main.py new file mode 100644 index 0000000..d4354fa --- /dev/null +++ b/main.py @@ -0,0 +1,20 @@ +# This entrypoint file to be used in development. Start by reading README.md +import shape_calculator +from unittest import main + + +rect = shape_calculator.Rectangle(5, 10) +print(rect.get_area()) +rect.set_width(3) +print(rect.get_perimeter()) +print(rect) + +sq = shape_calculator.Square(9) +print(sq.get_area()) +sq.set_side(4) +print(sq.get_diagonal()) +print(sq) + + +# Run unit tests automatically +main(module='test_module', exit=False) \ No newline at end of file diff --git a/shape_calculator.py b/shape_calculator.py new file mode 100644 index 0000000..e210be6 --- /dev/null +++ b/shape_calculator.py @@ -0,0 +1,6 @@ +class Rectangle: + + + + +class Square: diff --git a/test_module.py b/test_module.py new file mode 100644 index 0000000..9f827cb --- /dev/null +++ b/test_module.py @@ -0,0 +1,115 @@ +import unittest +import shape_calculator + + +class UnitTests(unittest.TestCase): + def setUp(self): + self.rect = shape_calculator.Rectangle(3, 6) + self.sq = shape_calculator.Square(5) + + def test_subclass(self): + actual = issubclass(shape_calculator.Square, shape_calculator.Rectangle) + expected = True + self.assertEqual(actual, expected, 'Expected Square class to be a subclass of the Rectangle class.') + + def test_distinct_classes(self): + actual = shape_calculator.Square is not shape_calculator.Rectangle + expected = True + self.assertEqual(actual, expected, 'Expected Square class to be a distinct class from the Rectangle class.') + + def test_square_is_square_and_rectangle(self): + actual = isinstance(self.sq, shape_calculator.Square) and isinstance(self.sq, shape_calculator.Square) + expected = True + self.assertEqual(actual, expected, 'Expected square object to be an instance of the Square class and the Rectangle class.') + + def test_rectangle_string(self): + actual = str(self.rect) + expected = "Rectangle(width=3, height=6)" + self.assertEqual(actual, expected, 'Expected string representation of rectangle to be "Rectangle(width=3, height=6)"') + + def test_square_string(self): + actual = str(self.sq) + expected = "Square(side=5)" + self.assertEqual(actual, expected, 'Expected string representation of square to be "Square(side=5)"') + + def test_area(self): + actual = self.rect.get_area() + expected = 18 + self.assertEqual(actual, expected, 'Expected area of rectangle to be 18') + actual = self.sq.get_area() + expected = 25 + self.assertEqual(actual, expected, 'Expected area of rectangle to be 25') + + + def test_perimeter(self): + actual = self.rect.get_perimeter() + expected = 18 + self.assertEqual(actual, expected, 'Expected perimeter of rectangle to be 18') + actual = self.sq.get_perimeter() + expected = 20 + self.assertEqual(actual, expected, 'Expected perimeter of rectangle to be 20') + + def test_diagonal(self): + actual = self.rect.get_diagonal() + expected = 6.708203932499369 + self.assertEqual(actual, expected, 'Expected diagonal of rectangle to be 6.708203932499369') + actual = self.sq.get_diagonal() + expected = 7.0710678118654755 + self.assertEqual(actual, expected, 'Expected diagonal of rectangle to be 7.0710678118654755') + + def test_set_atributes(self): + self.rect.set_width(7) + self.rect.set_height(8) + self.sq.set_side(2) + actual = str(self.rect) + expected = "Rectangle(width=7, height=8)" + self.assertEqual(actual, expected, 'Expected string representation of rectangle after setting new values to be "Rectangle(width=7, height=8)"') + actual = str(self.sq) + expected = "Square(side=2)" + self.assertEqual(actual, expected, 'Expected string representation of square after setting new values to be "Square(side=2)"') + self.sq.set_width(4) + actual = str(self.sq) + expected = "Square(side=4)" + self.assertEqual(actual, expected, 'Expected string representation of square after setting width to be "Square(side=4)"') + + def test_rectangle_picture(self): + self.rect.set_width(7) + self.rect.set_height(3) + actual = self.rect.get_picture() + expected = "*******\n*******\n*******\n" + self.assertEqual(actual, expected, 'Expected rectangle picture to be different.') + + def test_squaree_picture(self): + self.sq.set_side(2) + actual = self.sq.get_picture() + expected = "**\n**\n" + self.assertEqual(actual, expected, 'Expected square picture to be different.') + + def test_big_picture(self): + self.rect.set_width(51) + self.rect.set_height(3) + actual = self.rect.get_picture() + expected = "Too big for picture." + self.assertEqual(actual, expected, 'Expected message: "Too big for picture."') + + def test_get_amount_inside(self): + self.rect.set_height(10) + self.rect.set_width(15) + actual = self.rect.get_amount_inside(self.sq) + expected = 6 + self.assertEqual(actual, expected, 'Expected `get_amount_inside` to return 6.') + + def test_get_amount_inside_two_rectangles(self): + rect2 = shape_calculator.Rectangle(4, 8) + actual = rect2.get_amount_inside(self.rect) + expected = 1 + self.assertEqual(actual, expected, 'Expected `get_amount_inside` to return 1.') + + def test_get_amount_inside_none(self): + rect2 = shape_calculator.Rectangle(2, 3) + actual = rect2.get_amount_inside(self.rect) + expected = 0 + self.assertEqual(actual, expected, 'Expected `get_amount_inside` to return 0.') + +if __name__ == "__main__": + unittest.main() \ No newline at end of file