# ============================================================================ # 用户自定义规则测试(src/lib/rules.sh):命名模板渲染 + 匹配规则键 # ============================================================================ # render_naming_template:普通占位符 + 补零 test_render_plain_and_padding() { assert_eq "S01E02" "$(render_naming_template 'S{season:02}E{episode:02}' season=1 episode=2)" assert_eq "Season 12" "$(render_naming_template 'Season {season}' season=12)" } # render_naming_template:条件段(year 非空渲染,空则不渲染) test_render_conditional_year() { assert_eq "Movie (2020)" "$(render_naming_template '{title}{?year: ({year})}' title=Movie year=2020)" assert_eq "Movie" "$(render_naming_template '{title}{?year: ({year})}' title=Movie year=)" } # render_naming_template:条件段正文含嵌套占位符 test_render_conditional_nested_placeholder() { assert_eq "Show [2020]" "$(render_naming_template '{title}{?year: [{year}]}' title=Show year=2020)" } # render_naming_template:默认剧集模板全链路(含空集名条件段) test_render_episode_template_full() { assert_eq "S01E02 - Name" \ "$(render_naming_template 'S{season:02}E{episode:02}{range}{?episode_name: - {episode_name}}' season=01 episode=02 range= 'episode_name=Name')" assert_eq "S01E02" \ "$(render_naming_template 'S{season:02}E{episode:02}{range}{?episode_name: - {episode_name}}' season=01 episode=02 range= 'episode_name=')" assert_eq "S01E02-E03 - A - B" \ "$(render_naming_template 'S{season:02}E{episode:02}{range}{?episode_name: - {episode_name}}' season=01 episode=02 range=-E03 'episode_name=A - B')" } # render_naming_template:值含 & 不被替换语义破坏(${var//pat/repl} 会把 & 当匹配整体) test_render_ampersand_safe() { assert_eq "A & B" "$(render_naming_template '{episode_name}' 'episode_name=A & B')" assert_eq "Artist & Band - Album" \ "$(render_naming_template '{artist} - {album}' 'artist=Artist & Band' album=Album)" } # render_naming_template:值内花括号被剔除(防破坏模板解析) test_render_braces_in_value_stripped() { assert_eq "AB" "$(render_naming_template '{title}' 'title=A{B')" } # render_naming_template:未知占位符渲染为空 test_render_unknown_placeholder_empty() { assert_eq "X " "$(render_naming_template '{title} {foo}' title=X)" } # render_naming_template:补零对非数字值原样保留 test_render_padding_non_numeric() { assert_eq "abc" "$(render_naming_template '{n:03}' n=abc)" } # render_naming_template:无配对右花括号按字面保留 test_render_unclosed_brace_literal() { assert_eq "X {tail" "$(render_naming_template 'X {tail' title=X)" } # render_naming:配置键未设置时用内置默认(测试环境不经过 load_config) test_render_naming_default_fallback() { assert_eq "Season 03" "$(render_naming NAMING_SEASON season=3)" assert_eq "Movie (2020)" "$(render_naming NAMING_MOVIE title=Movie year=2020)" assert_eq "S00Menu - Menu01" "$(render_naming NAMING_SPECIAL tag=Menu fragment=Menu01)" assert_eq "Artist/Album" "$(render_naming NAMING_MUSIC artist=Artist album=Album)" } # template_token_names:提取占位符名(含条件段正文内的;重复名由调用方去重) test_template_token_names() { assert_eq "$(printf 'title\nyear' | sort)" "$(template_token_names '{title}{?year: ({year})}' | sort -u)" assert_eq "$(printf 'season\nepisode\nrange\nepisode_name' | sort)" \ "$(template_token_names 'S{season:02}E{episode:02}{range}{?episode_name: - {episode_name}}' | sort -u)" } # rule_key:小写 + 空白折叠 + 去首尾空白 test_rule_key_normalization() { assert_eq "sword art online" "$(rule_key ' Sword Art ONLINE ')" assert_eq "sword art online" "$(rule_key 'Sword Art Online')" assert_eq "俺妹" "$(rule_key '俺妹')" }