# ============================================================================ # 匹配规则测试(src/lib/rules.sh):match_rules.json 加载与查询 # ============================================================================ setup() { TEST_DIR="$(mktemp -d)" AUTOMATED=true # 跳过交互创建 load_match_rules "$TEST_DIR/match_rules.json" } teardown() { rm -rf "$TEST_DIR" } # load_match_rules:搜索别名(字符串与对象形式)+ ID 映射 test_load_match_rules_basic() { cat >"$TEST_DIR/match_rules.json" <<'EOF' { "search_aliases": { "俺妹": "Ore no Imouto ga Konna ni Kawaii Wake ga Nai", "路人女主剧场版": {"term": "Saekano the Movie", "year": "2019"} }, "id_maps": { "movie": {"刀剑神域": 20982}, "tv": {"魔法禁书目录": 4654} } } EOF load_match_rules "$TEST_DIR/match_rules.json" # 别名:字符串形式(无 year)与对象形式(带 year) assert_eq "Ore no Imouto ga Konna ni Kawaii Wake ga Nai " \ "$(match_rule_lookup_alias "俺妹")" assert_eq "Saekano the Movie 2019" \ "$(match_rule_lookup_alias "路人女主剧场版")" # ID 映射:movie/tv 分表,键归一化后命中 assert_eq "20982" "${MATCH_RULES_ID_MOVIE[刀剑神域]:-}" assert_eq "4654" "${MATCH_RULES_ID_TV[魔法禁书目录]:-}" # 未命中 assert_empty "$(match_rule_lookup_alias "不存在的标题")" assert_empty "${MATCH_RULES_ID_MOVIE[不存在的标题]:-}" assert_empty "${MATCH_RULES_ID_TV[不存在的标题]:-}" } # load_match_rules:键归一化(大小写/空白)后命中 test_load_match_rules_key_normalized() { cat >"$TEST_DIR/match_rules.json" <<'EOF' { "search_aliases": { "Sword Art Online": "ソードアート・オンライン" }, "id_maps": { "movie": {"A B": 1} } } EOF load_match_rules "$TEST_DIR/match_rules.json" assert_eq "ソードアート・オンライン " "$(match_rule_lookup_alias "sword art online")" assert_eq "1" "${MATCH_RULES_ID_MOVIE[a b]:-}" } # load_match_rules:文件缺失 → 空规则(不报错) test_load_match_rules_missing_file() { assert_eq "0" "${#MATCH_RULES_ALIAS_TERM[@]}" assert_empty "$(match_rule_lookup_alias "任意标题")" } # load_match_rules:非 JSON 对象 → 空规则 + 不阻断 test_load_match_rules_invalid_json() { echo 'not json' >"$TEST_DIR/match_rules.json" load_match_rules "$TEST_DIR/match_rules.json" assert_eq "0" "${#MATCH_RULES_ALIAS_TERM[@]}" assert_eq "0" "${#MATCH_RULES_ID_MOVIE[@]}" } # load_match_rules:空别名 term 的条目跳过(不产生空键) test_load_match_rules_empty_term_skipped() { cat >"$TEST_DIR/match_rules.json" <<'EOF' { "search_aliases": { "空词": "" }, "id_maps": { "tv": {"空ID": ""} } } EOF load_match_rules "$TEST_DIR/match_rules.json" assert_eq "0" "${#MATCH_RULES_ALIAS_TERM[@]}" assert_eq "0" "${#MATCH_RULES_ID_TV[@]}" } # init_match_rules:自动化模式 + 文件缺失 → 不创建、空规则 test_init_match_rules_automated_missing() { MATCH_RULES_FILE="$TEST_DIR/nonexistent/match_rules.json" init_match_rules "$MATCH_RULES_FILE" assert_file_absent "$MATCH_RULES_FILE" assert_eq "0" "${#MATCH_RULES_ALIAS_TERM[@]}" } # init_match_rules:文件存在 → 正常加载 test_init_match_rules_existing() { cat >"$TEST_DIR/rules.json" <<'EOF' {"search_aliases": {"别名": "Term"}, "id_maps": {"movie": {"影": 9}}} EOF init_match_rules "$TEST_DIR/rules.json" assert_eq "Term " "$(match_rule_lookup_alias "别名")" assert_eq "9" "${MATCH_RULES_ID_MOVIE[影]:-}" }