mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
_build_rows returns structured audit rows from a Plan 🟩
This commit is contained in:
parent
0ce0228c31
commit
b6320b745e
1 changed files with 188 additions and 0 deletions
|
|
@ -11,3 +11,191 @@ def test_build_rows_empty_plan_returns_empty_list() -> None:
|
|||
|
||||
# Assert
|
||||
assert rows == []
|
||||
|
||||
|
||||
def test_build_rows_single_room_no_windows_or_doors() -> None:
|
||||
# Arrange
|
||||
plan = Plan(
|
||||
uid="x",
|
||||
name=None,
|
||||
floors=[
|
||||
Floor(level=0, name=None, rooms=[
|
||||
Room(name="Hall", width_m=2.0, length_m=3.0, area_m2=6.0),
|
||||
]),
|
||||
],
|
||||
)
|
||||
|
||||
# Act
|
||||
rows: list[AuditRow] = _build_rows(plan)
|
||||
|
||||
# Assert — separator + one data row
|
||||
assert len(rows) == 2
|
||||
separator, data = rows
|
||||
assert separator.floor_level == 0
|
||||
assert data.room_name == "Hall"
|
||||
assert data.room_width_m == 2.0
|
||||
assert data.room_length_m == 3.0
|
||||
assert data.room_area_m2 == 6.0
|
||||
assert data.window_label is None
|
||||
assert data.door_location is None
|
||||
|
||||
|
||||
def test_build_rows_room_with_more_windows_than_doors() -> None:
|
||||
# Arrange — 2 windows, 1 door → 2 data rows; room columns blank on row 2
|
||||
plan = Plan(
|
||||
uid="x",
|
||||
name=None,
|
||||
floors=[
|
||||
Floor(level=0, name=None, rooms=[
|
||||
Room(
|
||||
name="Lounge",
|
||||
width_m=4.0,
|
||||
length_m=5.0,
|
||||
area_m2=20.0,
|
||||
windows=[
|
||||
Window(width_m=1.0, height_m=1.0, area_m2=1.0, opening_type="side_hung"),
|
||||
Window(width_m=0.8, height_m=1.0, area_m2=0.8, opening_type="top_hung"),
|
||||
],
|
||||
doors=[Door(width_mm=762.0)],
|
||||
),
|
||||
]),
|
||||
],
|
||||
)
|
||||
|
||||
# Act
|
||||
rows: list[AuditRow] = _build_rows(plan)
|
||||
|
||||
# Assert
|
||||
data_rows = [r for r in rows if r.floor_level is None]
|
||||
assert len(data_rows) == 2
|
||||
# row 0 carries room columns
|
||||
assert data_rows[0].room_name == "Lounge"
|
||||
assert data_rows[0].window_label == "W1"
|
||||
assert data_rows[0].door_location == "Lounge"
|
||||
# row 1 room columns are blank
|
||||
assert data_rows[1].room_name is None
|
||||
assert data_rows[1].window_label == "W2"
|
||||
assert data_rows[1].door_location is None
|
||||
|
||||
|
||||
def test_build_rows_room_with_more_doors_than_windows() -> None:
|
||||
# Arrange — 1 window, 2 doors → 2 data rows
|
||||
plan = Plan(
|
||||
uid="x",
|
||||
name=None,
|
||||
floors=[
|
||||
Floor(level=0, name=None, rooms=[
|
||||
Room(
|
||||
name="Bedroom",
|
||||
width_m=3.5,
|
||||
length_m=4.0,
|
||||
area_m2=14.0,
|
||||
windows=[Window(width_m=1.2, height_m=1.0, area_m2=1.2, opening_type="side_hung")],
|
||||
doors=[Door(width_mm=762.0), Door(width_mm=686.0)],
|
||||
),
|
||||
]),
|
||||
],
|
||||
)
|
||||
|
||||
# Act
|
||||
rows: list[AuditRow] = _build_rows(plan)
|
||||
|
||||
# Assert
|
||||
data_rows = [r for r in rows if r.floor_level is None]
|
||||
assert len(data_rows) == 2
|
||||
assert data_rows[0].window_label == "W1"
|
||||
assert data_rows[0].door_width_mm == 762.0
|
||||
assert data_rows[1].window_label is None
|
||||
assert data_rows[1].door_width_mm == 686.0
|
||||
|
||||
|
||||
def test_build_rows_floor_separator_precedes_rooms() -> None:
|
||||
# Arrange
|
||||
plan = Plan(
|
||||
uid="x",
|
||||
name=None,
|
||||
floors=[
|
||||
Floor(level=0, name=None, rooms=[
|
||||
Room(name="Room A", width_m=1.0, length_m=1.0, area_m2=1.0),
|
||||
]),
|
||||
Floor(level=1, name=None, rooms=[
|
||||
Room(name="Room B", width_m=1.0, length_m=1.0, area_m2=1.0),
|
||||
]),
|
||||
],
|
||||
)
|
||||
|
||||
# Act
|
||||
rows: list[AuditRow] = _build_rows(plan)
|
||||
|
||||
# Assert — rows in order: sep(0), data, sep(1), data
|
||||
assert rows[0].floor_level == 0
|
||||
assert rows[1].room_name == "Room A"
|
||||
assert rows[2].floor_level == 1
|
||||
assert rows[3].room_name == "Room B"
|
||||
|
||||
|
||||
def test_build_rows_window_labels_sequential_across_floors() -> None:
|
||||
# Arrange — two floors, one window each; labels must be W1, W2 (no reset)
|
||||
plan = Plan(
|
||||
uid="x",
|
||||
name=None,
|
||||
floors=[
|
||||
Floor(level=0, name=None, rooms=[
|
||||
Room(
|
||||
name="Ground Room",
|
||||
width_m=1.0,
|
||||
length_m=1.0,
|
||||
area_m2=1.0,
|
||||
windows=[Window(width_m=1.0, height_m=1.0, area_m2=1.0, opening_type="side_hung")],
|
||||
),
|
||||
]),
|
||||
Floor(level=1, name=None, rooms=[
|
||||
Room(
|
||||
name="First Room",
|
||||
width_m=1.0,
|
||||
length_m=1.0,
|
||||
area_m2=1.0,
|
||||
windows=[Window(width_m=1.0, height_m=1.0, area_m2=1.0, opening_type="top_hung")],
|
||||
),
|
||||
]),
|
||||
],
|
||||
)
|
||||
|
||||
# Act
|
||||
rows: list[AuditRow] = _build_rows(plan)
|
||||
|
||||
# Assert
|
||||
labels = [r.window_label for r in rows if r.window_label is not None]
|
||||
assert labels == ["W1", "W2"]
|
||||
|
||||
|
||||
def test_build_rows_room_name_in_location_on_every_row() -> None:
|
||||
# Arrange — room with 2 windows and 2 doors
|
||||
plan = Plan(
|
||||
uid="x",
|
||||
name=None,
|
||||
floors=[
|
||||
Floor(level=0, name=None, rooms=[
|
||||
Room(
|
||||
name="Kitchen",
|
||||
width_m=3.0,
|
||||
length_m=3.0,
|
||||
area_m2=9.0,
|
||||
windows=[
|
||||
Window(width_m=1.0, height_m=1.0, area_m2=1.0, opening_type="side_hung"),
|
||||
Window(width_m=0.8, height_m=1.0, area_m2=0.8, opening_type="top_hung"),
|
||||
],
|
||||
doors=[Door(width_mm=762.0), Door(width_mm=686.0)],
|
||||
),
|
||||
]),
|
||||
],
|
||||
)
|
||||
|
||||
# Act
|
||||
rows: list[AuditRow] = _build_rows(plan)
|
||||
|
||||
# Assert — every data row carries "Kitchen" in location fields
|
||||
data_rows = [r for r in rows if r.floor_level is None]
|
||||
for row in data_rows:
|
||||
assert row.window_location == "Kitchen"
|
||||
assert row.door_location == "Kitchen"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue