1
etude_lego_jurassic_world/tests/test_minifig_head_faces.py

149 lines
4.4 KiB
Python

"""Tests des têtes dual-face."""
import csv
from pathlib import Path
from lib.rebrickable.minifig_head_faces import (
aggregate_by_character,
aggregate_by_set,
aggregate_by_year,
build_head_faces,
detect_dual_face,
)
def write_csv(path: Path, headers: list[str], rows: list[list[str]]) -> None:
"""Écrit un CSV simple pour les besoins de tests."""
with path.open("w", newline="") as csv_file:
writer = csv.writer(csv_file)
writer.writerow(headers)
writer.writerows(rows)
def test_detect_dual_face_matches_keywords() -> None:
"""Reconnaît les mentions dual-face dans le nom."""
assert detect_dual_face("Minifig Head Dual Sided Smile") == "true"
assert detect_dual_face("Minifig Head w/ Alt Face") == "true"
assert detect_dual_face("Minifig Head Angry") == "false"
def test_build_head_faces_and_aggregates(tmp_path: Path) -> None:
"""Construit l'annotation dual-face puis agrège par set/année/personnage."""
minifigs_by_set = tmp_path / "minifigs_by_set.csv"
write_csv(
minifigs_by_set,
["set_num", "part_num", "known_character", "fig_num", "gender"],
[
["1000-1", "p1", "Alice", "fig-1", "female"],
["1000-1", "p2", "Bob", "fig-2", "male"],
["2000-1", "p1", "Alice", "fig-1", "female"],
],
)
parts_catalog = tmp_path / "parts.csv"
write_csv(
parts_catalog,
["part_num", "name", "part_cat_id"],
[
["p1", "Minifig Head Dual Sided Grin", "59"],
["p2", "Minifig Head Serious", "59"],
],
)
sets_enriched = tmp_path / "sets_enriched.csv"
write_csv(
sets_enriched,
["set_num", "set_id", "name", "year", "in_collection"],
[
["1000-1", "1000", "Set A", "2020", "true"],
["2000-1", "2000", "Set B", "2021", "false"],
],
)
heads = build_head_faces(minifigs_by_set, parts_catalog, sets_enriched)
by_year = aggregate_by_year(heads)
by_set = aggregate_by_set(heads)
by_character = aggregate_by_character(heads)
assert heads == [
{
"set_num": "1000-1",
"set_id": "1000",
"year": "2020",
"name": "Set A",
"in_collection": "true",
"part_num": "p1",
"part_name": "Minifig Head Dual Sided Grin",
"fig_num": "fig-1",
"known_character": "Alice",
"gender": "female",
"is_dual_face": "true",
},
{
"set_num": "1000-1",
"set_id": "1000",
"year": "2020",
"name": "Set A",
"in_collection": "true",
"part_num": "p2",
"part_name": "Minifig Head Serious",
"fig_num": "fig-2",
"known_character": "Bob",
"gender": "male",
"is_dual_face": "false",
},
{
"set_num": "2000-1",
"set_id": "2000",
"year": "2021",
"name": "Set B",
"in_collection": "false",
"part_num": "p1",
"part_name": "Minifig Head Dual Sided Grin",
"fig_num": "fig-1",
"known_character": "Alice",
"gender": "female",
"is_dual_face": "true",
},
]
assert by_year == [
{"year": "2020", "total_heads": "2", "dual_heads": "1", "share_dual": "0.5000"},
{"year": "2021", "total_heads": "1", "dual_heads": "1", "share_dual": "1.0000"},
]
assert by_set == [
{
"set_num": "2000-1",
"set_id": "2000",
"name": "Set B",
"year": "2021",
"in_collection": "false",
"total_heads": "1",
"dual_heads": "1",
"share_dual": "1.0000",
},
{
"set_num": "1000-1",
"set_id": "1000",
"name": "Set A",
"year": "2020",
"in_collection": "true",
"total_heads": "2",
"dual_heads": "1",
"share_dual": "0.5000",
},
]
assert by_character == [
{
"known_character": "Alice",
"gender": "female",
"total_heads": "2",
"dual_heads": "2",
"share_dual": "1.0000",
},
{
"known_character": "Bob",
"gender": "male",
"total_heads": "1",
"dual_heads": "0",
"share_dual": "0.0000",
},
]