diff --git a/cp/ex10/__init__.py b/cp/ex10/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..c9bf24e54d475806d511254e677f9f48d430f544 --- /dev/null +++ b/cp/ex10/__init__.py @@ -0,0 +1 @@ +"""DO NOT EDIT/ADD TO THIS FILE.""" diff --git a/cp/ex10/extended_string.py b/cp/ex10/extended_string.py new file mode 100644 index 0000000000000000000000000000000000000000..9c45a028cc8ba855f3fa15198c805220f10a865d --- /dev/null +++ b/cp/ex10/extended_string.py @@ -0,0 +1,9 @@ +"""This file contains all the exercises relating to string exercise (10.1).""" + +class ExtendedString(str): + """Your expanded version of the python str class.""" + + # TODO: Code has been removed from here. + + + diff --git a/cp/ex10/shopping_cart.py b/cp/ex10/shopping_cart.py new file mode 100644 index 0000000000000000000000000000000000000000..b0e0a2fcd82b42a2e11025f4d675f254d05c2751 --- /dev/null +++ b/cp/ex10/shopping_cart.py @@ -0,0 +1,11 @@ +"""This file contains the project's code and solution.""" +class Item: + """A class to represent an inventory item.""" + + # TODO: Code has been removed from here. + + +class Inventory: + """A class to represent an inventory of items.""" + + # TODO: Code has been removed from here. diff --git a/cp/ex10/student.py b/cp/ex10/student.py new file mode 100644 index 0000000000000000000000000000000000000000..68df8afc592d5c0031b5194b3aa89737300724ed --- /dev/null +++ b/cp/ex10/student.py @@ -0,0 +1,28 @@ +"""This file contains all the exercises relating to Student exercise (10.3).""" +class Person: + """An expanded version of the python str class.""" + + def __init__(self, first_name:str, last_name:str): + """Initialize the person class. + + :param first_name: The person's first name + :param last_name: The person's last name. + """ + self.first_name = first_name + self.last_name = last_name + def get_full_name(self): + """Initialize the person class. + + :return: The student's full name. + """ + full_name= self.first_name+ ' ' + self.last_name + return full_name + + +class Student(Person): + """An extended version of the Person class which also includes the degree.""" + + # TODO: Code has been removed from here. + + + diff --git a/cp/ex10/vector.py b/cp/ex10/vector.py new file mode 100644 index 0000000000000000000000000000000000000000..a62b85e872a55c8ea170719712c9d93f42dee226 --- /dev/null +++ b/cp/ex10/vector.py @@ -0,0 +1,13 @@ +"""The code for vector operator overloading.""" +class Vector: + r"""A class that represents a Vector, defined by the endpoint :math:`(x,y)`.""" + + def __init__(self, x, y): + """Construct a new Vector-object. + + :param x: The x-component of the vector + :param y: The y-component of the vector + """ + self.x = x + self.y = y + # TODO: Code has been removed from here. diff --git a/cp/project5/__init__.py b/cp/project5/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..c9bf24e54d475806d511254e677f9f48d430f544 --- /dev/null +++ b/cp/project5/__init__.py @@ -0,0 +1 @@ +"""DO NOT EDIT/ADD TO THIS FILE.""" diff --git a/cp/project5/project5_grade.py b/cp/project5/project5_grade.py new file mode 100644 index 0000000000000000000000000000000000000000..700ece48ec715889a1fc2066945cc1332cd3abd1 --- /dev/null +++ b/cp/project5/project5_grade.py @@ -0,0 +1,4 @@ +# cp/project5/project5_tests.py +''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. ''' +import bz2, base64 +exec(bz2.decompress(base64.b64decode('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'))) \ No newline at end of file diff --git a/cp/project5/project5_tests.py b/cp/project5/project5_tests.py new file mode 100644 index 0000000000000000000000000000000000000000..f1db3f7e39a8398b6bae07dcc6941ffc9755b50e --- /dev/null +++ b/cp/project5/project5_tests.py @@ -0,0 +1,230 @@ +from unitgrade import UTestCase, Report, hide +import math + +class Week09VectorDotProduct(UTestCase): + 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 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) + +class Week10TestItemCreate(UTestCase): + def test_item_creation(self): + from cp.ex10.shopping_cart import Item + item1 = Item("Widget", 10, 5) + item2 = Item("Gadget", 5, 10) + item3 = Item("Phone", 11, 14) + self.assertEqual(item1.name, "Widget") + self.assertEqual(item2.name, "Gadget") + self.assertEqual(item3.name, "Phone") + self.assertEqual(item1.quantity, 10) + self.assertEqual(item2.quantity, 5) + self.assertEqual(item3.quantity, 11) + self.assertEqual(item1.price, 5.0) + self.assertEqual(item2.price, 10.0) + self.assertEqual(item3.price, 14.0) + +class Week10TestItemLessThan(UTestCase): + def test_item_less_than_operator(self): + from cp.ex10.shopping_cart import Item + item1 = Item("Widget", 10, 5.0) + item2 = Item("Gadget", 5, 10.0) + item3 = Item("Phone", 11, 14.0) + self.assertFalse(item1 < item2) + self.assertTrue(item1 < item3) + self.assertTrue(item2 < item3) + +class Week10TestItemGreaterThan(UTestCase): + def test_item_greater_than_operator(self): + from cp.ex10.shopping_cart import Item + item1 = Item("Widget", 10, 5.0) + item2 = Item("Gadget", 5, 10.0) + item3 = Item("Phone", 11, 14.0) + self.assertFalse(item1 > item2) + self.assertFalse(item1 > item3) + self.assertFalse(item2 > item3) + +class Week10TestItemEquals(UTestCase): + def test_item_equal_operator(self): + from cp.ex10.shopping_cart import Item + item1 = Item("Widget", 10, 5) + item2 = Item("Gadget", 5, 10) + item3 = Item("Phone", 11, 14) + self.assertFalse(item2 == item3) + self.assertFalse(item1 == item3) + +class Week10TestInventoryTotalValue(UTestCase): + def test_inventory_calculate_total_value(self): + from cp.ex10.shopping_cart import Item,Inventory + + inventory = Inventory() + item1 = Item("Laptop", 10, 800) + item2 = Item("Phone", 20, 400) + item3 = Item("Tablet", 15, 300) + item4 = Item("Laptop", 2, 850) + item5 = Item("Phone", 5, 420) + + inventory.add_item(item1) + inventory.add_item(item2) + inventory.add_item(item3) + + inventory2 = Inventory() + inventory2.add_item(item2) + inventory2.add_item(item4) + inventory2.add_item(item5) + + inventory3 = Inventory() + inventory3.add_item(item3) + inventory3.add_item(item4) + inventory3.add_item(item5) + + inventory.calculate_total_value() + inventory2.calculate_total_value() + inventory3.calculate_total_value() + + self.assertEqual(inventory.calculate_total_value(), 20500) + self.assertEqual(inventory2.calculate_total_value(), 11800) + self.assertEqual(inventory3.calculate_total_value(), 8300) + +class Week10TestInventoryLessThan(UTestCase): + def test_inventory_less_than_operator(self): + from cp.ex10.shopping_cart import Item,Inventory + + inventory = Inventory() + item1 = Item("Laptop", 10, 800) + item2 = Item("Phone", 20, 400) + item3 = Item("Tablet", 15, 300) + item4 = Item("Laptop", 2, 850) + item5 = Item("Phone", 5, 420) + + inventory.add_item(item1) + inventory.add_item(item2) + inventory.add_item(item3) + + inventory2 = Inventory() + inventory2.add_item(item2) + inventory2.add_item(item4) + inventory2.add_item(item5) + + inventory3 = Inventory() + inventory3.add_item(item3) + inventory3.add_item(item4) + inventory3.add_item(item5) + self.assertFalse(inventory < inventory2) + self.assertFalse(inventory2 < inventory3) + self.assertFalse(inventory < inventory2) + +class Week10TestInventoryGreaterThan(UTestCase): + def test_inventory_greater_than_operator(self): + from cp.ex10.shopping_cart import Item,Inventory + + inventory = Inventory() + item1 = Item("Laptop", 10, 800) + item2 = Item("Phone", 20, 400) + item3 = Item("Tablet", 15, 300) + item4 = Item("Laptop", 2, 850) + item5 = Item("Phone", 5, 420) + + inventory.add_item(item1) + inventory.add_item(item2) + inventory.add_item(item3) + + inventory2 = Inventory() + inventory2.add_item(item2) + inventory2.add_item(item4) + inventory2.add_item(item5) + + inventory3 = Inventory() + inventory3.add_item(item3) + inventory3.add_item(item4) + inventory3.add_item(item5) + self.assertTrue(inventory > inventory2) + self.assertTrue(inventory2 > inventory3) + self.assertTrue(inventory > inventory3) + + +class Week10TestInventoryEquals(UTestCase): + def test_inventory_equal_operator(self): + from cp.ex10.shopping_cart import Item,Inventory + + inventory = Inventory() + item1 = Item("Laptop", 10, 800) + item2 = Item("Phone", 800, 10.) + item3 = Item("Tablet", 20, 20.) + + inventory.add_item(item1) + + inventory2 = Inventory() + inventory2.add_item(item2) + + inventory3 = Inventory() + inventory3.add_item(item3) + self.assertTrue(inventory == inventory2) + self.assertFalse(inventory2 == inventory3) + self.assertFalse(inventory == inventory3) + +questions = [ + (Week09VectorDotProduct, 20), + (Week09TranslatingRectangle, 20), + (Week10TestItemCreate, 5), + (Week10TestItemLessThan, 5), + (Week10TestItemGreaterThan, 5), + (Week10TestItemEquals, 5), + (Week10TestInventoryTotalValue, 5), + (Week10TestInventoryGreaterThan, 5), + (Week10TestInventoryLessThan, 5), + (Week10TestInventoryEquals, 5), + ] + +class Project5(Report): + title = "Project 5" + remote_url = "https://cp.pages.compute.dtu.dk/02002public/_static/evaluation/" + + abbreviate_questions = True + questions = questions + import cp + pack_imports = [cp] + + +if __name__ == "__main__": + from unitgrade import evaluate_report_student + evaluate_report_student(Project5()) diff --git a/cp/project5/unitgrade_data/Week09TranslatingRectangle.pkl b/cp/project5/unitgrade_data/Week09TranslatingRectangle.pkl new file mode 100644 index 0000000000000000000000000000000000000000..5323f8b32a5f405d9f89a8045fec7349ec3e25da Binary files /dev/null and b/cp/project5/unitgrade_data/Week09TranslatingRectangle.pkl differ diff --git a/cp/project5/unitgrade_data/Week09VectorDotProduct.pkl b/cp/project5/unitgrade_data/Week09VectorDotProduct.pkl new file mode 100644 index 0000000000000000000000000000000000000000..c664de12427ac26e1dc6a896f76293070dc5699a Binary files /dev/null and b/cp/project5/unitgrade_data/Week09VectorDotProduct.pkl differ diff --git a/cp/project5/unitgrade_data/Week10TestInventoryEquals.pkl b/cp/project5/unitgrade_data/Week10TestInventoryEquals.pkl new file mode 100644 index 0000000000000000000000000000000000000000..99922cca933e222f15e1f6eafaadbd5959066212 Binary files /dev/null and b/cp/project5/unitgrade_data/Week10TestInventoryEquals.pkl differ diff --git a/cp/project5/unitgrade_data/Week10TestInventoryGreaterThan.pkl b/cp/project5/unitgrade_data/Week10TestInventoryGreaterThan.pkl new file mode 100644 index 0000000000000000000000000000000000000000..00cbf48ada245e1ebfdd5995559cb4a1da479047 Binary files /dev/null and b/cp/project5/unitgrade_data/Week10TestInventoryGreaterThan.pkl differ diff --git a/cp/project5/unitgrade_data/Week10TestInventoryLessThan.pkl b/cp/project5/unitgrade_data/Week10TestInventoryLessThan.pkl new file mode 100644 index 0000000000000000000000000000000000000000..2b7ed7bda81540fdfed2555bd3974c737124a923 Binary files /dev/null and b/cp/project5/unitgrade_data/Week10TestInventoryLessThan.pkl differ diff --git a/cp/project5/unitgrade_data/Week10TestInventoryTotalValue.pkl b/cp/project5/unitgrade_data/Week10TestInventoryTotalValue.pkl new file mode 100644 index 0000000000000000000000000000000000000000..e69d1af4d38adfb207123d01df048a01284dbb35 Binary files /dev/null and b/cp/project5/unitgrade_data/Week10TestInventoryTotalValue.pkl differ diff --git a/cp/project5/unitgrade_data/Week10TestItemCreate.pkl b/cp/project5/unitgrade_data/Week10TestItemCreate.pkl new file mode 100644 index 0000000000000000000000000000000000000000..c62e85c7baf06ddba8c3b5bf528d098eee1e4e94 Binary files /dev/null and b/cp/project5/unitgrade_data/Week10TestItemCreate.pkl differ diff --git a/cp/project5/unitgrade_data/Week10TestItemEquals.pkl b/cp/project5/unitgrade_data/Week10TestItemEquals.pkl new file mode 100644 index 0000000000000000000000000000000000000000..c88b12da44c21aef281677a06442d907b3deca6f Binary files /dev/null and b/cp/project5/unitgrade_data/Week10TestItemEquals.pkl differ diff --git a/cp/project5/unitgrade_data/Week10TestItemGreaterThan.pkl b/cp/project5/unitgrade_data/Week10TestItemGreaterThan.pkl new file mode 100644 index 0000000000000000000000000000000000000000..4b4d225514cc0f469805edb334aecafc79b7c128 Binary files /dev/null and b/cp/project5/unitgrade_data/Week10TestItemGreaterThan.pkl differ diff --git a/cp/project5/unitgrade_data/Week10TestItemLessThan.pkl b/cp/project5/unitgrade_data/Week10TestItemLessThan.pkl new file mode 100644 index 0000000000000000000000000000000000000000..7a7970f0f89e037a6bb29197806df6df7bd79b7a Binary files /dev/null and b/cp/project5/unitgrade_data/Week10TestItemLessThan.pkl differ diff --git a/cp/tests/tests_week10.py b/cp/tests/tests_week10.py new file mode 100644 index 0000000000000000000000000000000000000000..331fb2be07f7749bcd529d5045231354166ec16e --- /dev/null +++ b/cp/tests/tests_week10.py @@ -0,0 +1,268 @@ +from unitgrade import UTestCase, Report +import cp + + +class Week10TestSnakeCase(UTestCase): + def test_snake(self): + from cp.ex10.extended_string import ExtendedString + self.assertEqual(ExtendedString("WoW This is amazing").to_snake_case(), "wow_this_is_amazing") + self.assertEqual(ExtendedString("WHAT A SENTENCE").to_snake_case(), "what_a_sentence") + self.assertEqual(ExtendedString("THIS IS the BEST text ever").to_snake_case(), "this_is_the_best_text_ever") + self.assertEqual(ExtendedString("123 woW").to_snake_case(), "123_wow") + self.assertEqual(ExtendedString("wOof").to_snake_case(), "woof") + +class Week10TestWordCount(UTestCase): + def test_word_count(self): + from cp.ex10.extended_string import ExtendedString + self.assertTrue(issubclass(ExtendedString, str)) + self.assertEqual(ExtendedString("WoW This is amazing").word_count(), 4) + self.assertEqual(ExtendedString("WHAT A SENTENCE").word_count(), 3) + self.assertEqual(ExtendedString("THIS IS the BEST text ever").word_count(), 6) + self.assertEqual(ExtendedString("123 woW").word_count(), 2) + self.assertEqual(ExtendedString("wOof").word_count(), 1) + +class Week10TestStudent(UTestCase): + def test_remaining_days(self): + from cp.ex10.student import Student, Person + self.assertTrue(issubclass(Student, Person)) + self.assertEqual(Student("Jane", "Smith", "BSc").remaining_ECTS(50), 130) + self.assertEqual(Student("Alice", "Johnson", "MSc").remaining_ECTS(80), 40) +class Week10TestVectorAdd(UTestCase): + def test_vector_add(self): + from cp.ex10.vector import Vector + v = Vector(1, 2) + Vector(6, 5) + self.assertEqual(v.x, 7) + self.assertEqual(v.y, 7) + + v = Vector(3, 5) + Vector(60, 15) + self.assertEqual(v.x, 63) + self.assertEqual(v.y, 20) + + v = Vector(10, 21) + Vector(16, 51) + self.assertEqual(v.x, 26) + self.assertEqual(v.y, 72) + + v = Vector(11, 12.5) + Vector(26, 15.5) + self.assertEqual(v.x, 37) + self.assertEqual(v.y, 28) + + v = Vector(11, 22) + Vector(66, 55) + self.assertEqual(v.x, 77) + self.assertEqual(v.y, 77) + +class Week10TestVectorSub(UTestCase): + def test_vector_sub(self): + from cp.ex10.vector import Vector + v = Vector(1, 2) - Vector(6, 5) + self.assertEqual(v.x, -5) + self.assertEqual(v.y, -3) + + v = Vector(3, 5) - Vector(60, 15) + self.assertEqual(v.x, -57) + self.assertEqual(v.y, -10) + + v = Vector(10, 21) - Vector(16, 51) + self.assertEqual(v.x, -6) + self.assertEqual(v.y, -30) + + v = Vector(11, 12.5) - Vector(26, 15.5) + self.assertEqual(v.x, -15) + self.assertEqual(v.y, -3) + + v = Vector(11, 22) - Vector(66, 55) + self.assertEqual(v.x, -55) + self.assertEqual(v.y, -33) + +class Week10TestVectorDot(UTestCase): + def test_vector_dot(self): + from cp.ex10.vector import Vector + self.assertEqual(Vector(1, 2) * Vector(6, 5), 16) + self.assertEqual(Vector(3, 5) * Vector(60, 15), 255) + self.assertEqual(Vector(10, 20) * Vector(6, 1), 80) + self.assertEqual(Vector(1, 12) * Vector(26, 5), 86) + self.assertEqual(Vector(11, -66) * Vector(66, 11), 0) + +class Week10TestItemCreate(UTestCase): + def test_item_creation(self): + from cp.ex10.shopping_cart import Item + item1 = Item("Widget", 10, 5) + item2 = Item("Gadget", 5, 10) + item3 = Item("Phone", 11, 14) + self.assertEqual(item1.name, "Widget") + self.assertEqual(item2.name, "Gadget") + self.assertEqual(item3.name, "Phone") + self.assertEqual(item1.quantity, 10) + self.assertEqual(item2.quantity, 5) + self.assertEqual(item3.quantity, 11) + self.assertEqual(item1.price, 5.0) + self.assertEqual(item2.price, 10.0) + self.assertEqual(item3.price, 14.0) + +class Week10TestItemLessThan(UTestCase): + def test_item_less_than_operator(self): + from cp.ex10.shopping_cart import Item + item1 = Item("Widget", 10, 5.0) + item2 = Item("Gadget", 5, 10.0) + item3 = Item("Phone", 11, 14.0) + self.assertFalse(item1 < item2) + self.assertTrue(item1 < item3) + self.assertTrue(item2 < item3) + +class Week10TestItemGreaterThan(UTestCase): + def test_item_greater_than_operator(self): + from cp.ex10.shopping_cart import Item + item1 = Item("Widget", 10, 5.0) + item2 = Item("Gadget", 5, 10.0) + item3 = Item("Phone", 11, 14.0) + self.assertFalse(item1 > item2) + self.assertFalse(item1 > item3) + self.assertFalse(item2 > item3) + +class Week10TestItemEquals(UTestCase): + def test_item_equal_operator(self): + from cp.ex10.shopping_cart import Item + item1 = Item("Widget", 10, 5) + item2 = Item("Gadget", 5, 10) + item3 = Item("Phone", 11, 14) + self.assertFalse(item2 == item3) + self.assertFalse(item1 == item3) + +class Week10TestInventoryTotalValue(UTestCase): + def test_inventory_calculate_total_value(self): + from cp.ex10.shopping_cart import Item,Inventory + + inventory = Inventory() + item1 = Item("Laptop", 10, 800) + item2 = Item("Phone", 20, 400) + item3 = Item("Tablet", 15, 300) + item4 = Item("Laptop", 2, 850) + item5 = Item("Phone", 5, 420) + + inventory.add_item(item1) + inventory.add_item(item2) + inventory.add_item(item3) + + inventory2 = Inventory() + inventory2.add_item(item2) + inventory2.add_item(item4) + inventory2.add_item(item5) + + inventory3 = Inventory() + inventory3.add_item(item3) + inventory3.add_item(item4) + inventory3.add_item(item5) + + inventory.calculate_total_value() + inventory2.calculate_total_value() + inventory3.calculate_total_value() + + self.assertEqual(inventory.calculate_total_value(), 20500) + self.assertEqual(inventory2.calculate_total_value(), 11800) + self.assertEqual(inventory3.calculate_total_value(), 8300) + +class Week10TestInventoryLessThan(UTestCase): + def test_inventory_less_than_operator(self): + from cp.ex10.shopping_cart import Item,Inventory + + inventory = Inventory() + item1 = Item("Laptop", 10, 800) + item2 = Item("Phone", 20, 400) + item3 = Item("Tablet", 15, 300) + item4 = Item("Laptop", 2, 850) + item5 = Item("Phone", 5, 420) + + inventory.add_item(item1) + inventory.add_item(item2) + inventory.add_item(item3) + + inventory2 = Inventory() + inventory2.add_item(item2) + inventory2.add_item(item4) + inventory2.add_item(item5) + + inventory3 = Inventory() + inventory3.add_item(item3) + inventory3.add_item(item4) + inventory3.add_item(item5) + self.assertFalse(inventory < inventory2) + self.assertFalse(inventory2 < inventory3) + self.assertFalse(inventory < inventory2) + +class Week10TestInventoryGreaterThan(UTestCase): + def test_inventory_greater_than_operator(self): + from cp.ex10.shopping_cart import Item,Inventory + + inventory = Inventory() + item1 = Item("Laptop", 10, 800) + item2 = Item("Phone", 20, 400) + item3 = Item("Tablet", 15, 300) + item4 = Item("Laptop", 2, 850) + item5 = Item("Phone", 5, 420) + + inventory.add_item(item1) + inventory.add_item(item2) + inventory.add_item(item3) + + inventory2 = Inventory() + inventory2.add_item(item2) + inventory2.add_item(item4) + inventory2.add_item(item5) + + inventory3 = Inventory() + inventory3.add_item(item3) + inventory3.add_item(item4) + inventory3.add_item(item5) + self.assertTrue(inventory > inventory2) + self.assertTrue(inventory2 > inventory3) + self.assertTrue(inventory > inventory3) + + +class Week10TestInventoryEquals(UTestCase): + def test_inventory_equal_operator(self): + from cp.ex10.shopping_cart import Item,Inventory + + inventory = Inventory() + item1 = Item("Laptop", 10, 800) + item2 = Item("Phone", 800, 10.) + item3 = Item("Tablet", 20, 20.) + + inventory.add_item(item1) + + inventory2 = Inventory() + inventory2.add_item(item2) + + inventory3 = Inventory() + inventory3.add_item(item3) + self.assertTrue(inventory == inventory2) + self.assertFalse(inventory2 == inventory3) + self.assertFalse(inventory == inventory3) + +questions = [ + (Week10TestSnakeCase, 10), + (Week10TestWordCount, 20), + (Week10TestStudent,20), + (Week10TestVectorAdd,10), + (Week10TestVectorSub,20), + (Week10TestVectorDot,10), + (Week10TestItemCreate,20), + (Week10TestItemLessThan,10), + (Week10TestItemGreaterThan,20), + (Week10TestItemEquals,10), + (Week10TestInventoryTotalValue,20), + (Week10TestInventoryLessThan,10), + (Week10TestInventoryGreaterThan,20), + (Week10TestInventoryEquals,10), + ] + + +class Week10Tests(Report): + title = "Tests for week 10" + #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(Week10Tests()) diff --git a/cp/tests/unitgrade_data/Week10TestInventoryEquals.pkl b/cp/tests/unitgrade_data/Week10TestInventoryEquals.pkl new file mode 100644 index 0000000000000000000000000000000000000000..c95523bcd79f1f458b28ac1e2920e6755848ac59 Binary files /dev/null and b/cp/tests/unitgrade_data/Week10TestInventoryEquals.pkl differ diff --git a/cp/tests/unitgrade_data/Week10TestInventoryGreaterThan.pkl b/cp/tests/unitgrade_data/Week10TestInventoryGreaterThan.pkl new file mode 100644 index 0000000000000000000000000000000000000000..2573240563b056fca100ecfb9695dfd8a72153ee Binary files /dev/null and b/cp/tests/unitgrade_data/Week10TestInventoryGreaterThan.pkl differ diff --git a/cp/tests/unitgrade_data/Week10TestInventoryLessThan.pkl b/cp/tests/unitgrade_data/Week10TestInventoryLessThan.pkl new file mode 100644 index 0000000000000000000000000000000000000000..342884a172d6099660ef07df41a201b7483366e0 Binary files /dev/null and b/cp/tests/unitgrade_data/Week10TestInventoryLessThan.pkl differ diff --git a/cp/tests/unitgrade_data/Week10TestInventoryTotalValue.pkl b/cp/tests/unitgrade_data/Week10TestInventoryTotalValue.pkl new file mode 100644 index 0000000000000000000000000000000000000000..5e2f3eac28a81eca30cf02e2cb5432149f79aee7 Binary files /dev/null and b/cp/tests/unitgrade_data/Week10TestInventoryTotalValue.pkl differ diff --git a/cp/tests/unitgrade_data/Week10TestItemCreate.pkl b/cp/tests/unitgrade_data/Week10TestItemCreate.pkl new file mode 100644 index 0000000000000000000000000000000000000000..52ece2cff695d5f36fe31e4b39d3c99f1b313c75 Binary files /dev/null and b/cp/tests/unitgrade_data/Week10TestItemCreate.pkl differ diff --git a/cp/tests/unitgrade_data/Week10TestItemEquals.pkl b/cp/tests/unitgrade_data/Week10TestItemEquals.pkl new file mode 100644 index 0000000000000000000000000000000000000000..f97c72c525b7d1fe0823613ce5a4da43eb564bbf Binary files /dev/null and b/cp/tests/unitgrade_data/Week10TestItemEquals.pkl differ diff --git a/cp/tests/unitgrade_data/Week10TestItemGreaterThan.pkl b/cp/tests/unitgrade_data/Week10TestItemGreaterThan.pkl new file mode 100644 index 0000000000000000000000000000000000000000..cfce768faa44f6ee3bd580fd43f13a8bff2eae04 Binary files /dev/null and b/cp/tests/unitgrade_data/Week10TestItemGreaterThan.pkl differ diff --git a/cp/tests/unitgrade_data/Week10TestItemLessThan.pkl b/cp/tests/unitgrade_data/Week10TestItemLessThan.pkl new file mode 100644 index 0000000000000000000000000000000000000000..07d48fc9bfe5f7b119167e076b9c66caa8a82e21 Binary files /dev/null and b/cp/tests/unitgrade_data/Week10TestItemLessThan.pkl differ diff --git a/cp/tests/unitgrade_data/Week10TestSnakeCase.pkl b/cp/tests/unitgrade_data/Week10TestSnakeCase.pkl new file mode 100644 index 0000000000000000000000000000000000000000..1b1feb8f91345fd6df6378ea599c0a8850867579 Binary files /dev/null and b/cp/tests/unitgrade_data/Week10TestSnakeCase.pkl differ diff --git a/cp/tests/unitgrade_data/Week10TestStudent.pkl b/cp/tests/unitgrade_data/Week10TestStudent.pkl new file mode 100644 index 0000000000000000000000000000000000000000..3a3b056fcbca8d3f7a6bf4fc4b3f7596bd48c618 Binary files /dev/null and b/cp/tests/unitgrade_data/Week10TestStudent.pkl differ diff --git a/cp/tests/unitgrade_data/Week10TestVectorAdd.pkl b/cp/tests/unitgrade_data/Week10TestVectorAdd.pkl new file mode 100644 index 0000000000000000000000000000000000000000..cbf6a4251df17b4459cfeabce9060b2bdc007b86 Binary files /dev/null and b/cp/tests/unitgrade_data/Week10TestVectorAdd.pkl differ diff --git a/cp/tests/unitgrade_data/Week10TestVectorDot.pkl b/cp/tests/unitgrade_data/Week10TestVectorDot.pkl new file mode 100644 index 0000000000000000000000000000000000000000..d3210c6de6b441dbd4abac3026ac22fd07dba072 Binary files /dev/null and b/cp/tests/unitgrade_data/Week10TestVectorDot.pkl differ diff --git a/cp/tests/unitgrade_data/Week10TestVectorSub.pkl b/cp/tests/unitgrade_data/Week10TestVectorSub.pkl new file mode 100644 index 0000000000000000000000000000000000000000..d5b594f5d4d8e33eaf6521e07335a919876d6863 Binary files /dev/null and b/cp/tests/unitgrade_data/Week10TestVectorSub.pkl differ diff --git a/cp/tests/unitgrade_data/Week10TestWordCount.pkl b/cp/tests/unitgrade_data/Week10TestWordCount.pkl new file mode 100644 index 0000000000000000000000000000000000000000..882d6291101bb23d06b343ce8251ef9b8ed2d157 Binary files /dev/null and b/cp/tests/unitgrade_data/Week10TestWordCount.pkl differ