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