Files
2026-06-21 00:04:37 +02:00

423 lines
14 KiB
Python

import pytest
from src.nodes.character_builder import CharacterBuilder
@pytest.fixture
def node():
return CharacterBuilder()
def run(node, **kwargs):
defaults = dict(
preset_data="{}",
show_eyes=True,
show_eyeballs=True,
eyes_override="",
eyes_override_mode=False,
eyewear_override="",
eyewear_override_mode=False,
bald=False,
face_details_override="",
face_details_override_mode=False,
face_piercings_override="",
face_piercings_override_mode=False,
show_nails=True,
nail_color_override="",
nail_color_override_mode=False,
show_makeup=True,
toggle_accessories=True,
facewear_override="",
facewear_override_mode=False,
neckwear_override="",
neckwear_override_mode=False,
armwear_override="",
armwear_override_mode=False,
show_body=True,
show_body_details=True,
show_upper_body=True,
upper_details_override="",
upper_details_override_mode=False,
show_mid_body=True,
mid_details_override="",
mid_details_override_mode=False,
show_lower_body=True,
lower_details_override="",
lower_details_override_mode=False,
show_butt=True,
# Optional CharacterLoader inputs
eye_type="",
eye_color="",
pupils="",
eye_details="",
eye_effects="",
eyewear="",
mouth_type="",
teeth="",
hair_color="",
hair_style="",
face_details="",
face_piercings="",
nail_type="",
nail_color="",
makeup="",
makeup_modifiers="",
facewear="",
neckwear="",
armwear="",
base_body="",
body_type="",
skin_color="",
body_details="",
upper_body="",
upper_details="",
mid_body="",
mid_details="",
lower_body="",
lower_details="",
butt="",
body_modifiers="",
)
defaults.update(kwargs)
return node.build(**defaults)
class TestCharacterBuilderHead:
# --- Eyes group ---
def test_eye_color_and_type_in_head(self, node):
head, _, _, _, _ = run(node, eye_color="blue eyes", eye_type="almond eyes")
assert "blue eyes" in head
assert "almond eyes" in head
def test_eyes_override_replace_mode(self, node):
head, _, _, _, _ = run(
node,
eye_color="blue eyes",
eye_type="almond eyes",
eyes_override="red eyes",
eyes_override_mode=True,
)
assert "red eyes" in head
assert "blue eyes" not in head
assert "almond eyes" not in head
def test_eyes_override_add_mode(self, node):
head, _, _, _, _ = run(
node,
eye_color="blue eyes",
eyes_override="sparkle",
eyes_override_mode=False,
)
assert "blue eyes" in head
assert "sparkle" in head
def test_eyes_excluded_when_show_eyes_false(self, node):
head, _, _, _, _ = run(node, eye_color="blue eyes", show_eyes=False)
assert "blue eyes" not in head
def test_eyes_excluded_when_show_eyeballs_false(self, node):
head, _, _, _, _ = run(node, eye_color="blue eyes", show_eyeballs=False)
assert "blue eyes" not in head
def test_pupils_included(self, node):
head, _, _, _, _ = run(node, pupils="round pupils")
assert "round pupils" in head
def test_eye_details_included_when_show_eyes(self, node):
head, _, _, _, _ = run(node, eye_details="sparkly", show_eyes=True)
assert "sparkly" in head
def test_eye_details_excluded_when_show_eyes_false(self, node):
head, _, _, _, _ = run(node, eye_details="sparkly", show_eyes=False)
assert "sparkly" not in head
def test_eye_effects_always_included(self, node):
head, _, _, _, _ = run(node, eye_effects="glowing", show_eyes=False)
assert "glowing" in head
def test_eyewear_override_replace(self, node):
head, _, _, _, _ = run(
node,
eyewear="glasses",
eyewear_override="round eyewear",
eyewear_override_mode=True,
)
assert "round eyewear" in head
assert "glasses" not in head
def test_mouth_type_included(self, node):
head, _, _, _, _ = run(node, mouth_type="small mouth")
assert "small mouth" in head
def test_teeth_included(self, node):
head, _, _, _, _ = run(node, teeth="sharp teeth")
assert "sharp teeth" in head
# --- Hair group ---
def test_hair_color_included(self, node):
head, _, _, _, _ = run(node, hair_color="black hair")
assert "black hair" in head
def test_bald_outputs_bald_text(self, node):
head, _, _, _, _ = run(node, bald=True)
assert "bald" in head
def test_bald_excludes_hair_color_and_style(self, node):
head, _, _, _, _ = run(
node, bald=True, hair_color="black hair", hair_style="ponytail"
)
assert "black hair" not in head
assert "ponytail" not in head
def test_hair_color_and_style_used_when_not_bald(self, node):
head, _, _, _, _ = run(
node, bald=False, hair_color="black hair", hair_style="ponytail"
)
assert "black hair" in head
assert "ponytail" in head
# --- Face / makeup group ---
def test_face_details_override_add(self, node):
head, _, _, _, _ = run(
node,
face_details="freckles",
face_details_override="scar",
face_details_override_mode=False,
)
assert "freckles" in head
assert "scar" in head
def test_face_piercings_included_when_show_body_details(self, node):
head, _, _, _, _ = run(node, face_piercings="nose ring", show_body_details=True)
assert "nose ring" in head
def test_face_piercings_excluded_when_show_body_details_false(self, node):
head, _, _, _, _ = run(
node, face_piercings="nose ring", show_body_details=False
)
assert "nose ring" not in head
def test_nail_color_override_replace(self, node):
head, _, _, _, _ = run(
node,
nail_color="red nails",
nail_color_override="blue nails",
nail_color_override_mode=True,
show_nails=True,
show_makeup=True,
)
assert "blue nails" in head
assert "red nails" not in head
def test_nail_color_excluded_when_show_nails_false(self, node):
head, _, _, _, _ = run(node, nail_color="red nails", show_nails=False)
assert "red nails" not in head
def test_nail_color_excluded_when_show_makeup_false(self, node):
head, _, _, _, _ = run(
node, nail_color="red nails", show_nails=True, show_makeup=False
)
assert "red nails" not in head
def test_nail_type_included_when_show_nails(self, node):
head, _, _, _, _ = run(node, nail_type="long nails", show_nails=True)
assert "long nails" in head
def test_nail_type_excluded_when_show_nails_false(self, node):
head, _, _, _, _ = run(node, nail_type="long nails", show_nails=False)
assert "long nails" not in head
def test_makeup_included_when_show_makeup(self, node):
head, _, _, _, _ = run(node, makeup="red lipstick", show_makeup=True)
assert "red lipstick" in head
def test_makeup_excluded_when_show_makeup_false(self, node):
head, _, _, _, _ = run(node, makeup="red lipstick", show_makeup=False)
assert "red lipstick" not in head
def test_makeup_modifiers_included_when_show_makeup(self, node):
head, _, _, _, _ = run(node, makeup_modifiers="glossy", show_makeup=True)
assert "glossy" in head
# --- General head ---
def test_head_in_parentheses_groups(self, node):
head, _, _, _, _ = run(
node, eye_color="blue eyes", hair_color="black hair", makeup="lipstick"
)
assert "(" in head and ")" in head
def test_head_all_empty_returns_empty(self, node):
head, _, _, _, _ = run(node)
assert head == ""
def test_head_cleanup_applied(self, node):
head, _, _, _, _ = run(node, eye_color="blue eyes,")
assert not head.endswith(",")
class TestCharacterBuilderAccessories:
def test_facewear_override_replace(self, node):
_, _, facewear, _, _ = run(
node,
facewear="sticker",
facewear_override="tattoo",
facewear_override_mode=True,
)
assert "tattoo" in facewear
assert "sticker" not in facewear
def test_neckwear_included(self, node):
_, _, _, neckwear, _ = run(node, neckwear="choker")
assert "choker" in neckwear
def test_armwear_included(self, node):
_, _, _, _, armwear = run(node, armwear="ring")
assert "ring" in armwear
def test_accessories_excluded_when_toggle_false(self, node):
_, _, facewear, neckwear, armwear = run(
node,
facewear="sticker",
neckwear="choker",
armwear="ring",
toggle_accessories=False,
)
assert facewear == ""
assert neckwear == ""
assert armwear == ""
def test_accessories_all_empty_returns_empty(self, node):
_, _, facewear, neckwear, armwear = run(node)
assert facewear == ""
assert neckwear == ""
assert armwear == ""
class TestCharacterBuilderBody:
def test_base_body_included(self, node):
_, body, _, _, _ = run(node, base_body="slim")
assert "slim" in body
def test_body_type_included(self, node):
_, body, _, _, _ = run(node, body_type="athletic")
assert "athletic" in body
def test_skin_color_included(self, node):
_, body, _, _, _ = run(node, skin_color="tan")
assert "tan" in body
def test_body_details_included(self, node):
_, body, _, _, _ = run(node, body_details="scar")
assert "scar" in body
def test_upper_body_included_when_show_upper_body(self, node):
_, body, _, _, _ = run(node, upper_body="pectorals", show_upper_body=True)
assert "pectorals" in body
def test_upper_body_excluded_when_show_upper_body_false(self, node):
_, body, _, _, _ = run(node, upper_body="pectorals", show_upper_body=False)
assert "pectorals" not in body
def test_upper_details_override_replace(self, node):
_, body, _, _, _ = run(
node,
upper_details="cross piercing",
upper_details_override="other ring",
upper_details_override_mode=True,
show_upper_body=True,
show_body_details=True,
)
assert "other ring" in body
assert "cross piercing" not in body
def test_upper_details_excluded_when_show_body_details_false(self, node):
_, body, _, _, _ = run(
node,
upper_details="cross piercing",
show_upper_body=True,
show_body_details=False,
)
assert "cross piercing" not in body
def test_mid_body_included_when_show_mid_body(self, node):
_, body, _, _, _ = run(node, mid_body="abs", show_mid_body=True)
assert "abs" in body
def test_mid_body_excluded_when_show_mid_body_false(self, node):
_, body, _, _, _ = run(node, mid_body="abs", show_mid_body=False)
assert "abs" not in body
def test_mid_details_override_replace(self, node):
_, body, _, _, _ = run(
node,
mid_details="navel piercing",
mid_details_override="other ring",
mid_details_override_mode=True,
show_mid_body=True,
show_body_details=True,
)
assert "other ring" in body
assert "navel piercing" not in body
def test_lower_body_included_when_show_lower_body(self, node):
_, body, _, _, _ = run(node, lower_body="wide hips", show_lower_body=True)
assert "wide hips" in body
def test_lower_body_excluded_when_show_lower_body_false(self, node):
_, body, _, _, _ = run(node, lower_body="wide hips", show_lower_body=False)
assert "wide hips" not in body
def test_lower_details_override_replace(self, node):
_, body, _, _, _ = run(
node,
lower_details="hip ring",
lower_details_override="other ring",
lower_details_override_mode=True,
show_lower_body=True,
show_body_details=True,
)
assert "other ring" in body
assert "hip ring" not in body
def test_butt_included_when_show_butt(self, node):
_, body, _, _, _ = run(node, butt="butt", show_butt=True)
assert "butt" in body
def test_butt_excluded_when_show_butt_false(self, node):
_, body, _, _, _ = run(node, butt="butt", show_butt=False)
assert "butt" not in body
def test_body_modifiers_included(self, node):
_, body, _, _, _ = run(node, body_modifiers="toned")
assert "toned" in body
def test_show_body_false_excludes_everything(self, node):
_, body, _, _, _ = run(
node,
base_body="slim",
body_type="athletic",
skin_color="tan",
upper_body="pectorals",
mid_body="abs",
lower_body="wide hips",
butt="butt",
body_modifiers="toned",
show_body=False,
)
assert body == ""
def test_body_all_empty_returns_empty(self, node):
_, body, _, _, _ = run(node)
assert body == ""
def test_body_in_parentheses(self, node):
_, body, _, _, _ = run(node, base_body="slim")
assert body == "(slim)"
def test_body_cleanup_applied(self, node):
_, body, _, _, _ = run(node, base_body="slim,")
assert not body.endswith(",)")