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

365 lines
8.8 KiB
Python

from unittest.mock import patch
import pytest
_CFG = {
"eye_type": ["--", "almond eyes"],
"pupils": ["--", "round pupils"],
"mouth_type": ["--", "small mouth"],
"teeth": ["--", "sharp teeth"],
"nail_type": ["--", "long nails"],
"base_body": ["--", "slim"],
"body_type": ["--", "toned"],
"skin_color": ["--", "tan"],
"chest": ["--", "pectorals"],
"chest_details": ["--", "cleavage"],
"stomach": ["--", "abs"],
"hips": ["--", "narrow hips"],
"thighs": ["--", "slim thighs"],
"butt": ["--", "butt"],
}
with patch("src.nodes.character_loader.load_builder_config", return_value=_CFG):
from src.nodes.character_loader import CharacterLoader
@pytest.fixture
def node():
return CharacterLoader()
def run(node, **kwargs):
defaults = dict(
character_file="--",
eye_type="--",
eye_color="",
pupils="--",
eye_details="",
eyewear="",
mouth_type="--",
teeth="--",
hair_color="",
hair_style_options="",
hair_style_selected="",
face_details="",
face_piercings="",
nail_type="--",
nail_color="",
makeup="",
facewear="",
neckwear="",
armwear="",
base_body="--",
body_type="--",
skin_color="--",
body_details="",
upper_body="",
chest="--",
chest_details="--",
upper_details="",
stomach="--",
narrow_waist=False,
muffin_top=False,
mid_details="",
lower_body="",
hips="--",
hip_dips=False,
thighs="--",
lower_details="",
butt="--",
)
defaults.update(kwargs)
return node.load_character(**defaults)
# RETURN_NAMES index map for readability
IDX = {
"eye_type": 0,
"eye_color": 1,
"pupils": 2,
"eye_details": 3,
"eyewear": 4,
"mouth_type": 5,
"teeth": 6,
"hair_color": 7,
"hair_style": 8,
"face_details": 9,
"face_piercings": 10,
"nail_type": 11,
"nail_color": 12,
"makeup": 13,
"facewear": 14,
"neckwear": 15,
"armwear": 16,
"base_body": 17,
"body_type": 18,
"skin_color": 19,
"body_details": 20,
"upper_body": 21,
"upper_details": 22,
"mid_body": 23,
"mid_details": 24,
"lower_body": 25,
"lower_details": 26,
"butt": 27,
}
# --- Base cases ---
def test_eye_color_returned(node):
result = run(node, eye_color="blue eyes")
assert result[IDX["eye_color"]] == "blue eyes"
def test_eye_type_returned(node):
result = run(node, eye_type="almond eyes")
assert result[IDX["eye_type"]] == "almond eyes"
def test_eye_type_dash_returns_empty(node):
result = run(node, eye_type="--")
assert result[IDX["eye_type"]] == ""
def test_pupils_returned(node):
result = run(node, pupils="round pupils")
assert result[IDX["pupils"]] == "round pupils"
def test_eye_details_returned(node):
result = run(node, eye_details="sparkly")
assert result[IDX["eye_details"]] == "sparkly"
def test_eyewear_returned(node):
result = run(node, eyewear="glasses")
assert result[IDX["eyewear"]] == "glasses"
def test_teeth_returned(node):
result = run(node, teeth="sharp teeth")
assert result[IDX["teeth"]] == "sharp teeth"
def test_teeth_dash_returns_empty(node):
result = run(node, teeth="--")
assert result[IDX["teeth"]] == ""
def test_mouth_type_returned(node):
result = run(node, mouth_type="small mouth")
assert result[IDX["mouth_type"]] == "small mouth"
def test_face_details_returned(node):
result = run(node, face_details="freckles")
assert result[IDX["face_details"]] == "freckles"
def test_face_piercings_returned(node):
result = run(node, face_piercings="nose ring")
assert result[IDX["face_piercings"]] == "nose ring"
def test_hair_color_returned(node):
result = run(node, hair_color="black hair")
assert result[IDX["hair_color"]] == "black hair"
def test_hair_style_selected_returned(node):
result = run(node, hair_style_selected="ponytail")
assert result[IDX["hair_style"]] == "ponytail"
def test_nail_color_returned(node):
result = run(node, nail_color="red nails")
assert result[IDX["nail_color"]] == "red nails"
def test_nail_type_returned(node):
result = run(node, nail_type="long nails")
assert result[IDX["nail_type"]] == "long nails"
def test_nail_type_dash_returns_empty(node):
result = run(node, nail_type="--")
assert result[IDX["nail_type"]] == ""
def test_makeup_returned(node):
result = run(node, makeup="red lipstick")
assert result[IDX["makeup"]] == "red lipstick"
def test_facewear_returned(node):
result = run(node, facewear="freckle sticker")
assert result[IDX["facewear"]] == "freckle sticker"
def test_neckwear_returned(node):
result = run(node, neckwear="choker")
assert result[IDX["neckwear"]] == "choker"
def test_armwear_returned(node):
result = run(node, armwear="ring")
assert result[IDX["armwear"]] == "ring"
def test_base_body_returned(node):
result = run(node, base_body="slim")
assert result[IDX["base_body"]] == "slim"
def test_base_body_dash_returns_empty(node):
result = run(node, base_body="--")
assert result[IDX["base_body"]] == ""
def test_body_type_returned(node):
result = run(node, body_type="toned")
assert result[IDX["body_type"]] == "toned"
def test_skin_color_returned(node):
result = run(node, skin_color="tan")
assert result[IDX["skin_color"]] == "tan"
def test_body_details_returned(node):
result = run(node, body_details="scar")
assert result[IDX["body_details"]] == "scar"
def test_upper_details_returned(node):
result = run(node, upper_details="scar")
assert result[IDX["upper_details"]] == "scar"
def test_mid_details_returned(node):
result = run(node, mid_details="navel piercing")
assert result[IDX["mid_details"]] == "navel piercing"
def test_lower_details_returned(node):
result = run(node, lower_details="hip piercing")
assert result[IDX["lower_details"]] == "hip piercing"
def test_butt_returned(node):
result = run(node, butt="butt")
assert result[IDX["butt"]] == "butt"
# --- Upper body group: upper_body + chest + chest_details ---
def test_upper_body_group_combines_all(node):
result = run(
node,
upper_body="ribs",
chest="pectorals",
chest_details="cleavage",
)
assert result[IDX["upper_body"]] == "ribs, pectorals, cleavage"
def test_upper_body_group_partial(node):
result = run(node, upper_body="", chest="pectorals", chest_details="--")
assert result[IDX["upper_body"]] == "pectorals"
def test_upper_body_group_all_empty(node):
result = run(node)
assert result[IDX["upper_body"]] == ""
def test_upper_body_group_dash_ignored(node):
result = run(node, chest="--", chest_details="--")
assert result[IDX["upper_body"]] == ""
# --- Mid body group: stomach + narrow_waist + muffin_top ---
def test_mid_body_group_stomach_only(node):
result = run(node, stomach="abs")
assert result[IDX["mid_body"]] == "abs"
def test_mid_body_group_narrow_waist_true(node):
result = run(node, narrow_waist=True)
assert "narrow waist" in result[IDX["mid_body"]]
def test_mid_body_group_muffin_top_true(node):
result = run(node, muffin_top=True)
assert "muffin top" in result[IDX["mid_body"]]
def test_mid_body_group_narrow_waist_false_excluded(node):
result = run(node, narrow_waist=False)
assert "narrow waist" not in result[IDX["mid_body"]]
def test_mid_body_group_combined(node):
result = run(node, stomach="abs", narrow_waist=True, muffin_top=True)
assert result[IDX["mid_body"]] == "abs, narrow waist, muffin top"
def test_mid_body_group_all_empty(node):
result = run(node)
assert result[IDX["mid_body"]] == ""
# --- Lower body group: lower_body + hips + hip_dips + thighs ---
def test_lower_body_group_combines_all(node):
result = run(
node,
lower_body="narrow hips str",
hips="narrow hips",
hip_dips=True,
thighs="slim thighs",
)
assert (
result[IDX["lower_body"]]
== "narrow hips str, narrow hips, hip dips, slim thighs"
)
def test_lower_body_group_hip_dips_false_excluded(node):
result = run(node, hip_dips=False)
assert "hip dips" not in result[IDX["lower_body"]]
def test_lower_body_group_thighs_dash_ignored(node):
result = run(node, thighs="--")
assert result[IDX["lower_body"]] == ""
def test_lower_body_group_all_empty(node):
result = run(node)
assert result[IDX["lower_body"]] == ""
# --- General ---
def test_return_count(node):
result = run(node)
assert len(result) == 28
def test_all_empty(node):
result = run(node)
assert all(v == "" for v in result)
def test_stripped_values(node):
result = run(node, eye_color=" blue eyes ")
assert result[IDX["eye_color"]] == "blue eyes"