import ast from pathlib import Path import unittest ROOT = Path(__file__).resolve().parents[1] def _module_tree(relative_path: str) -> ast.Module: return ast.parse((ROOT / relative_path).read_text(encoding="utf-8")) def _class_node(tree: ast.Module, class_name: str) -> ast.ClassDef: for node in tree.body: if isinstance(node, ast.ClassDef) and node.name == class_name: return node raise AssertionError(f"class {class_name} not found") def _assigned_tuple(class_node: ast.ClassDef, name: str) -> tuple[str, ...]: for node in class_node.body: if ( isinstance(node, ast.Assign) and any(isinstance(target, ast.Name) and target.id == name for target in node.targets) and isinstance(node.value, ast.Tuple) ): return tuple( item.value for item in node.value.elts if isinstance(item, ast.Constant) and isinstance(item.value, str) ) raise AssertionError(f"{name} tuple not found on {class_node.name}") class SmartSeedOutputTests(unittest.TestCase): def test_easy_cade_exposes_selected_seed_without_reordering_existing_outputs(self): tree = _module_tree("mod/easy/mg_cade25_easy.py") cade_easy = _class_node(tree, "CADEEasyUI") self.assertEqual( _assigned_tuple(cade_easy, "RETURN_NAMES"), ("LATENT", "IMAGE", "mask_preview", "selected_seed"), ) self.assertEqual( _assigned_tuple(cade_easy, "RETURN_TYPES"), ("LATENT", "IMAGE", "IMAGE", "INT"), ) def test_base_cade_returns_selected_seed_for_advanced_wiring(self): tree = _module_tree("mod/easy/mg_cade25_easy.py") base_cade = _class_node(tree, "ComfyAdaptiveDetailEnhancer25") self.assertEqual( _assigned_tuple(base_cade, "RETURN_NAMES"), ("LATENT", "IMAGE", "steps", "cfg", "denoise", "mask_preview", "selected_seed"), ) self.assertEqual( _assigned_tuple(base_cade, "RETURN_TYPES"), ("LATENT", "IMAGE", "INT", "FLOAT", "FLOAT", "IMAGE", "INT"), ) def test_supersimple_exposes_final_step_selected_seed(self): tree = _module_tree("mod/easy/mg_supersimple_easy.py") super_simple = _class_node(tree, "MG_SuperSimple") self.assertEqual( _assigned_tuple(super_simple, "RETURN_NAMES"), ("LATENT", "IMAGE", "selected_seed"), ) self.assertEqual( _assigned_tuple(super_simple, "RETURN_TYPES"), ("LATENT", "IMAGE", "INT"), ) if __name__ == "__main__": unittest.main()