require 'spec_helper' require 'parslet/rig/rspec' require 'tv_show_parslet' describe TvShowParslet do let(:parser) { described_class.new } def p(string) parse(string, :trace => true) end describe :filename do files = { # TODO: don't include separator in :series "MythBusters - S04E01 - Newspaper Crossbow.avi" => ['MythBusters', '4', '1', 'avi'], "House.S04E13.HDTV.XviD-XOR.avi" => ['House', '4', '13', 'avi'], "House - 4x13.avi" => ['House', '4', '13', 'avi'], "X-Files S09E19 - The Truth.avi" => ['X-Files', '9', '19', 'avi'], "X-Files S09E19-20 - The Truth.avi" => ['X-Files', '9', ['19', '20'], 'avi'], "Show Name - 10x23 - Episode Name.avi" => ['Show Name', '10', '23', 'avi'], "my.name.is.earl.s03e06.hdtv.xvid-xor.[VTV].avi" => ['my.name.is.earl', '3', '6', 'avi'], "my.name.is.earl.305.hdtv-lol.[VTV].avi" => ['my.name.is.earl', '3', '5', 'avi'], "Dexter.S02.E01.avi" => ['Dexter', '2', '1', 'avi'], "doctor.who.s05e05.720p.hdtv.x264-bia.mkv" => ['doctor.who', '5', '5', 'mkv'], "doctor.who.2005.s05e05.720p.hdtv.x264-bia.mkv" => ['doctor.who.2005', '5', '5', 'mkv'], "the.4400.s04e13.hdtv.xvid-bia.avi" => ['the.4400', '4', '13', 'avi'], "my.name.is.earl.s03e07-e08.hdtv.xvid-xor.[VTV].avi" => ['my.name.is.earl', '3', ['7', '8'], 'avi'], "doctor_who_2005.5x01.the_eleventh_hour.720p_hdtv_x264-fov.mkv" => ['doctor_who_2005', '5', '1', 'mkv'] } files.each do |filename, results| it "parses #{filename}" do numbers = [*results[2]] numbers = numbers.map {|n| {:number => n}} parser.should p(filename).as( :series => results[0], :season => results[1], :numbers => numbers, :extension => results[3] ) end end it { should_not p("my home video.wmv") } end describe :separator do subject { parser.separator } it { should p(" - ") } it { should p("-") } it { should p("_") } it { should p(".") } end describe :digit do subject { parser.digit } it { should p("2") } it { should_not p("a") } it { should_not p("") } it { should_not p("12") } end describe :season do subject { parser.season } it { should p("2").as(:season => "2") } it { should p("02").as(:season => "2") } it { should p("s2").as(:season => "2") } it { should p("S2").as(:season => "2") } it { should p("S02").as(:season => "2") } end describe :number do subject { parser.number } it { should p("E02").as(:numbers => [{:number => "2"}]) } it { should p("E2").as(:numbers => [{:number => "2"}]) } it { should p("e02").as(:numbers => [{:number => "2"}]) } it { should p("x02").as(:numbers => [{:number => "2"}]) } end describe :simple_episode do subject { parser.simple_episode } it { should p("0102").as(:season => "1", :numbers => [{:number => "2"}]) } it { should p("0122").as(:season => "1", :numbers => [{:number => "22"}]) } it { should p("102").as(:season => "1", :numbers => [{:number => "2"}]) } it { should p("1102").as(:season => "11", :numbers => [{:number => "2"}]) } it { should p("1122").as(:season => "11", :numbers => [{:number => "22"}]) } end describe :episode do subject { parser.episode } it { should p("S07E02").as(:season => "7", :numbers => [{:number => "2"}]) } it { should p("7x02").as(:season => "7", :numbers => [{:number => "2"}]) } it { should p("702").as(:season => "7", :numbers => [{:number => "2"}]) } it { should p("1702").as(:season => "17", :numbers => [{:number => "2"}]) } end describe :scene do subject { parser.scene } xit { should p("HDTV.XviD-XOR") } it { should p(".HDTV.XviD-XOR") } it { should p(" - HDTV.XviD-XOR") } end describe :extension do subject { parser.extension } TvShowParslet::EXTENSIONS.each do |extension| it { should p(".#{extension}").as(:extension => extension) } it { should_not p("#{extension}") } end it { should_not p(".fail") } it { should_not p("fail") } end end