diff --git a/cp/ex09/__init__.py b/cp/ex09/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..c9bf24e54d475806d511254e677f9f48d430f544 --- /dev/null +++ b/cp/ex09/__init__.py @@ -0,0 +1 @@ +"""DO NOT EDIT/ADD TO THIS FILE.""" diff --git a/cp/ex09/rectangle.py b/cp/ex09/rectangle.py new file mode 100644 index 0000000000000000000000000000000000000000..5826e959779f915a58faa0c68fdd39679603675d --- /dev/null +++ b/cp/ex09/rectangle.py @@ -0,0 +1,7 @@ +"""The Rectangle-exercises 9.1-9.3.""" + +class Rectangle: + """A class that represents a Rectangle.""" + + # TODO: Code has been removed from here. + diff --git a/cp/ex09/vector.py b/cp/ex09/vector.py new file mode 100644 index 0000000000000000000000000000000000000000..5b25a805dab87bf647a45224eecc13ebf7a3cbe0 --- /dev/null +++ b/cp/ex09/vector.py @@ -0,0 +1,8 @@ +"""This file contains all the exercises relating to the Vector Exercises (9.4-9.7).""" + +class Vector: + """A class that represents a Vector, defined by the endpoint :math:`(x,y)`.""" + + # TODO: Code has been removed from here. + + diff --git a/cp/tests/tests_week09.py b/cp/tests/tests_week09.py new file mode 100644 index 0000000000000000000000000000000000000000..c847d46c55f2f1acdee59e1067d66d25bf13fc88 --- /dev/null +++ b/cp/tests/tests_week09.py @@ -0,0 +1,204 @@ +from unitgrade import Report, UTestCase +import unittest +import cp +import inspect + +class Week09TestRectanglePerimeter(UTestCase): + def make_rectangle(self, width, height): + from cp.ex09.rectangle import Rectangle + init_parameters = inspect.signature(Rectangle.__init__).parameters + if len(init_parameters) == 5: # If the class has already been extended to have a center + return Rectangle(width, height, 0, 0) + else: + return Rectangle(width, height) + def test_perimeter(self): + self.assertEqual(self.make_rectangle(10, 4).get_perimeter(), 28) + self.assertEqual(self.make_rectangle(4, 10).get_perimeter(), 28) + self.assertEqual(self.make_rectangle(2, 8).get_perimeter(), 20) + self.assertEqual(self.make_rectangle(15, 12).get_perimeter(), 54) + self.assertEqual(self.make_rectangle(1, 1).get_perimeter(), 4) + self.assertEqual(self.make_rectangle(10, 1).get_perimeter(), 22) + +class Week09TestCorners(UTestCase): + def test_corners(self): + from cp.ex09.rectangle import Rectangle + X,Y = Rectangle(2, 5, 3, 4).get_corners() + self.assertEqual(X,[2.0, 2.0, 4.0, 4.0] ) + self.assertEqual(Y,[1.5, 6.5, 6.5, 1.5] ) + + X,Y = Rectangle(1, 1, 3, 4).get_corners() + self.assertEqual(X,[2.5, 2.5, 3.5, 3.5] ) + self.assertEqual(Y,[3.5, 4.5, 4.5, 3.5] ) + + X,Y = Rectangle(1, 2, 8, 2).get_corners() + self.assertEqual(X,[7.5, 7.5, 8.5, 8.5] ) + self.assertEqual(Y,[1.0, 3.0, 3.0, 1.0] ) + + X,Y = Rectangle(7, 2, 3, 4).get_corners() + self.assertEqual(X,[-0.5, -0.5, 6.5, 6.5] ) + self.assertEqual(Y,[3.0, 5.0, 5.0, 3.0] ) + + +class Week09TestVector(UTestCase): + def test_make_vector(self): + from cp.ex09.vector import Vector + + v1 = Vector(2,3) + self.assertIsInstance(v1, Vector, msg="Must return a Vector instance.") + self.assertEqual(v1.x, 2) + self.assertEqual(v1.y, 3) + + v1 = Vector(3,5) + self.assertIsInstance(v1, Vector, msg="Must return a Vector instance.") + self.assertEqual(v1.x, 3) + self.assertEqual(v1.y, 5) + + v1 = Vector(10,2) + self.assertIsInstance(v1, Vector, msg="Must return a Vector instance.") + self.assertEqual(v1.x, 10) + self.assertEqual(v1.y, 2) + + +class Week09VectorAddition(unittest.TestCase): + def test_add_positive_vectors(self): + from cp.ex09.vector import Vector + vector1 = Vector(2, 3) + vector2 = Vector(4, 5) + result = vector1.add(vector2) + # Check that the original vectors are unchanged + self.assertEqual((vector1.x, vector1.y), (2, 3)) + self.assertEqual((vector2.x, vector2.y), (4, 5)) + + self.assertEqual(result.x, vector1.x + vector2.x) + self.assertEqual(result.y, vector1.y + vector2.y) + + def test_add_negative_vectors(self): + from cp.ex09.vector import Vector + vector1 = Vector(-2, -3) + vector2 = Vector(-4, -5) + result = vector1.add(vector2) + # Check that the original vectors are unchanged + self.assertEqual((vector1.x, vector1.y), (-2, -3)) + self.assertEqual((vector2.x, vector2.y), (-4, -5)) + + self.assertEqual(result.x, vector1.x + vector2.x) + self.assertEqual(result.y, vector1.y + vector2.y) + + def test_add_mixed_vectors(self): + from cp.ex09.vector import Vector + vector1 = Vector(2, -3) + vector2 = Vector(-4, 5) + result = vector1.add(vector2) + # Check that the original vectors are unchanged + self.assertEqual((vector1.x, vector1.y), (2, -3)) + self.assertEqual((vector2.x, vector2.y), (-4, 5)) + + self.assertEqual(result.x, vector1.x + vector2.x) + self.assertEqual(result.y, vector1.y + vector2.y) + +class Week09VectorDotProduct(unittest.TestCase): + + def test_dot_product_with_positive_vectors(self): + from cp.ex09.vector import Vector + vector1 = Vector(2, 3) + vector2 = Vector(4, 5) + result = vector1.dot(vector2) + self.assertEqual(result, vector1.x * vector2.x + vector1.y * vector2.y) + + def test_dot_product_with_negative_vectors(self): + from cp.ex09.vector import Vector + vector1 = Vector(-2, -3) + vector2 = Vector(-4, -5) + result = vector1.dot(vector2) + self.assertEqual(result, vector1.x * vector2.x + vector1.y * vector2.y) + + def test_dot_product_with_mixed_vectors(self): + from cp.ex09.vector import Vector + vector1 = Vector(2, -3) + vector2 = Vector(-4, 5) + result = vector1.dot(vector2) + self.assertEqual(result, vector1.x * vector2.x + vector1.y * vector2.y) + +class Week09VectorScale(unittest.TestCase): + + def test_scale_positive_vector(self): + from cp.ex09.vector import Vector + vector1 = Vector(2, 3) + scale_factor = 2 + scaled_vector = vector1.scale(scale_factor) + + self.assertEqual(scaled_vector.x, vector1.x * scale_factor) + self.assertEqual(scaled_vector.y, vector1.y * scale_factor) + + # Check that the original vector is unchanged + self.assertEqual((vector1.x, vector1.y), (2, 3)) + + def test_scale_negative_vector(self): + from cp.ex09.vector import Vector + vector1 = Vector(-2, -3) + scale_factor = 3 + scaled_vector = vector1.scale(scale_factor) + + self.assertEqual(scaled_vector.x, vector1.x * scale_factor) + self.assertEqual(scaled_vector.y, vector1.y * scale_factor) + + # Check that the original vector is unchanged + self.assertEqual((vector1.x, vector1.y), (-2, -3)) + + def test_scale_mixed_vector(self): + from cp.ex09.vector import Vector + vector1 = Vector(2, -3) + scale_factor = -1.5 + scaled_vector = vector1.scale(scale_factor) + + self.assertEqual(scaled_vector.x, vector1.x * scale_factor) + self.assertEqual(scaled_vector.y, vector1.y * scale_factor) + + # Check that the original vector is unchanged + self.assertEqual((vector1.x, vector1.y), (2, -3)) + +class Week09TranslatingRectangle(UTestCase): + def test_move_vector(self): + from cp.ex09.vector import Vector + from cp.ex09.rectangle import Rectangle + r = Rectangle(10, 4, 2, 2) + r.translate(Vector(2, 3)) + self.assertEqual(r.x_c, 4) + self.assertEqual(r.y_c, 5) + + r = Rectangle(1, 2, 1, 1) + r.translate(Vector(4, 2)) + self.assertEqual(r.x_c, 5) + self.assertEqual(r.y_c, 3) + + r = Rectangle(12, 14, 0, 0) + r.translate(Vector(-5,5)) + self.assertEqual(r.x_c, -5) + self.assertEqual(r.y_c, 5) + + r = Rectangle(12, 13, -5, 2) + r.translate(Vector(10, 12)) + self.assertEqual(r.x_c, 5) + self.assertEqual(r.y_c, 14) + +questions = [ + (Week09TestRectanglePerimeter, 10), + (Week09TestVector, 10), + (Week09VectorDotProduct, 10), + (Week09VectorAddition, 10), + (Week09VectorScale, 10), + (Week09TranslatingRectangle, 10), + (Week09TestCorners,10), + ] + +class Week09Tests(Report): + title = "Tests for week 09" + #version = 1.0 + #url = "https://gitlab.compute.dtu.dk/cp/02002students/-/blob/master/cp/tests" + pack_imports = [cp] + individual_imports = [] + questions = questions + +if __name__ == '__main__': + from unitgrade import evaluate_report_student + evaluate_report_student(Week09Tests()) diff --git a/cp/tests/unitgrade_data/Week09TestCorners.pkl b/cp/tests/unitgrade_data/Week09TestCorners.pkl new file mode 100644 index 0000000000000000000000000000000000000000..39bb54c4b49d2fcab279d55f6e85a1c74eb96c36 Binary files /dev/null and b/cp/tests/unitgrade_data/Week09TestCorners.pkl differ diff --git a/cp/tests/unitgrade_data/Week09TestRectanglePerimeter.pkl b/cp/tests/unitgrade_data/Week09TestRectanglePerimeter.pkl new file mode 100644 index 0000000000000000000000000000000000000000..2d0711c7727dca6ad67ff939b632d9dd52a6b2c8 Binary files /dev/null and b/cp/tests/unitgrade_data/Week09TestRectanglePerimeter.pkl differ diff --git a/cp/tests/unitgrade_data/Week09TestVector.pkl b/cp/tests/unitgrade_data/Week09TestVector.pkl new file mode 100644 index 0000000000000000000000000000000000000000..efc9ccb32a2c958291b019c453af6560a22cb15f Binary files /dev/null and b/cp/tests/unitgrade_data/Week09TestVector.pkl differ diff --git a/cp/tests/unitgrade_data/Week09TranslatingRectangle.pkl b/cp/tests/unitgrade_data/Week09TranslatingRectangle.pkl new file mode 100644 index 0000000000000000000000000000000000000000..60c676135bdf1a005074237ccd163b9ba8ebcf34 Binary files /dev/null and b/cp/tests/unitgrade_data/Week09TranslatingRectangle.pkl differ