diff --git a/README.md b/README.md index e90419fb0..319022c1b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # Swap Meet +# First project with OOP ## Skills Assessed diff --git a/swap_meet/clothing.py b/swap_meet/clothing.py index b8afdeb1e..701b2b0bb 100644 --- a/swap_meet/clothing.py +++ b/swap_meet/clothing.py @@ -1,2 +1,12 @@ -class Clothing: - pass \ No newline at end of file +from swap_meet.item import Item +class Clothing(Item): + def __init__(self, id=None, fabric="Unknown", condition=0, age=0): + super().__init__(id, condition, age) + self.fabric = fabric + + + def __str__(self): + return f"An object of type {self.get_category()} with id {self.id}. It is made from {self.fabric} fabric." + + + diff --git a/swap_meet/decor.py b/swap_meet/decor.py index eab7a9dbe..de0e53f5d 100644 --- a/swap_meet/decor.py +++ b/swap_meet/decor.py @@ -1,2 +1,13 @@ -class Decor: +from swap_meet.item import Item +class Decor(Item): + def __init__(self, id=None, width=0, length=0, condition=0, age=0): + super().__init__(id, condition,age) + self.width = width + self.length = length + + + def __str__(self): + return f"An object of type {self.get_category()} with id {self.id}. It takes up a {self.width} by {self.length} sized space." + + pass \ No newline at end of file diff --git a/swap_meet/electronics.py b/swap_meet/electronics.py index 2f9dff68a..c5c9fb1bc 100644 --- a/swap_meet/electronics.py +++ b/swap_meet/electronics.py @@ -1,2 +1,9 @@ -class Electronics: - pass +from swap_meet.item import Item +class Electronics(Item): + def __init__(self, id=None, type="Unknown", condition=0, age=0): + super().__init__(id, condition,age) + self.type = type + + def __str__(self): + return f"An object of type {self.get_category()} with id {self.id}. This is a {self.type} device." + diff --git a/swap_meet/item.py b/swap_meet/item.py index 560d759c2..e8ccbb191 100644 --- a/swap_meet/item.py +++ b/swap_meet/item.py @@ -1,2 +1,44 @@ +import uuid + class Item: - pass \ No newline at end of file + def __init__(self, id=None, condition=0, age=0): + if not isinstance(id, int) and id is not None: + raise TypeError("id needs to be integer") + if not isinstance(condition, int) and not isinstance(condition, float): + raise TypeError("condition needs to be integer or a float") + if not isinstance(age, int) and not isinstance(age, float): + raise TypeError("age needs to be integer or a float") + + if id is None: + self.id = uuid.uuid4().int + else: + self.id = id + + self.condition = condition + self.age = age + +#--- Wave 2 ---------------------------- + def get_category(self): + """Return a string holding the name of the class""" + return self.__class__.__name__ + +# --- Wave 3 ---------------------------- + def __str__(self): + return f"An object of type {self.get_category()} with id {self.id}." + +#--- Wave 5 ----------------------------- + def condition_description(self): + """Return the condition in words based on the value""" + if self.condition <= 1: + return 'very used' + elif self.condition <= 2: + return 'some used' + elif self.condition <= 3: + return 'good' + elif self.condition <= 4: + return 'very good' + else: + return 'This is a treassure' + + + \ No newline at end of file diff --git a/swap_meet/vendor.py b/swap_meet/vendor.py index 87302c056..106dabfdf 100644 --- a/swap_meet/vendor.py +++ b/swap_meet/vendor.py @@ -1,2 +1,113 @@ class Vendor: - pass \ No newline at end of file + def __init__(self, inventory=None): + if inventory is None: + inventory = [] + + self.inventory = inventory + + + def add(self, item): + """Adds item to the inventory""" + self.inventory.append(item) + return item + + def remove(self, item): + """Removes the matching item from the inventory""" + if item in self.inventory: + self.inventory.remove(item) + return item + + return False + + # ----- Wave 2 ----------------------------- + + def get_by_id(self, id): + """Returns the item with matching id from inventory""" + for item in self.inventory: + if item.id == id: + return item + + return None + + # ----- Wave 3 ----------------------------- + + def swap_items(self, other_vendor, my_item, their_item): + """Removes my_item from self.inventory, + and adds it to the other_vendor's inventory + Removes their_item from the other_vendor's inventory, + and adds it to self.inventory""" + if my_item not in self.inventory or their_item not in other_vendor.inventory: + + return False + + self.inventory.remove(my_item) + other_vendor.inventory.append(my_item) + other_vendor.inventory.remove(their_item) + self.inventory.append(their_item) + + return True + + # ----- Wave 4 ----------------------------- + def swap_first_item(self, other_vendor): + """removes the first item from its inventory, and adds the other_vendor's first item + Removes the first item from the other_vendor's inventory, and adds the instances first item""" + if len(self.inventory) == 0 or len(other_vendor.inventory) == 0: + + return False + + self.swap_items(other_vendor, self.inventory[0], other_vendor.inventory[0]) + + return True + + + # --- Wave 6 ------------------------------- + def get_by_category(self, category): + """Argument: a string. + Returns a list of objects (in that category) from the inventory""" + item_by_category = [] + for item in self.inventory: + if category == item.get_category(): + item_by_category.append(item) + return item_by_category + + def get_best_by_category(self, category): + """Return the item with the best condition in a certain category""" + item_by_category = self.get_by_category(category) + if not item_by_category: + return None + best_item = item_by_category[0] + for item in item_by_category: + if item.condition > best_item.condition: + best_item = item + return best_item + + + def swap_best_by_category(self, other_vendor, my_priority, their_priority): + """ This method swaps the best item of certain categories with another Vendor""" + if self.inventory == [] or other_vendor.inventory == []: + return False + if not self.get_by_category(their_priority) or not other_vendor.get_by_category(my_priority): + return False + + my_best = self.get_best_by_category(their_priority) + their_best = other_vendor.get_best_by_category(my_priority) + self.swap_items(other_vendor,my_best,their_best) + return True + + + def get_the_newest(self): + """Return the newest item in the inventory""" + newest_item = self.inventory[0] + for item in self.inventory: + if item.age < newest_item.age: + newest_item = item + return newest_item + + def swap_by_newest(self, other_vendor): + """Swap the newest item in the inventory with another vendor's newest item""" + if self.inventory == [] or other_vendor.inventory == []: + return False + my_newest = self.get_the_newest() + other_vendor_newest = other_vendor.get_the_newest() + self.swap_items(other_vendor, my_newest, other_vendor_newest) + return True \ No newline at end of file diff --git a/tests/integration_tests/test_wave_01_02_03.py b/tests/integration_tests/test_wave_01_02_03.py index 0e521771a..aa2a253c5 100644 --- a/tests/integration_tests/test_wave_01_02_03.py +++ b/tests/integration_tests/test_wave_01_02_03.py @@ -2,7 +2,6 @@ from swap_meet.vendor import Vendor from swap_meet.item import Item -@pytest.mark.skip @pytest.mark.integration_test def test_integration_wave_01_02_03(): # make a vendor diff --git a/tests/integration_tests/test_wave_04_05_06.py b/tests/integration_tests/test_wave_04_05_06.py index c5953b7f8..20ce201ea 100644 --- a/tests/integration_tests/test_wave_04_05_06.py +++ b/tests/integration_tests/test_wave_04_05_06.py @@ -4,7 +4,6 @@ from swap_meet.decor import Decor from swap_meet.electronics import Electronics -@pytest.mark.skip @pytest.mark.integration_test def test_integration_wave_04_05_06(): camila = Vendor() diff --git a/tests/unit_tests/test_wave_01.py b/tests/unit_tests/test_wave_01.py index 58478ccf9..e561161a5 100644 --- a/tests/unit_tests/test_wave_01.py +++ b/tests/unit_tests/test_wave_01.py @@ -2,12 +2,10 @@ import pytest from swap_meet.vendor import Vendor -@pytest.mark.skip def test_vendor_has_inventory(): vendor = Vendor() assert len(vendor.inventory) == 0 -@pytest.mark.skip def test_vendor_takes_optional_inventory(): inventory = ["a", "b", "c"] vendor = Vendor(inventory=inventory) @@ -16,7 +14,6 @@ def test_vendor_takes_optional_inventory(): assert "b" in vendor.inventory assert "c" in vendor.inventory -@pytest.mark.skip def test_adding_to_inventory(): vendor = Vendor() item = "new item" @@ -27,7 +24,6 @@ def test_adding_to_inventory(): assert item in vendor.inventory assert result == item -@pytest.mark.skip def test_removing_from_inventory_returns_item(): item = "item to remove" vendor = Vendor( @@ -40,7 +36,6 @@ def test_removing_from_inventory_returns_item(): assert item not in vendor.inventory assert result == item -@pytest.mark.skip def test_removing_not_found_is_false(): item = "item to remove" vendor = Vendor( @@ -49,7 +44,9 @@ def test_removing_not_found_is_false(): result = vendor.remove(item) - raise Exception("Complete this test according to comments below.") - # ********************************************************************* - # ****** Complete Assert Portion of this test ********** - # ********************************************************************* + # my changes: + assert len(vendor.inventory) == 3 + assert item not in vendor.inventory + assert result is False + + diff --git a/tests/unit_tests/test_wave_02.py b/tests/unit_tests/test_wave_02.py index 229165c75..c20774d4a 100644 --- a/tests/unit_tests/test_wave_02.py +++ b/tests/unit_tests/test_wave_02.py @@ -2,30 +2,36 @@ from swap_meet.vendor import Vendor from swap_meet.item import Item -@pytest.mark.skip def test_items_have_default_uuid_length_id(): item = Item() assert isinstance(item.id, int) assert len(str(item.id)) >= 32 -@pytest.mark.skip def test_item_instances_have_different_default_ids(): item_a = Item() item_b = Item() assert item_a.id != item_b.id -@pytest.mark.skip def test_items_use_custom_id_if_passed(): item = Item(id=12345) assert isinstance(item.id, int) assert item.id == 12345 -@pytest.mark.skip +#my tests: +def test_items_if_non_integer_id_raises_an_error(): + test_id = "y" + with pytest.raises(TypeError): + Item(test_id) + +def test_items_if_non_integer_condition_raises_an_error(): + test_condition = "y" + with pytest.raises(TypeError): + Item(test_condition) + def test_item_obj_returns_text_item_for_category(): item = Item() assert item.get_category() == "Item" -@pytest.mark.skip def test_get_item_by_id(): test_id = 12345 item_custom_id = Item(id=test_id) @@ -36,7 +42,6 @@ def test_get_item_by_id(): result_item = vendor.get_by_id(test_id) assert result_item is item_custom_id -@pytest.mark.skip def test_get_item_by_id_no_matching(): test_id = 12345 item_a = Item() diff --git a/tests/unit_tests/test_wave_03.py b/tests/unit_tests/test_wave_03.py index c85da6797..c5c895beb 100644 --- a/tests/unit_tests/test_wave_03.py +++ b/tests/unit_tests/test_wave_03.py @@ -2,7 +2,6 @@ from swap_meet.vendor import Vendor from swap_meet.item import Item -@pytest.mark.skip def test_item_overrides_to_string(): test_id = 12345 item = Item(id=test_id) @@ -12,7 +11,6 @@ def test_item_overrides_to_string(): expected_result = f"An object of type Item with id {test_id}." assert item_as_string == expected_result -@pytest.mark.skip def test_swap_items_returns_true(): item_a = Item() item_b = Item() @@ -40,7 +38,6 @@ def test_swap_items_returns_true(): assert item_b in jolie.inventory assert result -@pytest.mark.skip def test_swap_items_when_my_item_is_missing_returns_false(): item_a = Item() item_b = Item() @@ -67,7 +64,6 @@ def test_swap_items_when_my_item_is_missing_returns_false(): assert item_e in jolie.inventory assert not result -@pytest.mark.skip def test_swap_items_when_their_item_is_missing_returns_false(): item_a = Item() item_b = Item() @@ -94,7 +90,6 @@ def test_swap_items_when_their_item_is_missing_returns_false(): assert item_e in jolie.inventory assert not result -@pytest.mark.skip def test_swap_items_from_my_empty_returns_false(): fatimah = Vendor( inventory=[] @@ -114,7 +109,6 @@ def test_swap_items_from_my_empty_returns_false(): assert len(jolie.inventory) == 2 assert not result -@pytest.mark.skip def test_swap_items_from_their_empty_returns_false(): item_a = Item() item_b = Item() @@ -131,7 +125,8 @@ def test_swap_items_from_their_empty_returns_false(): result = fatimah.swap_items(jolie, item_b, nobodys_item) - raise Exception("Complete this test according to comments below.") - # ********************************************************************* - # ****** Complete Assert Portion of this test ********** - # ********************************************************************* + #my part of the test: + assert len(fatimah.inventory) == 3 + assert len(jolie.inventory) == 0 + assert not result + diff --git a/tests/unit_tests/test_wave_04.py b/tests/unit_tests/test_wave_04.py index 87addbbf6..156dda5d2 100644 --- a/tests/unit_tests/test_wave_04.py +++ b/tests/unit_tests/test_wave_04.py @@ -2,7 +2,6 @@ from swap_meet.vendor import Vendor from swap_meet.item import Item -@pytest.mark.skip def test_swap_first_item_returns_true(): item_a = Item() item_b = Item() @@ -30,7 +29,6 @@ def test_swap_first_item_returns_true(): assert item_a in jolie.inventory assert result -@pytest.mark.skip def test_swap_first_item_from_my_empty_returns_false(): fatimah = Vendor( inventory=[] @@ -48,7 +46,6 @@ def test_swap_first_item_from_my_empty_returns_false(): assert len(jolie.inventory) == 2 assert not result -@pytest.mark.skip def test_swap_first_item_from_their_empty_returns_false(): item_a = Item() item_b = Item() diff --git a/tests/unit_tests/test_wave_05.py b/tests/unit_tests/test_wave_05.py index 46e208237..97b52015e 100644 --- a/tests/unit_tests/test_wave_05.py +++ b/tests/unit_tests/test_wave_05.py @@ -7,17 +7,14 @@ # ~~~~~ Clothing Tests ~~~~~ -@pytest.mark.skip def test_clothing_has_default_uuid_length_id(): clothing = Clothing() check_for_default_uuid_length_id(clothing) -@pytest.mark.skip def test_clothing_has_expected_category_and_custom_id(): clothing = Clothing(id=TEST_CUSTOM_ID) check_category_and_custom_id(clothing, TEST_CUSTOM_ID, "Clothing") -@pytest.mark.skip def test_clothing_has_expected_default_to_str(): clothing = Clothing(id=TEST_CUSTOM_ID) expected_str = ( @@ -26,7 +23,6 @@ def test_clothing_has_expected_default_to_str(): ) assert str(clothing) == expected_str -@pytest.mark.skip def test_clothing_has_expected_to_str_with_custom_fabric(): clothing = Clothing(id=TEST_CUSTOM_ID, fabric="Pinstriped") expected_str = ( @@ -37,17 +33,14 @@ def test_clothing_has_expected_to_str_with_custom_fabric(): # ~~~~~ Decor Tests ~~~~~ -@pytest.mark.skip def test_decor_has_default_uuid_length_id(): decor = Decor() check_for_default_uuid_length_id(decor) -@pytest.mark.skip def test_decor_has_expected_category_and_custom_id(): decor = Decor(id=TEST_CUSTOM_ID) check_category_and_custom_id(decor, TEST_CUSTOM_ID, "Decor") -@pytest.mark.skip def test_decor_has_expected_default_to_str(): decor = Decor(id=TEST_CUSTOM_ID) expected_str = ( @@ -56,7 +49,6 @@ def test_decor_has_expected_default_to_str(): ) assert str(decor) == expected_str -@pytest.mark.skip def test_decor_has_expected_to_str_with_custom_size(): decor = Decor(id=TEST_CUSTOM_ID, width=3, length=12) expected_str = ( @@ -67,17 +59,14 @@ def test_decor_has_expected_to_str_with_custom_size(): # ~~~~~ Electronics Tests ~~~~~ -@pytest.mark.skip def test_electronics_has_default_uuid_length_id(): electronics = Electronics() check_for_default_uuid_length_id(electronics) -@pytest.mark.skip def test_electronics_has_expected_category_and_custom_id(): electronics = Electronics(id=TEST_CUSTOM_ID) check_category_and_custom_id(electronics, TEST_CUSTOM_ID, "Electronics") -@pytest.mark.skip def test_electronics_has_expected_default_to_str(): electronics = Electronics(id=TEST_CUSTOM_ID) expected_str = ( @@ -86,7 +75,6 @@ def test_electronics_has_expected_default_to_str(): ) assert str(electronics) == expected_str -@pytest.mark.skip def test_electronics_has_expected_to_str_with_custom_type(): electronics = Electronics(id=TEST_CUSTOM_ID, type="Mobile Phone") expected_str = ( @@ -98,7 +86,6 @@ def test_electronics_has_expected_to_str_with_custom_type(): # ~~~~~ Item Tests ~~~~~ -@pytest.mark.skip def test_items_have_condition_as_float(): items = [ Clothing(condition=3.5), @@ -108,7 +95,6 @@ def test_items_have_condition_as_float(): for item in items: assert item.condition == pytest.approx(3.5) -@pytest.mark.skip def test_items_have_condition_descriptions_that_are_the_same_regardless_of_type(): items = [ Clothing(condition=5), diff --git a/tests/unit_tests/test_wave_06.py b/tests/unit_tests/test_wave_06.py index ad51bf42d..50d3eee97 100644 --- a/tests/unit_tests/test_wave_06.py +++ b/tests/unit_tests/test_wave_06.py @@ -5,7 +5,6 @@ from swap_meet.decor import Decor from swap_meet.electronics import Electronics -@pytest.mark.skip def test_get_items_by_category(): item_a = Clothing() item_b = Electronics() @@ -22,7 +21,6 @@ def test_get_items_by_category(): assert item_a in items assert item_c in items -@pytest.mark.skip def test_get_no_matching_items_by_category(): item_a = Clothing() item_b = Item() @@ -33,12 +31,10 @@ def test_get_no_matching_items_by_category(): items = vendor.get_by_category("Electronics") - raise Exception("Complete this test according to comments below.") - # ********************************************************************* - # ****** Complete Assert Portion of this test ********** - # ********************************************************************* + #my test + assert items == [] -@pytest.mark.skip + def test_best_by_category(): item_a = Clothing(condition=2.0) item_b = Decor(condition=2.0) @@ -54,7 +50,6 @@ def test_best_by_category(): assert best_item.get_category() == "Clothing" assert best_item.condition == pytest.approx(4.0) -@pytest.mark.skip def test_best_by_category_no_matches_is_none(): item_a = Decor(condition=2.0) item_b = Decor(condition=2.0) @@ -67,7 +62,6 @@ def test_best_by_category_no_matches_is_none(): assert best_item is None -@pytest.mark.skip def test_best_by_category_with_duplicates(): # Arrange item_a = Clothing(condition=2.0) @@ -84,7 +78,6 @@ def test_best_by_category_with_duplicates(): assert best_item.get_category() == "Clothing" assert best_item.condition == pytest.approx(4.0) -@pytest.mark.skip def test_swap_best_by_category(): # Arrange # me @@ -110,7 +103,16 @@ def test_swap_best_by_category(): their_priority="Decor" ) - raise Exception("Complete this test according to comments below.") + #my tests + assert result is True + assert len(tai.inventory) == 3 + assert len(jesse.inventory) == 3 + assert item_d in jesse.inventory + assert item_e in jesse.inventory + assert item_c in jesse.inventory + assert item_f in tai.inventory + assert item_a in tai.inventory + assert item_b in tai.inventory # ********************************************************************* # ****** Complete Assert Portion of this test ********** # ********************************************************************* @@ -119,7 +121,6 @@ def test_swap_best_by_category(): # - That tai and jesse's inventories are the correct length # - That all the correct items are in tai and jesse's inventories, including the items which were swapped from one vendor to the other -@pytest.mark.skip def test_swap_best_by_category_reordered(): # Arrange item_a = Decor(condition=2.0) @@ -143,7 +144,16 @@ def test_swap_best_by_category_reordered(): their_priority="Decor" ) - raise Exception("Complete this test according to comments below.") + #my test + assert result is True + assert len(tai.inventory) == 3 + assert len(jesse.inventory) == 3 + assert item_d in jesse.inventory + assert item_e in jesse.inventory + assert item_c in jesse.inventory + assert item_f in tai.inventory + assert item_a in tai.inventory + assert item_b in tai.inventory # ********************************************************************* # ****** Complete Assert Portion of this test ********** # ********************************************************************* @@ -152,7 +162,6 @@ def test_swap_best_by_category_reordered(): # - That tai and jesse's inventories are the correct length # - That all the correct items are in tai and jesse's inventories, and that the items that were swapped are not there -@pytest.mark.skip def test_swap_best_by_category_no_inventory_is_false(): tai = Vendor( inventory=[] @@ -178,7 +187,6 @@ def test_swap_best_by_category_no_inventory_is_false(): assert item_b in jesse.inventory assert item_c in jesse.inventory -@pytest.mark.skip def test_swap_best_by_category_no_other_inventory_is_false(): item_a = Clothing(condition=2.0) item_b = Decor(condition=4.0) @@ -204,7 +212,6 @@ def test_swap_best_by_category_no_other_inventory_is_false(): assert item_b in tai.inventory assert item_c in tai.inventory -@pytest.mark.skip def test_swap_best_by_category_no_match_is_false(): # Arrange item_a = Decor(condition=2.0) @@ -228,7 +235,17 @@ def test_swap_best_by_category_no_match_is_false(): their_priority="Clothing" ) - raise Exception("Complete this test according to comments below.") + #my tests: + assert not result + assert len(tai.inventory) == 3 + assert len(jesse.inventory) == 3 + assert item_a in tai.inventory + assert item_b in tai.inventory + assert item_c in tai.inventory + assert item_d in jesse.inventory + assert item_e in jesse.inventory + assert item_f in jesse.inventory + # ********************************************************************* # ****** Complete Assert Portion of this test ********** # ********************************************************************* @@ -237,7 +254,6 @@ def test_swap_best_by_category_no_match_is_false(): # - That tai and jesse's inventories are the correct length # - That all the correct items are in tai and jesse's inventories -@pytest.mark.skip def test_swap_best_by_category_no_other_match_is_false(): # Arrange item_a = Decor(condition=2.0) @@ -260,8 +276,16 @@ def test_swap_best_by_category_no_other_match_is_false(): my_priority="Electronics", their_priority="Decor" ) - - raise Exception("Complete this test according to comments below.") + #my tests: + assert not result + assert len(tai.inventory) == 3 + assert len(jesse.inventory) == 3 + assert item_a in tai.inventory + assert item_b in tai.inventory + assert item_c in tai.inventory + assert item_d in jesse.inventory + assert item_e in jesse.inventory + assert item_f in jesse.inventory # ********************************************************************* # ****** Complete Assert Portion of this test ********** # ********************************************************************* @@ -269,3 +293,62 @@ def test_swap_best_by_category_no_other_match_is_false(): # - That result is falsy # - That tai and jesse's inventories are the correct length # - That all the correct items are in tai and jesse's inventories + +#swap by newest +#my_tests: +def test_swap_by_newest(): + # Arrange + + item_a = Decor(age=2.0) # newest + item_b = Electronics(age=4.0) + item_c = Decor(age=4.0) + tai = Vendor( + inventory=[item_a, item_b, item_c] + ) + + # them + item_d = Clothing(age=4.0) + item_e = Decor(age=5.0) + item_f = Clothing(age=3.0) # newest + jesse = Vendor( + inventory=[item_d, item_e, item_f] + ) + + # Act + result = tai.swap_by_newest( + other_vendor=jesse) + + #my tests + assert result is True + assert len(tai.inventory) == 3 + assert len(jesse.inventory) == 3 + assert item_a in jesse.inventory + assert item_e in jesse.inventory + assert item_d in jesse.inventory + assert item_f in tai.inventory + assert item_c in tai.inventory + assert item_b in tai.inventory + +def test_swap_by_newest_no_other_inventory_is_false(): + #arrange: + item_a = Decor(age=2.0) + item_b = Electronics(age=4.0) + item_c = Decor(age=4.0) + tai = Vendor( + inventory=[item_a, item_b, item_c] + ) + + jesse = Vendor( + inventory=[] + ) + #Act: + result = tai.swap_by_newest( + other_vendor=jesse) + + #Assert: + assert not result + assert len(tai.inventory) == 3 + assert len(jesse.inventory) == 0 + assert item_a in tai.inventory + assert item_b in tai.inventory + assert item_c in tai.inventory \ No newline at end of file