Skip to content

Commit fafd63e

Browse files
committed
Added Regular Exam
1 parent 16bc1f6 commit fafd63e

File tree

14 files changed

+276
-0
lines changed

14 files changed

+276
-0
lines changed
Binary file not shown.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
from abc import ABC, abstractmethod
2+
3+
4+
class BaseRobot(ABC):
5+
6+
def __init__(self, name: str, kind: str, price: float, weight: int):
7+
self.name = name
8+
self.kind = kind
9+
self.price = price
10+
self.weight = weight
11+
12+
@property
13+
def name(self):
14+
return self.__name
15+
16+
@name.setter
17+
def name(self, value):
18+
if value.rstrip() == "":
19+
raise ValueError("Robot name cannot be empty!")
20+
21+
self.__name = value
22+
23+
@property
24+
def kind(self):
25+
return self.__kind
26+
27+
@kind.setter
28+
def kind(self, value):
29+
if value.rstrip() == "":
30+
raise ValueError("Robot kind cannot be empty!")
31+
32+
self.__kind = value
33+
34+
@property
35+
def price(self):
36+
return self.__price
37+
38+
@price.setter
39+
def price(self, value):
40+
if value <= 0:
41+
raise ValueError("Robot price cannot be less than or equal to 0.0!")
42+
43+
self.__price = value
44+
45+
@abstractmethod
46+
def eating(self):
47+
pass
48+
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from project.robots.base_robot import BaseRobot
2+
3+
4+
class FemaleRobot(BaseRobot):
5+
6+
def __init__(self, name: str, kind: str, price: float):
7+
weight: int = 7
8+
super().__init__(name, kind, price, weight)
9+
10+
def eating(self):
11+
self.weight += 1
12+
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from project.robots.base_robot import BaseRobot
2+
3+
4+
class MaleRobot(BaseRobot):
5+
6+
def __init__(self, name: str, kind: str, price: float):
7+
weight: int = 9
8+
super().__init__(name, kind, price, weight)
9+
10+
def eating(self):
11+
self.weight += 3
12+
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
from project.services.main_service import MainService
2+
from project.services.secondary_service import SecondaryService
3+
from project.robots.male_robot import MaleRobot
4+
from project.robots.female_robot import FemaleRobot
5+
6+
7+
class RobotsManagingApp:
8+
9+
def __init__(self):
10+
self.robots = [] # objects
11+
self.services = [] # objects
12+
13+
def add_service(self, service_type: str, name: str):
14+
if service_type not in ["MainService", "SecondaryService"]:
15+
raise Exception("Invalid service type!")
16+
17+
if service_type == "MainService":
18+
service = MainService(name)
19+
20+
else:
21+
service = SecondaryService(name)
22+
23+
self.services.append(service)
24+
return f"{service_type} is successfully added."
25+
26+
def add_robot(self, robot_type: str, name: str, kind: str, price: float):
27+
if robot_type not in ["MaleRobot", "FemaleRobot"]:
28+
raise Exception("Invalid robot type!")
29+
30+
if robot_type == "MaleRobot":
31+
robot = MaleRobot(name, kind, price)
32+
33+
else:
34+
robot = FemaleRobot(name, kind, price)
35+
36+
self.robots.append(robot)
37+
return f"{robot_type} is successfully added."
38+
39+
def add_robot_to_service(self, robot_name: str, service_name: str):
40+
robot = [x for x in self.robots if x.name == robot_name][0]
41+
service = [x for x in self.services if x.name == service_name][0]
42+
43+
if isinstance(robot, MaleRobot) and isinstance(service, SecondaryService):
44+
return "Unsuitable service."
45+
46+
if isinstance(robot, FemaleRobot) and isinstance(service, MainService):
47+
return "Unsuitable service."
48+
49+
if len(service.robots) >= service.capacity:
50+
raise Exception("Not enough capacity for this robot!")
51+
52+
self.robots.remove(robot)
53+
service.robots.append(robot)
54+
return f"Successfully added {robot_name} to {service_name}."
55+
56+
def remove_robot_from_service(self, robot_name: str, service_name: str):
57+
service = [x for x in self.services if x.name == service_name][0]
58+
if robot_name not in [x.name for x in service.robots]:
59+
raise Exception("No such robot in this service!")
60+
61+
robot = [x for x in service.robots if x.name == robot_name][0]
62+
service.robots.remove(robot)
63+
self.robots.append(robot)
64+
return f"Successfully removed {robot_name} from {service_name}."
65+
66+
def feed_all_robots_from_service(self, service_name: str):
67+
service = [x for x in self.services if x.name == service_name][0]
68+
for robot in service.robots:
69+
robot.eating()
70+
71+
return f"Robots fed: {len(service.robots)}."
72+
73+
def service_price(self, service_name: str):
74+
service = [x for x in self.services if x.name == service_name][0]
75+
total_sum = 0
76+
for robot in service.robots:
77+
total_sum += robot.price
78+
return f"The value of service {service_name} is {total_sum:.2f}."
79+
80+
def __str__(self):
81+
return '\n'.join([x.details() for x in self.services])
82+

OOP/E.Regular Exam/Structure and Functionality/project/services/__init__.py

Whitespace-only changes.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from abc import ABC, abstractmethod
2+
3+
4+
class BaseService(ABC):
5+
6+
def __init__(self, name: str, capacity: int):
7+
self.name = name
8+
self.capacity = capacity
9+
self.robots = [] # robot objects
10+
11+
@property
12+
def name(self):
13+
return self.__name
14+
15+
@name.setter
16+
def name(self, value):
17+
if value.rstrip() == "":
18+
raise ValueError("Service name cannot be empty!")
19+
20+
self.__name = value
21+
22+
@property
23+
def capacity(self):
24+
return self.__capacity
25+
26+
@capacity.setter
27+
def capacity(self, value):
28+
if value <= 0:
29+
raise ValueError("Service capacity cannot be less than or equal to 0!")
30+
31+
self.__capacity = value
32+
33+
@abstractmethod
34+
def details(self):
35+
pass
36+
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from project.services.base_service import BaseService
2+
3+
4+
class MainService(BaseService):
5+
6+
def __init__(self, name: str):
7+
capacity: int=30
8+
super().__init__(name, capacity)
9+
10+
def details(self):
11+
return f"{self.name} Main Service:\nRobots: {' '.join([x.name for x in self.robots]) if self.robots else 'none'}"
12+
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from project.services.base_service import BaseService
2+
3+
4+
class SecondaryService(BaseService):
5+
6+
def __init__(self, name: str):
7+
capacity: int=15
8+
super().__init__(name, capacity)
9+
10+
def details(self):
11+
return f"{self.name} Secondary Service:\nRobots: {' '.join([x.name for x in self.robots]) if self.robots else 'none'}"
12+
2.52 KB
Binary file not shown.

OOP/E.Regular Exam/Unit Testing/test/__init__.py

Whitespace-only changes.
Binary file not shown.
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
from unittest import TestCase, main
2+
from project.tennis_player import TennisPlayer
3+
4+
5+
class TestTennisPlayer(TestCase):
6+
7+
def setUp(self) -> None:
8+
self.tennis_player = TennisPlayer("Dimitar", 19, 7)
9+
10+
def test_successful_initialization(self):
11+
self.assertEqual("Dimitar", self.tennis_player.name)
12+
self.assertEqual(19, self.tennis_player.age)
13+
self.assertEqual(7, self.tennis_player.points)
14+
self.assertEqual([], self.tennis_player.wins)
15+
16+
def test_invalid_name(self):
17+
with self.assertRaises(ValueError) as ve:
18+
self.tennis_player = TennisPlayer("g", 20, 8)
19+
20+
self.assertEqual("Name should be more than 2 symbols!", str(ve.exception))
21+
22+
with self.assertRaises(ValueError) as ve:
23+
self.tennis_player = TennisPlayer("gg", 20, 8)
24+
25+
self.assertEqual("Name should be more than 2 symbols!", str(ve.exception))
26+
27+
def test_invalid_age(self):
28+
with self.assertRaises(ValueError) as ve:
29+
self.tennis_player = TennisPlayer("George", 4, 17)
30+
31+
self.assertEqual("Players must be at least 18 years of age!", str(ve.exception))
32+
33+
def test_unsuccessful_add_new_win(self):
34+
self.tennis_player.wins = ["Le copa Italia"]
35+
result = self.tennis_player.add_new_win("Le copa Italia")
36+
self.assertEqual(f"Le copa Italia has been already added to the list of wins!", result)
37+
38+
def test_successful_add_new_win(self):
39+
self.tennis_player.add_new_win("Golden Years")
40+
self.assertEqual("Golden Years", self.tennis_player.wins[0])
41+
42+
def test_less_than_False(self):
43+
second_player = TennisPlayer("Gorge", 21, 4)
44+
result = self.tennis_player < second_player
45+
self.assertEqual(f'Dimitar is a better player than Gorge', result)
46+
47+
def test_less_than_True(self):
48+
second_player = TennisPlayer("Gorge", 21, 17)
49+
result = self.tennis_player < second_player
50+
self.assertEqual(f'Gorge is a top seeded player and he/she is better than Dimitar', result)
51+
52+
def test_string_return(self):
53+
self.tennis_player.wins = ["Le copa Italia", "Golden Years 2nd edition"]
54+
result = f"Tennis Player: Dimitar\n" \
55+
f"Age: 19\n" \
56+
f"Points: 7.0\n" \
57+
f"Tournaments won: Le copa Italia, Golden Years 2nd edition"
58+
self.assertEqual(result, str(self.tennis_player))
59+
60+
61+
if __name__ == '__main__':
62+
main()

0 commit comments

Comments
 (0)