from engine.models.ability import Ability, Condition, Effect, explain_filter_attr, format_filter_attr from engine.models.generated_enums import ConditionType, EffectType, TargetType, TriggerType from tools.verify.bytecode_decoder import decode_bytecode def test_any_stage_filter_summary_uses_named_fields(): ability = Ability(raw_text="test", trigger=TriggerType.CONSTANT, effects=[]) condition = Condition(type=ConditionType.COUNT_STAGE, params={"filter": "COST_GE_13", "area": "ANY_STAGE"}) packed_attr = ability._pack_filter_attr(condition) explained = explain_filter_attr(packed_attr) assert explained["target_player"] == 3 assert explained["value_threshold"] == 13 assert explained["is_cost_type"] is True assert "target=both" in format_filter_attr(packed_attr) assert "cost>=13" in format_filter_attr(packed_attr) def test_decoder_renders_named_filter_summary_for_compiled_condition(): condition = Condition(type=ConditionType.COUNT_STAGE, params={"filter": "COST_GE_13", "area": "ANY_STAGE"}, value=1) effect = Effect(effect_type=EffectType.ADD_BLADES, value=2, target=TargetType.SELF) ability = Ability(raw_text="test", trigger=TriggerType.CONSTANT, effects=[effect], conditions=[condition]) decoded = decode_bytecode(ability.compile()) assert "target=both" in decoded assert "cost>=13" in decoded