+204
python/oct10/Rooms/main.py
+204
python/oct10/Rooms/main.py
···
1
+
from typing import override
2
+
3
+
4
+
class Room:
5
+
name: str
6
+
length: float
7
+
width: float
8
+
9
+
def __init__(self, name: str, length: float, width: float):
10
+
self.name = name
11
+
self.length = length
12
+
self.width = width
13
+
14
+
@override
15
+
def __repr__(self) -> str:
16
+
return f"Room({self.length}'x{self.width}' {self.name})"
17
+
18
+
def getArea(self) -> float:
19
+
return self.length * self.width
20
+
21
+
22
+
class Floor:
23
+
name: str
24
+
room_map: dict[str, Room]
25
+
26
+
def __init__(self, name: str):
27
+
self.name = name
28
+
self.room_map = dict()
29
+
30
+
@override
31
+
def __repr__(self) -> str:
32
+
return f"Floor({self.name} with {len(self.room_map)} room(s))"
33
+
34
+
def addRoom(self, room: Room) -> None:
35
+
if room.name in self.room_map:
36
+
raise LookupError(f"{room.name} already exists on this floor")
37
+
else:
38
+
self.room_map[room.name] = room
39
+
40
+
def getRoomCount(self) -> int:
41
+
return len(self.room_map)
42
+
43
+
def getRoom(self, name: str) -> Room | None:
44
+
return self.room_map.get(name, None)
45
+
46
+
def getRoomNames(self) -> list[str]:
47
+
return sorted(self.room_map.keys())
48
+
49
+
def getArea(self) -> float:
50
+
return sum([r.getArea() for r in self.room_map.values()])
51
+
52
+
53
+
class House:
54
+
floors: dict[str, Floor]
55
+
56
+
def __init__(self) -> None:
57
+
self.floors = dict()
58
+
59
+
@override
60
+
def __repr__(self) -> str:
61
+
return f"House({self.getFloorCount()} floor(s), {self.getRoomCount()} room(s), {self.getArea()} sq feet)"
62
+
63
+
def addFloor(self, floor: Floor) -> None:
64
+
if floor.name in self.floors:
65
+
raise LookupError(f"{floor.name} already exists on this floor")
66
+
else:
67
+
self.floors[floor.name] = floor
68
+
69
+
def getFloorCount(self) -> int:
70
+
return len(self.floors)
71
+
72
+
def getRoomCount(self) -> int:
73
+
return sum([f.getRoomCount() for f in self.floors.values()])
74
+
75
+
def getArea(self) -> float:
76
+
return sum([f.getArea() for f in self.floors.values()])
77
+
78
+
def getRoomFloor(self, room_name: str) -> Floor | None:
79
+
for floor in self.floors.values():
80
+
if room_name in floor.getRoomNames():
81
+
return floor
82
+
else:
83
+
return None
84
+
85
+
def getRoom(self, room_name: str) -> Room | None:
86
+
floor = self.getRoomFloor(room_name)
87
+
if floor == None:
88
+
return None
89
+
else:
90
+
return floor.getRoom(room_name)
91
+
92
+
93
+
def testLevel1():
94
+
print("Testing Level 1 (Core) material...", end="")
95
+
96
+
# Note: a Room represents a room, on a Floor, in a House.
97
+
98
+
room1 = Room("Living Room", 15, 15) # name, length, width
99
+
assert str(room1) == "Room(15'x15' Living Room)"
100
+
assert str([room1]) == "[Room(15'x15' Living Room)]"
101
+
assert room1.getArea() == 225 # 15 * 15
102
+
103
+
room2 = Room("Kitchen", 10, 20)
104
+
assert str(room2) == "Room(10'x20' Kitchen)"
105
+
assert room2.getArea() == 200 # 10 * 20
106
+
107
+
# Notes:
108
+
# * Each Floor can contain 0 or more rooms.
109
+
# * Store the rooms in floor.roomMap, which is a dictionary
110
+
# mapping the room name to the room instance.
111
+
# * Do not store a floor's roomCount or roomNames separately.
112
+
# Instead, compute these based on the keys in floor.roomMap.
113
+
114
+
floor1 = Floor("1st Floor")
115
+
assert str(floor1) == "Floor(1st Floor with 0 room(s))"
116
+
assert floor1.getRoomCount() == 0
117
+
assert floor1.getRoomNames() == []
118
+
assert floor1.getArea() == 0
119
+
120
+
floor1.addRoom(room1)
121
+
assert str(floor1) == "Floor(1st Floor with 1 room(s))"
122
+
assert floor1.getRoomCount() == 1
123
+
assert floor1.getRoomNames() == ["Living Room"]
124
+
assert floor1.getArea() == 225
125
+
126
+
floor1.addRoom(room2)
127
+
assert str(floor1) == "Floor(1st Floor with 2 room(s))"
128
+
assert floor1.getRoomCount() == 2
129
+
130
+
# Note that getRoomNames returns a *sorted* list of room names:
131
+
assert floor1.getRoomNames() == ["Kitchen", "Living Room"]
132
+
assert floor1.getArea() == 425
133
+
134
+
# We will try to add the Kitchen room again.
135
+
# We are not allowed to add the same room twice,
136
+
# nor even two rooms with the same name on any floor.
137
+
error = None
138
+
try:
139
+
floor1.addRoom(room2)
140
+
except Exception as e:
141
+
error = str(e)
142
+
assert error == "Kitchen already exists on this floor"
143
+
144
+
assert floor1.getRoom("Living Room") == room1
145
+
assert floor1.getRoom("Kitchen") == room2
146
+
assert floor1.getRoom("Study") == None
147
+
148
+
room3 = Room("Attic", 20, 30)
149
+
assert str(room3) == "Room(20'x30' Attic)"
150
+
assert room3.getArea() == 600 # 20 * 30
151
+
152
+
floor2 = Floor("2nd Floor")
153
+
floor2.addRoom(room3)
154
+
assert str(floor2) == "Floor(2nd Floor with 1 room(s))"
155
+
assert floor2.getArea() == 600 # 20 * 30
156
+
print("Passed!")
157
+
158
+
159
+
def testLevel2():
160
+
print("Testing Level 2+ (Not Core) material...", end="")
161
+
room1 = Room("Living Room", 15, 15)
162
+
room2 = Room("Kitchen", 10, 20)
163
+
floor1 = Floor("1st Floor")
164
+
floor1.addRoom(room1)
165
+
floor1.addRoom(room2)
166
+
room3 = Room("Attic", 20, 30)
167
+
floor2 = Floor("2nd Floor")
168
+
floor2.addRoom(room3)
169
+
170
+
house = House()
171
+
assert house.getFloorCount() == 0
172
+
assert house.getRoomCount() == 0
173
+
assert house.getArea() == 0
174
+
assert str(house) == "House(0 floor(s), 0 room(s), 0 sq feet)"
175
+
176
+
house.addFloor(floor1)
177
+
assert house.getFloorCount() == 1
178
+
assert house.getRoomCount() == 2
179
+
assert house.getArea() == 425
180
+
assert str(house) == "House(1 floor(s), 2 room(s), 425 sq feet)"
181
+
182
+
house.addFloor(floor2)
183
+
assert str(house) == "House(2 floor(s), 3 room(s), 1025 sq feet)"
184
+
185
+
assert house.getFloorCount() == 2
186
+
assert house.getRoomCount() == 3
187
+
assert house.getArea() == 1025
188
+
189
+
assert house.getRoomFloor("Kitchen") == floor1
190
+
assert house.getRoomFloor("Attic") == floor2
191
+
assert house.getRoomFloor("Study") == None
192
+
193
+
assert house.getRoom("Kitchen") == room2
194
+
assert house.getRoom("Attic") == room3
195
+
assert house.getRoom("Study") == None
196
+
print("Passed!")
197
+
198
+
199
+
def main():
200
+
testLevel1()
201
+
testLevel2()
202
+
203
+
204
+
main()