From 0291d343fb250219cb656392a9ff9bbbfdebb3dc Mon Sep 17 00:00:00 2001 From: Shivakumar Suresh Date: Sun, 20 Aug 2023 20:53:54 -0400 Subject: [PATCH 1/3] Completed task-2 --- car.py | 10 ----- car_factory.py | 38 +++++++++++++++++++ car_module/__init__.py | 2 + car_module/car.py | 12 ++++++ car_module/car_components/battery/__init__.py | 3 ++ .../battery/battery_interface.py | 6 +++ .../car_components/battery/nubbin_battery.py | 12 ++++++ .../battery/spindler_battery.py | 12 ++++++ car_module/car_components/engine/__init__.py | 4 ++ .../car_components/engine/capulet_engine.py | 10 +++++ .../car_components/engine/engine_interface.py | 6 +++ .../car_components/engine/sternman_engine.py | 9 +++++ .../engine/willoughby_engine.py | 10 +++++ car_module/serviceable_interface.py | 6 +++ engine/__init__.py | 0 engine/capulet_engine.py | 13 ------- engine/model/__init__.py | 0 engine/model/calliope.py | 12 ------ engine/model/glissade.py | 12 ------ engine/model/palindrome.py | 12 ------ engine/model/rorschach.py | 12 ------ engine/model/thovex.py | 12 ------ engine/sternman_engine.py | 15 -------- engine/willoughby_engine.py | 13 ------- 24 files changed, 130 insertions(+), 111 deletions(-) delete mode 100644 car.py create mode 100644 car_factory.py create mode 100644 car_module/__init__.py create mode 100644 car_module/car.py create mode 100644 car_module/car_components/battery/__init__.py create mode 100644 car_module/car_components/battery/battery_interface.py create mode 100644 car_module/car_components/battery/nubbin_battery.py create mode 100644 car_module/car_components/battery/spindler_battery.py create mode 100644 car_module/car_components/engine/__init__.py create mode 100644 car_module/car_components/engine/capulet_engine.py create mode 100644 car_module/car_components/engine/engine_interface.py create mode 100644 car_module/car_components/engine/sternman_engine.py create mode 100644 car_module/car_components/engine/willoughby_engine.py create mode 100644 car_module/serviceable_interface.py delete mode 100644 engine/__init__.py delete mode 100644 engine/capulet_engine.py delete mode 100644 engine/model/__init__.py delete mode 100644 engine/model/calliope.py delete mode 100644 engine/model/glissade.py delete mode 100644 engine/model/palindrome.py delete mode 100644 engine/model/rorschach.py delete mode 100644 engine/model/thovex.py delete mode 100644 engine/sternman_engine.py delete mode 100644 engine/willoughby_engine.py diff --git a/car.py b/car.py deleted file mode 100644 index f7b980a1b..000000000 --- a/car.py +++ /dev/null @@ -1,10 +0,0 @@ -from abc import ABC, abstractmethod - - -class Car(ABC): - def __init__(self, last_service_date): - self.last_service_date = last_service_date - - @abstractmethod - def needs_service(self): - pass diff --git a/car_factory.py b/car_factory.py new file mode 100644 index 000000000..396b9e38d --- /dev/null +++ b/car_factory.py @@ -0,0 +1,38 @@ +from car_module import Serviceable, Car +from car_module.car_components.battery import Battery, NubbinBattery, SpindlerBattery +from car_module.car_components.engine import Engine, CapuletEngine, SternmanEngine, WilloughbyEngine +from datetime import date + + +#Class to create a car of differnt models +class CarFactory: + #method to creta a calliope car model + def create_calliope(current_date:date, last_service_date: date, current_mileage:int, last_service_mileage:int) -> Car: + calliope_engine = CapuletEngine(current_mileage=current_mileage,last_service_mileage=last_service_mileage) + calliope_battery = SpindlerBattery(current_date=current_date,last_service_date=last_service_date) + return Car(engine=calliope_engine,battery=calliope_battery) + + #method to creta a glissade car model + def create_glissade(current_date:date, last_service_date: date, current_mileage:int, last_service_mileage:int) -> Car: + glissade_engine = WilloughbyEngine(current_mileage=current_mileage,last_service_mileage=last_service_mileage) + glissade_battery = SpindlerBattery(current_date=current_date,last_service_date=last_service_date) + return Car(engine=glissade_engine,battery=glissade_battery) + + #method to creta a palindrome car model + def create_palindrome(current_date:date, last_service_date: date, warning_light_on:bool) -> Car : + palindrome_engine = SternmanEngine(warning_light_is_on=warning_light_on) + palindrome_battery = SpindlerBattery(current_date=current_date,last_service_date=last_service_date) + return Car(engine=palindrome_engine,battery=palindrome_battery) + + #method to creta a rorschach car model + def create_rorschach(current_date:date, last_service_date: date, current_mileage:int, last_service_mileage:int) -> Car : + rorschach_engine = WilloughbyEngine(current_mileage=current_mileage,last_service_mileage=last_service_mileage) + rorschach_battery = NubbinBattery(current_date=current_date,last_service_date=last_service_date) + return Car(engine=rorschach_engine,battery=rorschach_battery) + + #method to creta a thovex car model + def create_thovex(current_date:date, last_service_date: date, current_mileage:int, last_service_mileage:int) -> Car : + thovex_engine = CapuletEngine(current_mileage=current_mileage,last_service_mileage=last_service_mileage) + thovex_battery = NubbinBattery(current_date=current_date,last_service_date=last_service_date) + return Car(engine=thovex_engine,battery=thovex_battery) + \ No newline at end of file diff --git a/car_module/__init__.py b/car_module/__init__.py new file mode 100644 index 000000000..0ad4113c9 --- /dev/null +++ b/car_module/__init__.py @@ -0,0 +1,2 @@ +from .serviceable_interface import Serviceable +from .car import Car \ No newline at end of file diff --git a/car_module/car.py b/car_module/car.py new file mode 100644 index 000000000..5365f21fd --- /dev/null +++ b/car_module/car.py @@ -0,0 +1,12 @@ +from .serviceable_interface import Serviceable +from .car_components.battery.battery_interface import Battery +from .car_components.engine.engine_interface import Engine + + +class Car(Serviceable): + def __init__(self, engine:Engine, battery: Battery): + self.engine = engine + self.battery = battery + + def needs_service(self) ->bool: + return self.engine.needs_service() or self.battery.needs_service() diff --git a/car_module/car_components/battery/__init__.py b/car_module/car_components/battery/__init__.py new file mode 100644 index 000000000..5726857c0 --- /dev/null +++ b/car_module/car_components/battery/__init__.py @@ -0,0 +1,3 @@ +from .nubbin_battery import NubbinBattery +from .spindler_battery import SpindlerBattery +from .battery_interface import Battery \ No newline at end of file diff --git a/car_module/car_components/battery/battery_interface.py b/car_module/car_components/battery/battery_interface.py new file mode 100644 index 000000000..0db262787 --- /dev/null +++ b/car_module/car_components/battery/battery_interface.py @@ -0,0 +1,6 @@ +from abc import ABC, abstractmethod + +class Battery(ABC): + @abstractmethod + def needs_service() -> bool: + pass diff --git a/car_module/car_components/battery/nubbin_battery.py b/car_module/car_components/battery/nubbin_battery.py new file mode 100644 index 000000000..733ae47b2 --- /dev/null +++ b/car_module/car_components/battery/nubbin_battery.py @@ -0,0 +1,12 @@ +from .battery_interface import Battery +from datetime import date + + +class NubbinBattery(Battery): + def __init__(self, current_date :date, last_service_date:date ): + self.current_date = current_date + self.last_service_date = last_service_date + + def needs_service(self) ->bool: + years = (self.current_date - self.last_service_date).days / 365.0 + return years > 4 diff --git a/car_module/car_components/battery/spindler_battery.py b/car_module/car_components/battery/spindler_battery.py new file mode 100644 index 000000000..a9e751081 --- /dev/null +++ b/car_module/car_components/battery/spindler_battery.py @@ -0,0 +1,12 @@ +from .battery_interface import Battery +from datetime import date + + +class SpindlerBattery(Battery): + def __init__(self, current_date :date, last_service_date:date ): + self.current_date = current_date + self.last_service_date = last_service_date + + def needs_service(self) ->bool: + years = (self.current_date - self.last_service_date).days / 365.0 + return years > 2 diff --git a/car_module/car_components/engine/__init__.py b/car_module/car_components/engine/__init__.py new file mode 100644 index 000000000..46c9cdb9e --- /dev/null +++ b/car_module/car_components/engine/__init__.py @@ -0,0 +1,4 @@ +from .engine_interface import Engine +from .capulet_engine import CapuletEngine +from .sternman_engine import SternmanEngine +from .willoughby_engine import WilloughbyEngine \ No newline at end of file diff --git a/car_module/car_components/engine/capulet_engine.py b/car_module/car_components/engine/capulet_engine.py new file mode 100644 index 000000000..ea060f6d7 --- /dev/null +++ b/car_module/car_components/engine/capulet_engine.py @@ -0,0 +1,10 @@ +from .engine_interface import Engine + + +class CapuletEngine(Engine): + def __init__(self, current_mileage :int, last_service_mileage:int ): + self.current_mileage = current_mileage + self.last_service_mileage = last_service_mileage + + def needs_service(self) ->bool: + return self.current_mileage - self.last_service_mileage > 30000 diff --git a/car_module/car_components/engine/engine_interface.py b/car_module/car_components/engine/engine_interface.py new file mode 100644 index 000000000..f01fa7ca1 --- /dev/null +++ b/car_module/car_components/engine/engine_interface.py @@ -0,0 +1,6 @@ +from abc import ABC, abstractmethod + +class Engine(ABC): + @abstractmethod + def needs_service() -> bool: + pass diff --git a/car_module/car_components/engine/sternman_engine.py b/car_module/car_components/engine/sternman_engine.py new file mode 100644 index 000000000..301af6ddf --- /dev/null +++ b/car_module/car_components/engine/sternman_engine.py @@ -0,0 +1,9 @@ +from .engine_interface import Engine + + +class SternmanEngine(Engine): + def __init__(self, warning_light_is_on :bool): + self.warning_light_is_on = warning_light_is_on + + def needs_service(self) ->bool: + return self.warning_light_is_on diff --git a/car_module/car_components/engine/willoughby_engine.py b/car_module/car_components/engine/willoughby_engine.py new file mode 100644 index 000000000..9c17324a6 --- /dev/null +++ b/car_module/car_components/engine/willoughby_engine.py @@ -0,0 +1,10 @@ +from .engine_interface import Engine + + +class WilloughbyEngine(Engine): + def __init__(self, current_mileage :int, last_service_mileage:int ): + self.current_mileage = current_mileage + self.last_service_mileage = last_service_mileage + + def needs_service(self) ->bool: + return self.current_mileage - self.last_service_mileage > 60000 \ No newline at end of file diff --git a/car_module/serviceable_interface.py b/car_module/serviceable_interface.py new file mode 100644 index 000000000..e24c1264e --- /dev/null +++ b/car_module/serviceable_interface.py @@ -0,0 +1,6 @@ +from abc import ABC, abstractmethod + +class Serviceable(ABC): + @abstractmethod + def needs_service() -> bool: + pass diff --git a/engine/__init__.py b/engine/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/engine/capulet_engine.py b/engine/capulet_engine.py deleted file mode 100644 index 69a2f3319..000000000 --- a/engine/capulet_engine.py +++ /dev/null @@ -1,13 +0,0 @@ -from abc import ABC - -from car import Car - - -class CapuletEngine(Car, ABC): - def __init__(self, last_service_date, current_mileage, last_service_mileage): - super().__init__(last_service_date) - self.current_mileage = current_mileage - self.last_service_mileage = last_service_mileage - - def engine_should_be_serviced(self): - return self.current_mileage - self.last_service_mileage > 30000 diff --git a/engine/model/__init__.py b/engine/model/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/engine/model/calliope.py b/engine/model/calliope.py deleted file mode 100644 index 1dd3da56d..000000000 --- a/engine/model/calliope.py +++ /dev/null @@ -1,12 +0,0 @@ -from datetime import datetime - -from engine.capulet_engine import CapuletEngine - - -class Calliope(CapuletEngine): - def needs_service(self): - service_threshold_date = self.last_service_date.replace(year=self.last_service_date.year + 2) - if service_threshold_date < datetime.today().date() or self.engine_should_be_serviced(): - return True - else: - return False diff --git a/engine/model/glissade.py b/engine/model/glissade.py deleted file mode 100644 index e1b16ad27..000000000 --- a/engine/model/glissade.py +++ /dev/null @@ -1,12 +0,0 @@ -from datetime import datetime - -from engine.willoughby_engine import WilloughbyEngine - - -class Glissade(WilloughbyEngine): - def needs_service(self): - service_threshold_date = self.last_service_date.replace(year=self.last_service_date.year + 2) - if service_threshold_date < datetime.today().date() or self.engine_should_be_serviced(): - return True - else: - return False diff --git a/engine/model/palindrome.py b/engine/model/palindrome.py deleted file mode 100644 index 590864bc8..000000000 --- a/engine/model/palindrome.py +++ /dev/null @@ -1,12 +0,0 @@ -from datetime import datetime - -from engine.sternman_engine import SternmanEngine - - -class Palindrome(SternmanEngine): - def needs_service(self): - service_threshold_date = self.last_service_date.replace(year=self.last_service_date.year + 4) - if service_threshold_date < datetime.today().date() or self.engine_should_be_serviced(): - return True - else: - return False diff --git a/engine/model/rorschach.py b/engine/model/rorschach.py deleted file mode 100644 index b9eedc91d..000000000 --- a/engine/model/rorschach.py +++ /dev/null @@ -1,12 +0,0 @@ -from datetime import datetime - -from engine.willoughby_engine import WilloughbyEngine - - -class Rorschach(WilloughbyEngine): - def needs_service(self): - service_threshold_date = self.last_service_date.replace(year=self.last_service_date.year + 4) - if service_threshold_date < datetime.today().date() or self.engine_should_be_serviced(): - return True - else: - return False diff --git a/engine/model/thovex.py b/engine/model/thovex.py deleted file mode 100644 index eac5707f0..000000000 --- a/engine/model/thovex.py +++ /dev/null @@ -1,12 +0,0 @@ -from datetime import datetime - -from engine.capulet_engine import CapuletEngine - - -class Thovex(CapuletEngine): - def needs_service(self): - service_threshold_date = self.last_service_date.replace(year=self.last_service_date.year + 4) - if service_threshold_date < datetime.today().date() or self.engine_should_be_serviced(): - return True - else: - return False diff --git a/engine/sternman_engine.py b/engine/sternman_engine.py deleted file mode 100644 index 72d8b5ab3..000000000 --- a/engine/sternman_engine.py +++ /dev/null @@ -1,15 +0,0 @@ -from abc import ABC - -from car import Car - - -class SternmanEngine(Car, ABC): - def __init__(self, last_service_date, warning_light_is_on): - super().__init__(last_service_date) - self.warning_light_is_on = warning_light_is_on - - def engine_should_be_serviced(self): - if self.warning_light_is_on: - return True - else: - return False diff --git a/engine/willoughby_engine.py b/engine/willoughby_engine.py deleted file mode 100644 index e5e0dc581..000000000 --- a/engine/willoughby_engine.py +++ /dev/null @@ -1,13 +0,0 @@ -from abc import ABC - -from car import Car - - -class WilloughbyEngine(Car, ABC): - def __init__(self, last_service_date, current_mileage, last_service_mileage): - super().__init__(last_service_date) - self.current_mileage = current_mileage - self.last_service_mileage = last_service_mileage - - def engine_should_be_serviced(self): - return self.current_mileage - self.last_service_mileage > 60000 From b408ab327afa367dd51465181eaa9781c727505c Mon Sep 17 00:00:00 2001 From: Shivakumar Suresh Date: Mon, 21 Aug 2023 19:14:31 -0400 Subject: [PATCH 2/3] task-3 completed --- __init__.py | 0 car_factory.py | 9 +- car_module/car.py | 4 +- car_module/car_components/__init__.py | 0 .../car_components/battery/nubbin_battery.py | 8 +- .../battery/spindler_battery.py | 8 +- .../car_components/engine/capulet_engine.py | 3 +- .../car_components/engine/sternman_engine.py | 3 +- .../engine/willoughby_engine.py | 3 +- test/test_battery/__init__.py | 0 test/test_battery/test_nubbbin_battery.py | 16 ++ test/test_battery/test_spindler_battery.py | 16 ++ test/test_car.py | 188 ------------------ test/test_engine/__init__.py | 0 test/test_engine/test_capulet_engine.py | 11 + test/test_engine/test_sternman_engine.py | 11 + test/test_engine/test_willoughby_engine.py | 11 + utils.py | 5 + 18 files changed, 91 insertions(+), 205 deletions(-) create mode 100644 __init__.py create mode 100644 car_module/car_components/__init__.py create mode 100644 test/test_battery/__init__.py create mode 100644 test/test_battery/test_nubbbin_battery.py create mode 100644 test/test_battery/test_spindler_battery.py delete mode 100644 test/test_car.py create mode 100644 test/test_engine/__init__.py create mode 100644 test/test_engine/test_capulet_engine.py create mode 100644 test/test_engine/test_sternman_engine.py create mode 100644 test/test_engine/test_willoughby_engine.py create mode 100644 utils.py diff --git a/__init__.py b/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/car_factory.py b/car_factory.py index 396b9e38d..7b470be46 100644 --- a/car_factory.py +++ b/car_factory.py @@ -7,32 +7,39 @@ #Class to create a car of differnt models class CarFactory: #method to creta a calliope car model + @staticmethod def create_calliope(current_date:date, last_service_date: date, current_mileage:int, last_service_mileage:int) -> Car: calliope_engine = CapuletEngine(current_mileage=current_mileage,last_service_mileage=last_service_mileage) calliope_battery = SpindlerBattery(current_date=current_date,last_service_date=last_service_date) return Car(engine=calliope_engine,battery=calliope_battery) #method to creta a glissade car model + @staticmethod def create_glissade(current_date:date, last_service_date: date, current_mileage:int, last_service_mileage:int) -> Car: glissade_engine = WilloughbyEngine(current_mileage=current_mileage,last_service_mileage=last_service_mileage) glissade_battery = SpindlerBattery(current_date=current_date,last_service_date=last_service_date) return Car(engine=glissade_engine,battery=glissade_battery) #method to creta a palindrome car model + @staticmethod def create_palindrome(current_date:date, last_service_date: date, warning_light_on:bool) -> Car : palindrome_engine = SternmanEngine(warning_light_is_on=warning_light_on) palindrome_battery = SpindlerBattery(current_date=current_date,last_service_date=last_service_date) return Car(engine=palindrome_engine,battery=palindrome_battery) #method to creta a rorschach car model + @staticmethod def create_rorschach(current_date:date, last_service_date: date, current_mileage:int, last_service_mileage:int) -> Car : rorschach_engine = WilloughbyEngine(current_mileage=current_mileage,last_service_mileage=last_service_mileage) rorschach_battery = NubbinBattery(current_date=current_date,last_service_date=last_service_date) return Car(engine=rorschach_engine,battery=rorschach_battery) #method to creta a thovex car model + @staticmethod def create_thovex(current_date:date, last_service_date: date, current_mileage:int, last_service_mileage:int) -> Car : thovex_engine = CapuletEngine(current_mileage=current_mileage,last_service_mileage=last_service_mileage) thovex_battery = NubbinBattery(current_date=current_date,last_service_date=last_service_date) return Car(engine=thovex_engine,battery=thovex_battery) - \ No newline at end of file + + +#CarFactory.create_calliope() \ No newline at end of file diff --git a/car_module/car.py b/car_module/car.py index 5365f21fd..8d92444bb 100644 --- a/car_module/car.py +++ b/car_module/car.py @@ -1,6 +1,6 @@ from .serviceable_interface import Serviceable -from .car_components.battery.battery_interface import Battery -from .car_components.engine.engine_interface import Engine +from car_module.car_components.battery.battery_interface import Battery +from car_module.car_components.engine.engine_interface import Engine class Car(Serviceable): diff --git a/car_module/car_components/__init__.py b/car_module/car_components/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/car_module/car_components/battery/nubbin_battery.py b/car_module/car_components/battery/nubbin_battery.py index 733ae47b2..64862cce4 100644 --- a/car_module/car_components/battery/nubbin_battery.py +++ b/car_module/car_components/battery/nubbin_battery.py @@ -1,6 +1,6 @@ -from .battery_interface import Battery +from car_module.car_components.battery.battery_interface import Battery from datetime import date - +from utils import add_years_to_date class NubbinBattery(Battery): def __init__(self, current_date :date, last_service_date:date ): @@ -8,5 +8,5 @@ def __init__(self, current_date :date, last_service_date:date ): self.last_service_date = last_service_date def needs_service(self) ->bool: - years = (self.current_date - self.last_service_date).days / 365.0 - return years > 4 + service_date = add_years_to_date(original_date=self.last_service_date,years_to_add=4) + return service_date < self.current_date diff --git a/car_module/car_components/battery/spindler_battery.py b/car_module/car_components/battery/spindler_battery.py index a9e751081..8d30c2b11 100644 --- a/car_module/car_components/battery/spindler_battery.py +++ b/car_module/car_components/battery/spindler_battery.py @@ -1,6 +1,6 @@ -from .battery_interface import Battery +from car_module.car_components.battery.battery_interface import Battery from datetime import date - +from utils import add_years_to_date class SpindlerBattery(Battery): def __init__(self, current_date :date, last_service_date:date ): @@ -8,5 +8,5 @@ def __init__(self, current_date :date, last_service_date:date ): self.last_service_date = last_service_date def needs_service(self) ->bool: - years = (self.current_date - self.last_service_date).days / 365.0 - return years > 2 + service_date = add_years_to_date(original_date=self.last_service_date,years_to_add=2) + return service_date < self.current_date \ No newline at end of file diff --git a/car_module/car_components/engine/capulet_engine.py b/car_module/car_components/engine/capulet_engine.py index ea060f6d7..1ab3ebca9 100644 --- a/car_module/car_components/engine/capulet_engine.py +++ b/car_module/car_components/engine/capulet_engine.py @@ -1,5 +1,4 @@ -from .engine_interface import Engine - +from car_module.car_components.engine.engine_interface import Engine class CapuletEngine(Engine): def __init__(self, current_mileage :int, last_service_mileage:int ): diff --git a/car_module/car_components/engine/sternman_engine.py b/car_module/car_components/engine/sternman_engine.py index 301af6ddf..7135f3af0 100644 --- a/car_module/car_components/engine/sternman_engine.py +++ b/car_module/car_components/engine/sternman_engine.py @@ -1,5 +1,4 @@ -from .engine_interface import Engine - +from car_module.car_components.engine.engine_interface import Engine class SternmanEngine(Engine): def __init__(self, warning_light_is_on :bool): diff --git a/car_module/car_components/engine/willoughby_engine.py b/car_module/car_components/engine/willoughby_engine.py index 9c17324a6..70904f416 100644 --- a/car_module/car_components/engine/willoughby_engine.py +++ b/car_module/car_components/engine/willoughby_engine.py @@ -1,5 +1,4 @@ -from .engine_interface import Engine - +from car_module.car_components.engine.engine_interface import Engine class WilloughbyEngine(Engine): def __init__(self, current_mileage :int, last_service_mileage:int ): diff --git a/test/test_battery/__init__.py b/test/test_battery/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/test/test_battery/test_nubbbin_battery.py b/test/test_battery/test_nubbbin_battery.py new file mode 100644 index 000000000..3cac55013 --- /dev/null +++ b/test/test_battery/test_nubbbin_battery.py @@ -0,0 +1,16 @@ +import unittest +from car_module.car_components.battery import NubbinBattery +from datetime import date + +class TestNubbinBattery(unittest.TestCase): + def check_needs_service_true_case(self): + current_date = date.today() + last_service_date = current_date.replace(year=current_date.year-5) + nubbin = NubbinBattery(current_date,last_service_date) + self.assertTrue(nubbin.needs_service()) + + def check_needs_service_flase_case(self): + current_date = date.today() + last_service_date = current_date.replace(year=current_date.year-1) + nubbin = NubbinBattery(current_date,last_service_date) + self.assertFalse(nubbin.needs_service()) diff --git a/test/test_battery/test_spindler_battery.py b/test/test_battery/test_spindler_battery.py new file mode 100644 index 000000000..b9789e34f --- /dev/null +++ b/test/test_battery/test_spindler_battery.py @@ -0,0 +1,16 @@ +import unittest +from car_module.car_components.battery import SpindlerBattery +from datetime import date + +class TestSpindlerBattery(unittest.TestCase): + def check_needs_service_true_case(self): + current_date = date.today() + last_service_date = current_date.replace(year=current_date.year-3) + nubbin = SpindlerBattery(current_date,last_service_date) + self.assertTrue(nubbin.needs_service()) + + def check_needs_service_flase_case(self): + current_date = date.today() + last_service_date = current_date.replace(year=current_date.year-1) + nubbin = SpindlerBattery(current_date,last_service_date) + self.assertFalse(nubbin.needs_service()) diff --git a/test/test_car.py b/test/test_car.py deleted file mode 100644 index f5994670d..000000000 --- a/test/test_car.py +++ /dev/null @@ -1,188 +0,0 @@ -import unittest -from datetime import datetime - -from engine.model.calliope import Calliope -from engine.model.glissade import Glissade -from engine.model.palindrome import Palindrome -from engine.model.rorschach import Rorschach -from engine.model.thovex import Thovex - - -class TestCalliope(unittest.TestCase): - def test_battery_should_be_serviced(self): - today = datetime.today().date() - last_service_date = today.replace(year=today.year - 3) - current_mileage = 0 - last_service_mileage = 0 - - car = Calliope(last_service_date, current_mileage, last_service_mileage) - self.assertTrue(car.needs_service()) - - def test_battery_should_not_be_serviced(self): - today = datetime.today().date() - last_service_date = today.replace(year=today.year - 1) - current_mileage = 0 - last_service_mileage = 0 - - car = Calliope(last_service_date, current_mileage, last_service_mileage) - self.assertFalse(car.needs_service()) - - def test_engine_should_be_serviced(self): - last_service_date = datetime.today().date() - current_mileage = 30001 - last_service_mileage = 0 - - car = Calliope(last_service_date, current_mileage, last_service_mileage) - self.assertTrue(car.needs_service()) - - def test_engine_should_not_be_serviced(self): - last_service_date = datetime.today().date() - current_mileage = 30000 - last_service_mileage = 0 - - car = Calliope(last_service_date, current_mileage, last_service_mileage) - self.assertFalse(car.needs_service()) - - -class TestGlissade(unittest.TestCase): - def test_battery_should_be_serviced(self): - today = datetime.today().date() - last_service_date = today.replace(year=today.year - 3) - current_mileage = 0 - last_service_mileage = 0 - - car = Glissade(last_service_date, current_mileage, last_service_mileage) - self.assertTrue(car.needs_service()) - - def test_battery_should_not_be_serviced(self): - today = datetime.today().date() - last_service_date = today.replace(year=today.year - 1) - current_mileage = 0 - last_service_mileage = 0 - - car = Glissade(last_service_date, current_mileage, last_service_mileage) - self.assertFalse(car.needs_service()) - - def test_engine_should_be_serviced(self): - last_service_date = datetime.today().date() - current_mileage = 60001 - last_service_mileage = 0 - - car = Glissade(last_service_date, current_mileage, last_service_mileage) - self.assertTrue(car.needs_service()) - - def test_engine_should_not_be_serviced(self): - last_service_date = datetime.today().date() - current_mileage = 60000 - last_service_mileage = 0 - - car = Glissade(last_service_date, current_mileage, last_service_mileage) - self.assertFalse(car.needs_service()) - - -class TestPalindrome(unittest.TestCase): - def test_battery_should_be_serviced(self): - today = datetime.today().date() - last_service_date = today.replace(year=today.year - 5) - warning_light_is_on = False - - car = Palindrome(last_service_date, warning_light_is_on) - self.assertTrue(car.needs_service()) - - def test_battery_should_not_be_serviced(self): - today = datetime.today().date() - last_service_date = today.replace(year=today.year - 3) - warning_light_is_on = False - - car = Palindrome(last_service_date, warning_light_is_on) - self.assertFalse(car.needs_service()) - - def test_engine_should_be_serviced(self): - last_service_date = datetime.today().date() - warning_light_is_on = True - - car = Palindrome(last_service_date, warning_light_is_on) - self.assertTrue(car.needs_service()) - - def test_engine_should_not_be_serviced(self): - last_service_date = datetime.today().date() - warning_light_is_on = False - - car = Palindrome(last_service_date, warning_light_is_on) - self.assertFalse(car.needs_service()) - - -class TestRorschach(unittest.TestCase): - def test_battery_should_be_serviced(self): - today = datetime.today().date() - last_service_date = today.replace(year=today.year - 5) - current_mileage = 0 - last_service_mileage = 0 - - car = Rorschach(last_service_date, current_mileage, last_service_mileage) - self.assertTrue(car.needs_service()) - - def test_battery_should_not_be_serviced(self): - today = datetime.today().date() - last_service_date = today.replace(year=today.year - 3) - current_mileage = 0 - last_service_mileage = 0 - - car = Rorschach(last_service_date, current_mileage, last_service_mileage) - self.assertFalse(car.needs_service()) - - def test_engine_should_be_serviced(self): - last_service_date = datetime.today().date() - current_mileage = 60001 - last_service_mileage = 0 - - car = Rorschach(last_service_date, current_mileage, last_service_mileage) - self.assertTrue(car.needs_service()) - - def test_engine_should_not_be_serviced(self): - last_service_date = datetime.today().date() - current_mileage = 60000 - last_service_mileage = 0 - - car = Rorschach(last_service_date, current_mileage, last_service_mileage) - self.assertFalse(car.needs_service()) - - -class TestThovex(unittest.TestCase): - def test_battery_should_be_serviced(self): - today = datetime.today().date() - last_service_date = today.replace(year=today.year - 5) - current_mileage = 0 - last_service_mileage = 0 - - car = Thovex(last_service_date, current_mileage, last_service_mileage) - self.assertTrue(car.needs_service()) - - def test_battery_should_not_be_serviced(self): - today = datetime.today().date() - last_service_date = today.replace(year=today.year - 3) - current_mileage = 0 - last_service_mileage = 0 - - car = Thovex(last_service_date, current_mileage, last_service_mileage) - self.assertFalse(car.needs_service()) - - def test_engine_should_be_serviced(self): - last_service_date = datetime.today().date() - current_mileage = 30001 - last_service_mileage = 0 - - car = Thovex(last_service_date, current_mileage, last_service_mileage) - self.assertTrue(car.needs_service()) - - def test_engine_should_not_be_serviced(self): - last_service_date = datetime.today().date() - current_mileage = 30000 - last_service_mileage = 0 - - car = Thovex(last_service_date, current_mileage, last_service_mileage) - self.assertFalse(car.needs_service()) - - -if __name__ == '__main__': - unittest.main() diff --git a/test/test_engine/__init__.py b/test/test_engine/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/test/test_engine/test_capulet_engine.py b/test/test_engine/test_capulet_engine.py new file mode 100644 index 000000000..99ef6188b --- /dev/null +++ b/test/test_engine/test_capulet_engine.py @@ -0,0 +1,11 @@ +import unittest +from car_module.car_components.engine import CapuletEngine + +class TestCapuletEngine(unittest.TestCase): + def check_needs_service_true_case(self): + capulet = CapuletEngine(current_mileage=30001,last_service_mileage=0) + self.assertTrue(capulet.needs_service()) + + def check_needs_service_false_case(self): + capulet = CapuletEngine(current_mileage=30000,last_service_mileage=0) + self.assertFalse(capulet.needs_service()) \ No newline at end of file diff --git a/test/test_engine/test_sternman_engine.py b/test/test_engine/test_sternman_engine.py new file mode 100644 index 000000000..6ca3c0602 --- /dev/null +++ b/test/test_engine/test_sternman_engine.py @@ -0,0 +1,11 @@ +import unittest +from car_module.car_components.engine import SternmanEngine + +class TestSternmanEngine(unittest.TestCase): + def check_needs_service_true_case(self): + capulet = SternmanEngine(warning_light_is_on=True) + self.assertTrue(capulet.needs_service()) + + def check_needs_service_false_case(self): + capulet = SternmanEngine(warning_light_is_on=False) + self.assertFalse(capulet.needs_service()) \ No newline at end of file diff --git a/test/test_engine/test_willoughby_engine.py b/test/test_engine/test_willoughby_engine.py new file mode 100644 index 000000000..cb72217c9 --- /dev/null +++ b/test/test_engine/test_willoughby_engine.py @@ -0,0 +1,11 @@ +import unittest +from car_module.car_components.engine import WilloughbyEngine + +class TestWilloughbyEngine(unittest.TestCase): + def check_needs_service_true_case(self): + capulet = WilloughbyEngine(current_mileage=60001,last_service_mileage=0) + self.assertTrue(capulet.needs_service()) + + def check_needs_service_false_case(self): + capulet = WilloughbyEngine(current_mileage=60000,last_service_mileage=0) + self.assertFalse(capulet.needs_service()) \ No newline at end of file diff --git a/utils.py b/utils.py new file mode 100644 index 000000000..b28c54bee --- /dev/null +++ b/utils.py @@ -0,0 +1,5 @@ +from datetime import date + +def add_years_to_date(original_date :date, years_to_add:int): + result = original_date.replace(year=original_date.year + years_to_add) + return result \ No newline at end of file From 51b28cc9094d9dc2776a7b0de3b938bed3702bd9 Mon Sep 17 00:00:00 2001 From: Shivakumar Suresh Date: Wed, 23 Aug 2023 11:32:14 -0400 Subject: [PATCH 3/3] completed task-4 --- car_factory.py | 25 ++++++++++++------- car_module/car.py | 6 +++-- .../battery/spindler_battery.py | 2 +- car_module/car_components/tire/__init__.py | 3 +++ .../car_components/tire/carrigan_tire.py | 12 +++++++++ .../car_components/tire/octoprime_tire.py | 9 +++++++ .../car_components/tire/tire_interface.py | 8 ++++++ test/test_battery/test_spindler_battery.py | 2 +- test/test_tire/test_carrigan.py | 11 ++++++++ test/test_tire/test_octoprime.py | 11 ++++++++ 10 files changed, 76 insertions(+), 13 deletions(-) create mode 100644 car_module/car_components/tire/__init__.py create mode 100644 car_module/car_components/tire/carrigan_tire.py create mode 100644 car_module/car_components/tire/octoprime_tire.py create mode 100644 car_module/car_components/tire/tire_interface.py create mode 100644 test/test_tire/test_carrigan.py create mode 100644 test/test_tire/test_octoprime.py diff --git a/car_factory.py b/car_factory.py index 7b470be46..462b5980b 100644 --- a/car_factory.py +++ b/car_factory.py @@ -1,6 +1,8 @@ from car_module import Serviceable, Car from car_module.car_components.battery import Battery, NubbinBattery, SpindlerBattery from car_module.car_components.engine import Engine, CapuletEngine, SternmanEngine, WilloughbyEngine +from car_module.car_components.tire import Tire, CarriganTire, OctoprimeTire +from typing import List from datetime import date @@ -8,37 +10,42 @@ class CarFactory: #method to creta a calliope car model @staticmethod - def create_calliope(current_date:date, last_service_date: date, current_mileage:int, last_service_mileage:int) -> Car: + def create_calliope(current_date:date, last_service_date: date, current_mileage:int, last_service_mileage:int, tire_wear:List[float]) -> Car: calliope_engine = CapuletEngine(current_mileage=current_mileage,last_service_mileage=last_service_mileage) calliope_battery = SpindlerBattery(current_date=current_date,last_service_date=last_service_date) - return Car(engine=calliope_engine,battery=calliope_battery) + tire = CarriganTire(tire_wear=tire_wear) + return Car(engine=calliope_engine,battery=calliope_battery,tire=tire) #method to creta a glissade car model @staticmethod - def create_glissade(current_date:date, last_service_date: date, current_mileage:int, last_service_mileage:int) -> Car: + def create_glissade(current_date:date, last_service_date: date, current_mileage:int, last_service_mileage:int, tire_wear:List[float]) -> Car: glissade_engine = WilloughbyEngine(current_mileage=current_mileage,last_service_mileage=last_service_mileage) glissade_battery = SpindlerBattery(current_date=current_date,last_service_date=last_service_date) - return Car(engine=glissade_engine,battery=glissade_battery) + tire = CarriganTire(tire_wear=tire_wear) + return Car(engine=glissade_engine,battery=glissade_battery,tire=tire) #method to creta a palindrome car model @staticmethod - def create_palindrome(current_date:date, last_service_date: date, warning_light_on:bool) -> Car : + def create_palindrome(current_date:date, last_service_date: date, warning_light_on:bool, tire_wear:List[float]) -> Car : palindrome_engine = SternmanEngine(warning_light_is_on=warning_light_on) palindrome_battery = SpindlerBattery(current_date=current_date,last_service_date=last_service_date) - return Car(engine=palindrome_engine,battery=palindrome_battery) + tire = OctoprimeTire(tire_wear=tire_wear) + return Car(engine=palindrome_engine,battery=palindrome_battery,tire=tire) #method to creta a rorschach car model @staticmethod - def create_rorschach(current_date:date, last_service_date: date, current_mileage:int, last_service_mileage:int) -> Car : + def create_rorschach(current_date:date, last_service_date: date, current_mileage:int, last_service_mileage:int, tire_wear:List[float]) -> Car : rorschach_engine = WilloughbyEngine(current_mileage=current_mileage,last_service_mileage=last_service_mileage) rorschach_battery = NubbinBattery(current_date=current_date,last_service_date=last_service_date) - return Car(engine=rorschach_engine,battery=rorschach_battery) + tire = CarriganTire(tire_wear=tire_wear) + return Car(engine=rorschach_engine,battery=rorschach_battery,tire=tire) #method to creta a thovex car model @staticmethod - def create_thovex(current_date:date, last_service_date: date, current_mileage:int, last_service_mileage:int) -> Car : + def create_thovex(current_date:date, last_service_date: date, current_mileage:int, last_service_mileage:int, tire_wear:List[float]) -> Car : thovex_engine = CapuletEngine(current_mileage=current_mileage,last_service_mileage=last_service_mileage) thovex_battery = NubbinBattery(current_date=current_date,last_service_date=last_service_date) + tire = OctoprimeTire(tire_wear=tire_wear) return Car(engine=thovex_engine,battery=thovex_battery) diff --git a/car_module/car.py b/car_module/car.py index 8d92444bb..d19c7e9d9 100644 --- a/car_module/car.py +++ b/car_module/car.py @@ -1,12 +1,14 @@ from .serviceable_interface import Serviceable from car_module.car_components.battery.battery_interface import Battery from car_module.car_components.engine.engine_interface import Engine +from car_module.car_components.tire import Tire class Car(Serviceable): - def __init__(self, engine:Engine, battery: Battery): + def __init__(self, engine:Engine, battery: Battery, tire:Tire): self.engine = engine self.battery = battery + self.tire = tire def needs_service(self) ->bool: - return self.engine.needs_service() or self.battery.needs_service() + return self.engine.needs_service() or self.battery.needs_service() or self.tire.needs_service() diff --git a/car_module/car_components/battery/spindler_battery.py b/car_module/car_components/battery/spindler_battery.py index 8d30c2b11..ad63eba47 100644 --- a/car_module/car_components/battery/spindler_battery.py +++ b/car_module/car_components/battery/spindler_battery.py @@ -8,5 +8,5 @@ def __init__(self, current_date :date, last_service_date:date ): self.last_service_date = last_service_date def needs_service(self) ->bool: - service_date = add_years_to_date(original_date=self.last_service_date,years_to_add=2) + service_date = add_years_to_date(original_date=self.last_service_date,years_to_add=3) return service_date < self.current_date \ No newline at end of file diff --git a/car_module/car_components/tire/__init__.py b/car_module/car_components/tire/__init__.py new file mode 100644 index 000000000..ec3ad103b --- /dev/null +++ b/car_module/car_components/tire/__init__.py @@ -0,0 +1,3 @@ +from .tire_interface import Tire +from .carrigan_tire import CarriganTire +from .octoprime_tire import OctoprimeTire \ No newline at end of file diff --git a/car_module/car_components/tire/carrigan_tire.py b/car_module/car_components/tire/carrigan_tire.py new file mode 100644 index 000000000..5b7271d29 --- /dev/null +++ b/car_module/car_components/tire/carrigan_tire.py @@ -0,0 +1,12 @@ +from car_module.car_components.tire.tire_interface import Tire +from typing import List + +class CarriganTire(Tire): + def __init__(self, tire_wear :List[float]): + self.tire_wear = tire_wear + + def needs_service(self) ->bool: + for value in self.tire_wear : + if self.tire_wear >= 0.9: + return True + return False \ No newline at end of file diff --git a/car_module/car_components/tire/octoprime_tire.py b/car_module/car_components/tire/octoprime_tire.py new file mode 100644 index 000000000..f5240d258 --- /dev/null +++ b/car_module/car_components/tire/octoprime_tire.py @@ -0,0 +1,9 @@ +from car_module.car_components.tire.tire_interface import Tire +from typing import List + +class OctoprimeTire(Tire): + def __init__(self, tire_wear :List[float]): + self.tire_wear = tire_wear + + def needs_service(self) ->bool: + return sum(self.tire_wear) >= 3 \ No newline at end of file diff --git a/car_module/car_components/tire/tire_interface.py b/car_module/car_components/tire/tire_interface.py new file mode 100644 index 000000000..ca72128da --- /dev/null +++ b/car_module/car_components/tire/tire_interface.py @@ -0,0 +1,8 @@ +from abc import ABC, abstractmethod +from typing import List + + +class Tire(ABC): + @abstractmethod + def needs_service() -> bool: + pass diff --git a/test/test_battery/test_spindler_battery.py b/test/test_battery/test_spindler_battery.py index b9789e34f..da545f2c4 100644 --- a/test/test_battery/test_spindler_battery.py +++ b/test/test_battery/test_spindler_battery.py @@ -5,7 +5,7 @@ class TestSpindlerBattery(unittest.TestCase): def check_needs_service_true_case(self): current_date = date.today() - last_service_date = current_date.replace(year=current_date.year-3) + last_service_date = current_date.replace(year=current_date.year-4) nubbin = SpindlerBattery(current_date,last_service_date) self.assertTrue(nubbin.needs_service()) diff --git a/test/test_tire/test_carrigan.py b/test/test_tire/test_carrigan.py new file mode 100644 index 000000000..46e43c6aa --- /dev/null +++ b/test/test_tire/test_carrigan.py @@ -0,0 +1,11 @@ +import unittest +from car_module.car_components.tire import CarriganTire + +class TestCarriganTire(unittest.TestCase): + def check_needs_service_true_case(self): + tire = CarriganTire([0,0.9,1,0.2]) + self.assertTrue(tire.needs_service()) + + def check_needs_service_flase_case(self): + tire = CarriganTire([0,0.1,0.1,0.2]) + self.assertFalse(tire.needs_service()) \ No newline at end of file diff --git a/test/test_tire/test_octoprime.py b/test/test_tire/test_octoprime.py new file mode 100644 index 000000000..82a0bb653 --- /dev/null +++ b/test/test_tire/test_octoprime.py @@ -0,0 +1,11 @@ +import unittest +from car_module.car_components.tire import OctoprimeTire + +class TestOctoprimeTire(unittest.TestCase): + def check_needs_service_true_case(self): + tire = OctoprimeTire([0.9,0.9,1,0.3]) + self.assertTrue(tire.needs_service()) + + def check_needs_service_flase_case(self): + tire = OctoprimeTire([0,0.1,0.1,0.2]) + self.assertFalse(tire.needs_service()) \ No newline at end of file