//! Table-driven checks over representative release names. The full fixture //! corpus pulled from real indexers is issue #9; these rows pin the parser's //! behaviour per shape of name. use arr_parse::{parse, Codec, Edition, HdrMarker, LanguageMarker, NameClaims, Resolution, Source}; use serde as _; struct Case { name: &'static str, want: NameClaims, } #[allow(clippy::unnecessary_wraps)] fn s(v: &str) -> Option { Some(v.to_string()) } #[allow(clippy::too_many_lines)] fn cases() -> Vec { vec![ Case { name: "Movie.Title.2024.2160p.UHD.BluRay.DV.HDR10.x265.TrueHD-GROUP", want: NameClaims { title: s("Movie Title"), year: Some(2024), resolution: Some(Resolution::P2160), source: Some(Source::BluRay), codec: Some(Codec::X265), hdr: vec![HdrMarker::DolbyVision, HdrMarker::Hdr10], group: s("GROUP"), ..NameClaims::default() }, }, Case { // "Web" before the year is title, not a source claim. name: "Charlottes.Web.2006.1080p.BluRay.x264-GRP", want: NameClaims { title: s("Charlottes Web"), year: Some(2006), resolution: Some(Resolution::P1080), source: Some(Source::BluRay), codec: Some(Codec::X264), group: s("GRP"), ..NameClaims::default() }, }, Case { name: "Dune Part Two (2024) [2160p] [WEB-DL] [HDR10+] [YTS.MX]", want: NameClaims { title: s("Dune Part Two"), year: Some(2024), resolution: Some(Resolution::P2160), source: Some(Source::WebDl), hdr: vec![HdrMarker::Hdr10Plus], group: s("YTS.MX"), ..NameClaims::default() }, }, Case { name: "O.Auto.da.Compadecida.2000.NACIONAL.1080p.WEB-DL.x264-BRA", want: NameClaims { title: s("O Auto da Compadecida"), year: Some(2000), resolution: Some(Resolution::P1080), source: Some(Source::WebDl), codec: Some(Codec::X264), languages: vec![LanguageMarker::PtBr], group: s("BRA"), ..NameClaims::default() }, }, Case { // Repeated pt-BR markers dedupe to one claim. name: "Filme.2023.Dublado.PT-BR.1080p.WEBRip.x264", want: NameClaims { title: s("Filme"), year: Some(2023), resolution: Some(Resolution::P1080), source: Some(Source::WebRip), codec: Some(Codec::X264), languages: vec![LanguageMarker::PtBr], ..NameClaims::default() }, }, Case { name: "Filme.Infantil.2023.1080p.WEB-DL.Dual.Áudio.x264", want: NameClaims { title: s("Filme Infantil"), year: Some(2023), resolution: Some(Resolution::P1080), source: Some(Source::WebDl), codec: Some(Codec::X264), languages: vec![LanguageMarker::Dual], ..NameClaims::default() }, }, Case { name: "Movie.2024.MULTi.1080p.WEB.x265-GRP", want: NameClaims { title: s("Movie"), year: Some(2024), resolution: Some(Resolution::P1080), source: Some(Source::WebDl), codec: Some(Codec::X265), languages: vec![LanguageMarker::Multi], group: s("GRP"), ..NameClaims::default() }, }, Case { // Season/episode tags bound the title; no year needed. name: "Serie.S01E02.720p.HDTV.x264-LOL", want: NameClaims { title: s("Serie"), resolution: Some(Resolution::P720), source: Some(Source::Hdtv), codec: Some(Codec::X264), group: s("LOL"), ..NameClaims::default() }, }, Case { // Remux beats the BluRay marker riding along. name: "Movie.2024.2160p.BluRay.REMUX.HEVC.TrueHD.7.1.Atmos-FGT", want: NameClaims { title: s("Movie"), year: Some(2024), resolution: Some(Resolution::P2160), source: Some(Source::Remux), codec: Some(Codec::X265), group: s("FGT"), ..NameClaims::default() }, }, Case { name: "Movie.2024.Extended.1080p.BluRay.x264", want: NameClaims { title: s("Movie"), year: Some(2024), resolution: Some(Resolution::P1080), source: Some(Source::BluRay), codec: Some(Codec::X264), editions: vec![Edition::Extended], ..NameClaims::default() }, }, Case { // Edition between title and year is stripped off the title tail. name: "Movie.Directors.Cut.2024.1080p.BluRay", want: NameClaims { title: s("Movie"), year: Some(2024), resolution: Some(Resolution::P1080), source: Some(Source::BluRay), editions: vec![Edition::DirectorsCut], ..NameClaims::default() }, }, Case { // First year-like token is the title, second is the year. name: "2012.2009.1080p.BluRay.x264", want: NameClaims { title: s("2012"), year: Some(2009), resolution: Some(Resolution::P1080), source: Some(Source::BluRay), codec: Some(Codec::X264), ..NameClaims::default() }, }, Case { name: "Blade.Runner.2049.2017.2160p.WEB-DL.DDP5.1.HDR.HEVC-XEBEC", want: NameClaims { title: s("Blade Runner 2049"), year: Some(2017), resolution: Some(Resolution::P2160), source: Some(Source::WebDl), codec: Some(Codec::X265), hdr: vec![HdrMarker::Hdr], group: s("XEBEC"), ..NameClaims::default() }, }, Case { name: "Movie.2024.HDTS.x264-ETRG", want: NameClaims { title: s("Movie"), year: Some(2024), source: Some(Source::Telesync), codec: Some(Codec::X264), group: s("ETRG"), ..NameClaims::default() }, }, Case { name: "Movie.2024.1080p.HMAX.WEB-DL.DD5.1.H.264-GROUP", want: NameClaims { title: s("Movie"), year: Some(2024), resolution: Some(Resolution::P1080), source: Some(Source::WebDl), codec: Some(Codec::X264), group: s("GROUP"), ..NameClaims::default() }, }, Case { // Spaced dash before the group. name: "Movie Title 2024 1080p BluRay x265 - VXT", want: NameClaims { title: s("Movie Title"), year: Some(2024), resolution: Some(Resolution::P1080), source: Some(Source::BluRay), codec: Some(Codec::X265), group: s("VXT"), ..NameClaims::default() }, }, Case { // Filename with a container extension. name: "Movie.Title.2024.720p.WEBRip.x264.mkv", want: NameClaims { title: s("Movie Title"), year: Some(2024), resolution: Some(Resolution::P720), source: Some(Source::WebRip), codec: Some(Codec::X264), ..NameClaims::default() }, }, Case { // No markers at all: the whole thing is a title claim. name: "Some Random Words", want: NameClaims { title: s("Some Random Words"), ..NameClaims::default() }, }, Case { // Marker-only garbage parses partially, title absent. name: "1080p", want: NameClaims { resolution: Some(Resolution::P1080), ..NameClaims::default() }, }, Case { name: "", want: NameClaims::default(), }, Case { // Dolby Vision spelled out, dotted. name: "Movie.2024.2160p.WEB-DL.Dolby.Vision.HDR10.HEVC-GRP", want: NameClaims { title: s("Movie"), year: Some(2024), resolution: Some(Resolution::P2160), source: Some(Source::WebDl), codec: Some(Codec::X265), hdr: vec![HdrMarker::DolbyVision, HdrMarker::Hdr10], group: s("GRP"), ..NameClaims::default() }, }, Case { // Hyphenated title survives when nothing marks a group. name: "Spider-Man.2002.1080p.BluRay.x264-SECTOR7", want: NameClaims { title: s("Spider-Man"), year: Some(2002), resolution: Some(Resolution::P1080), source: Some(Source::BluRay), codec: Some(Codec::X264), group: s("SECTOR7"), ..NameClaims::default() }, }, Case { name: "www.Torrenting.com - Movie.2024.1080p.WEB-DL.x264", want: NameClaims { title: s("Movie"), year: Some(2024), resolution: Some(Resolution::P1080), source: Some(Source::WebDl), codec: Some(Codec::X264), ..NameClaims::default() }, }, Case { // Season pack, no episode. name: "Show.Name.S02.2160p.WEB-DL.DDP5.1.DV.HDR10.H.265-NTb", want: NameClaims { title: s("Show Name"), resolution: Some(Resolution::P2160), source: Some(Source::WebDl), codec: Some(Codec::X265), hdr: vec![HdrMarker::DolbyVision, HdrMarker::Hdr10], group: s("NTb"), ..NameClaims::default() }, }, Case { name: "Movie.2019.4K.HDR.DV.2160p.BDRemux.Ita.Eng.x265-NAHOM", want: NameClaims { title: s("Movie"), year: Some(2019), resolution: Some(Resolution::P2160), source: Some(Source::Remux), codec: Some(Codec::X265), hdr: vec![HdrMarker::Hdr, HdrMarker::DolbyVision], languages: vec![LanguageMarker::Italian, LanguageMarker::English], group: s("NAHOM"), ..NameClaims::default() }, }, ] } #[test] fn corpus_rows_parse_as_expected() { let mut failures = Vec::new(); for Case { name, want } in cases() { let got = parse(name); if got != want { failures.push(format!("{name:?}\n got: {got:?}\n want: {want:?}")); } } assert!( failures.is_empty(), "{} mismatches:\n{}", failures.len(), failures.join("\n") ); } #[test] fn garbage_never_panics() { let inputs = [ "", " ", "....", "----", "[[[]]]", "()()()", "ção áéíóú 日本語 🎬🎬🎬", "-.-.-.-[]()s01e999999999999999999999", "Movie.2024.1080p-", "a", &"x.".repeat(5000), ]; for input in inputs { let _ = parse(input); } }