From 9419eaf067a1ee9d7d22903511296cefa1f5f357 Mon Sep 17 00:00:00 2001 From: Morten Hannemose <morten@hannemose.dk> Date: Tue, 31 Oct 2023 21:50:28 +0100 Subject: [PATCH] Added week09 --- cp/ex09/__init__.py | 1 + cp/ex09/rectangle.py | 7 + cp/ex09/vector.py | 8 + cp/tests/tests_week09.py | 204 ++++++++++++++++++ cp/tests/unitgrade_data/Week09TestCorners.pkl | Bin 0 -> 120 bytes .../Week09TestRectanglePerimeter.pkl | Bin 0 -> 133 bytes cp/tests/unitgrade_data/Week09TestVector.pkl | Bin 0 -> 123 bytes .../Week09TranslatingRectangle.pkl | Bin 0 -> 133 bytes 8 files changed, 220 insertions(+) create mode 100644 cp/ex09/__init__.py create mode 100644 cp/ex09/rectangle.py create mode 100644 cp/ex09/vector.py create mode 100644 cp/tests/tests_week09.py create mode 100644 cp/tests/unitgrade_data/Week09TestCorners.pkl create mode 100644 cp/tests/unitgrade_data/Week09TestRectanglePerimeter.pkl create mode 100644 cp/tests/unitgrade_data/Week09TestVector.pkl create mode 100644 cp/tests/unitgrade_data/Week09TranslatingRectangle.pkl diff --git a/cp/ex09/__init__.py b/cp/ex09/__init__.py new file mode 100644 index 0000000..c9bf24e --- /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 0000000..5826e95 --- /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 0000000..5b25a80 --- /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 0000000..c847d46 --- /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 GIT binary patch literal 120 zcmZo*nVQQ00ku;!dIZB$Q?m^$LsE-Nob!wFQj3bG^l%lYmV_2K=Oh*vPidRd!%~u& zn+jyO+e;RJHD)mO@RR^G#3w^_02Q$T6{i-J0F~8F$zaT2Ynzh60@A_=v8q%L0CScn A_W%F@ literal 0 HcmV?d00001 diff --git a/cp/tests/unitgrade_data/Week09TestRectanglePerimeter.pkl b/cp/tests/unitgrade_data/Week09TestRectanglePerimeter.pkl new file mode 100644 index 0000000000000000000000000000000000000000..2d0711c7727dca6ad67ff939b632d9dd52a6b2c8 GIT binary patch literal 133 zcmZo*nOemF0ku;!dSt>=Q?m^$LsE-Nf>M)967$k?QUg+pGILW)Qj4baa22PPgcdmG zBo-G>X`9l+QUa6!GTiOeSAfmPVC>;50qTt}fa?J&V*@HrEh+&jteuj<n8DUIC4&W| M>9*z!kgifa00B2IDF6Tf literal 0 HcmV?d00001 diff --git a/cp/tests/unitgrade_data/Week09TestVector.pkl b/cp/tests/unitgrade_data/Week09TestVector.pkl new file mode 100644 index 0000000000000000000000000000000000000000..efc9ccb32a2c958291b019c453af6560a22cb15f GIT binary patch literal 123 zcmZo*nOeXA0ku;!dIZ8#Q?m^$LsE-N!cvn<@{6YQa22PPgcdmGBo-G>X`9l+Qj(dQ z3S_w3D|>+TWia*#lmOMo=O$*S#+N~K0Tr?VHKZ1m0F~BG$zaT2Ynzh60@P;r$pNgb GR1X05Jt{f? literal 0 HcmV?d00001 diff --git a/cp/tests/unitgrade_data/Week09TranslatingRectangle.pkl b/cp/tests/unitgrade_data/Week09TranslatingRectangle.pkl new file mode 100644 index 0000000000000000000000000000000000000000..60c676135bdf1a005074237ccd163b9ba8ebcf34 GIT binary patch literal 133 zcmZo*nOemF0ku;!dZfZrQ?m^$Ly8jfigOZ6GV{`dQj<#(^U`xtr}S_Yr<Q~kIOil5 z7f)%M(!)}cnVSk^xZ6t~0Gp7(*dtJqT3iyJn_re1Uk22eUj$Of2Go#RR03qyPRU@* TU~8L_!2;A~_q746tyB*H1_Uo7 literal 0 HcmV?d00001 -- GitLab