Add tests/test_nodes_extended.py covering previously untested paths:
- _sanitize_dimension: exact midpoint tie-break (>= rounds up), exact
multiples of 8, DIM_MIN/DIM_MAX boundary clamping, None/non-numeric
string fallback, float truncation, near-DIM_MAX midpoint edge cases.
- _sanitize_steps: STEPS_MIN/STEPS_MAX boundary clamping, zero/negative
inputs, None/non-numeric string fallback, float string vs float value.
- _sanitize_profile: blank/whitespace-only id and name rejected (None),
whitespace stripping, missing keys fallback to sanitized defaults,
invalid dimension values sanitized.
- _load_profiles: non-list JSON (object, number, null), list with
non-dict entries skipped, empty list falls back to DEFAULT_PROFILES,
all-invalid entries fall back to defaults, valid profiles sanitized
and returned in order.
- _resolve_selected_profile: match found returns exact profile object,
first-profile and second-profile match, fallback sets id from first
profile and sanitizes selected width/height/steps.
- generate: latent shape math (height//8, width//8), fixed batch and
channel dims, device from constructor, steps passthrough for matched
and fallback profiles, result is a 2-tuple with "samples" key.
- INPUT_TYPES: required fields present, correct ComfyUI type strings,
min/max/step values match module constants.
- NODE_CLASS_MAPPINGS / NODE_DISPLAY_NAME_MAPPINGS: correct keys,
class identity, non-empty display name, RETURN_TYPES length matches
RETURN_NAMES, FUNCTION attribute names a callable method.
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>