diff --git a/nodes.py b/nodes.py index 75a6b41..c9c215b 100644 --- a/nodes.py +++ b/nodes.py @@ -304,12 +304,15 @@ def build_description(sex, nat, age, skin_texture, if s: parts.append(fmt.format(s)) - # Opener: "34 year old Brazilian female" + # Opener: "34 year old Brazilian female". Sex is shown only alongside an age + # or nationality, so a face-only fragment does not start with a bare "female". age_str = f"{age['age']} year old" if age else None nat_str = nat_text(nat) or None sex_str = sex if sex else None - opener_parts = [p for p in [age_str, nat_str, sex_str] if p] + opener_parts = [p for p in [age_str, nat_str] if p] if opener_parts: + if sex_str: + opener_parts.append(sex_str) parts.append(" ".join(opener_parts)) add(face_shape, "{} face") diff --git a/test_random_person.py b/test_random_person.py index 5f8de7a..1305988 100644 --- a/test_random_person.py +++ b/test_random_person.py @@ -153,6 +153,21 @@ class TestBuildDescription(unittest.TestCase): s = core.build_description(*args) self.assertNotIn("eyes eyes", s) + def test_opener_omits_bare_sex(self): + # sex present but no age and no nationality -> no leading "female". + args = [""] + [None] * 17 + args[0] = "female" # sex positional slot + args[4] = {"description": "oval"} # face_shape slot -> "oval face" + s = core.build_description(*args) + self.assertTrue(s.startswith("oval face"), s) + self.assertNotIn("female", s) + + def test_opener_keeps_sex_with_age(self): + # age + sex -> " year old female ..." + s = core.build_description( + "female", None, {"age": 30}, *( [None] * 15 )) + self.assertIn("year old female", s) + class TestBodyData(unittest.TestCase):