"""SubPattern.supports_flip/flip_axis 默认值 + AR 两个子模式的翻转声明。""" from app.question_gen.strategy import SubPattern from app.question_gen.strategy_action_recognition import AR_SUB_PATTERNS _FLIP_EXPECTED = { "temporal_reasoning_failure": "before/after", "cross_segment_entity_tracking": "first/last", } def test_sub_pattern_defaults_no_flip(): sp = SubPattern( name="x", weight=1.0, sampling_level_override=None, constraint_override=None, instruction="i", ) assert sp.supports_flip is False assert sp.flip_axis is None def test_ar_flip_declarations(): by_name = {sp.name: sp for sp in AR_SUB_PATTERNS} for name, axis in _FLIP_EXPECTED.items(): assert by_name[name].supports_flip is True, name assert by_name[name].flip_axis == axis, name def test_other_ar_sub_patterns_keep_defaults(): for sp in AR_SUB_PATTERNS: if sp.name in _FLIP_EXPECTED: continue assert sp.supports_flip is False, sp.name assert sp.flip_axis is None, sp.name def test_non_ar_strategies_have_no_flip_capable_sub_pattern(): """非 AR 题型走 BaseTaskTypeStrategy,无 SubPattern(select_sub_pattern 返回 None), 故不存在 flip-capable 子模式——翻转门对它们天然跳过。""" import random from app.question_gen.strategy import get_strategy non_ar = [ "Action Reasoning", "Attribute Perception", "Counting Problem", "Information Synopsis", "Object Recognition", "Object Reasoning", "OCR Problems", "Spatial Perception", "Spatial Reasoning", "Temporal Perception", "Temporal Reasoning", ] rng = random.Random(0) for tt in non_ar: assert get_strategy(tt).select_sub_pattern(rng) is None, tt def test_only_two_ar_sub_patterns_support_flip(): """全 6 个 AR SubPattern 中恰有 2 个 supports_flip=True,其余 4 个默认 False。""" from app.question_gen.strategy_action_recognition import AR_SUB_PATTERNS flip_names = {sp.name for sp in AR_SUB_PATTERNS if sp.supports_flip} assert flip_names == {"temporal_reasoning_failure", "cross_segment_entity_tracking"} assert all(sp.flip_axis is None for sp in AR_SUB_PATTERNS if not sp.supports_flip)