@ -24,7 +24,7 @@ namespace ErsatzTV.Core.Tests.Scheduling
@@ -24,7 +24,7 @@ namespace ErsatzTV.Core.Tests.Scheduling
NamedEpisode ( four , 1 , 1 , 4 )
} ;
List < GroupedMediaItem > result = MultiPartEpisodeGrouper . GroupMediaItems ( mediaItems ) ;
List < GroupedMediaItem > result = MultiPartEpisodeGrouper . GroupMediaItems ( mediaItems , false ) ;
result . Count . Should ( ) . Be ( 3 ) ;
ShouldHaveOneItem ( result , mediaItems [ 0 ] ) ;
@ -32,6 +32,28 @@ namespace ErsatzTV.Core.Tests.Scheduling
@@ -32,6 +32,28 @@ namespace ErsatzTV.Core.Tests.Scheduling
ShouldHaveOneItem ( result , mediaItems [ 3 ] ) ;
}
[Test]
[TestCase("Episode 1 (1)", "Episode 2 - Part 2", "Episode 3")]
[TestCase("Episode 1 Part 1", "Episode 2 (2) - More", "Episode 3 - After")]
[TestCase("Episode 1 Part 1", "Episode 2 (II)", "Episode 3")]
[TestCase("Episode 1 Part (V)", "Episode 2 (VI)", "Episode 3")]
[TestCase("Episode 1 Part Three", "Episode 2 (IV)", "Episode 3")]
public void MixedNaming_Group ( string one , string two , string three )
{
var mediaItems = new List < MediaItem >
{
NamedEpisode ( one , 1 , 1 , 1 ) ,
NamedEpisode ( two , 1 , 1 , 2 ) ,
NamedEpisode ( three , 1 , 1 , 3 )
} ;
List < GroupedMediaItem > result = MultiPartEpisodeGrouper . GroupMediaItems ( mediaItems , false ) ;
result . Count . Should ( ) . Be ( 2 ) ;
ShouldHaveTwoItems ( result , mediaItems [ 0 ] , mediaItems [ 1 ] ) ;
ShouldHaveOneItem ( result , mediaItems [ 2 ] ) ;
}
[Test]
[TestCase("Episode 1 (1)", "Episode 2 (2)", "Episode 3")]
[TestCase("Episode 1 (1) - More", "Episode 2 (2) - Title", "Episode 3 - After")]
@ -45,7 +67,7 @@ namespace ErsatzTV.Core.Tests.Scheduling
@@ -45,7 +67,7 @@ namespace ErsatzTV.Core.Tests.Scheduling
NamedEpisode ( three , 1 , 1 , 3 )
} ;
List < GroupedMediaItem > result = MultiPartEpisodeGrouper . GroupMediaItems ( mediaItems ) ;
List < GroupedMediaItem > result = MultiPartEpisodeGrouper . GroupMediaItems ( mediaItems , false ) ;
result . Count . Should ( ) . Be ( 2 ) ;
ShouldHaveTwoItems ( result , mediaItems [ 0 ] , mediaItems [ 1 ] ) ;
@ -72,7 +94,7 @@ namespace ErsatzTV.Core.Tests.Scheduling
@@ -72,7 +94,7 @@ namespace ErsatzTV.Core.Tests.Scheduling
NamedEpisode ( five , 1 , 1 , 5 )
} ;
List < GroupedMediaItem > result = MultiPartEpisodeGrouper . GroupMediaItems ( mediaItems ) ;
List < GroupedMediaItem > result = MultiPartEpisodeGrouper . GroupMediaItems ( mediaItems , false ) ;
result . Count . Should ( ) . Be ( 3 ) ;
ShouldHaveTwoItems ( result , mediaItems [ 0 ] , mediaItems [ 1 ] ) ;
@ -94,7 +116,7 @@ namespace ErsatzTV.Core.Tests.Scheduling
@@ -94,7 +116,7 @@ namespace ErsatzTV.Core.Tests.Scheduling
NamedEpisode ( four , 1 , 1 , 4 )
} ;
List < GroupedMediaItem > result = MultiPartEpisodeGrouper . GroupMediaItems ( mediaItems ) ;
List < GroupedMediaItem > result = MultiPartEpisodeGrouper . GroupMediaItems ( mediaItems , false ) ;
result . Count . Should ( ) . Be ( 2 ) ;
ShouldHaveTwoItems ( result , mediaItems [ 0 ] , mediaItems [ 1 ] ) ;
@ -115,7 +137,7 @@ namespace ErsatzTV.Core.Tests.Scheduling
@@ -115,7 +137,7 @@ namespace ErsatzTV.Core.Tests.Scheduling
NamedEpisode ( four , 1 , 1 , 4 )
} ;
List < GroupedMediaItem > result = MultiPartEpisodeGrouper . GroupMediaItems ( mediaItems ) ;
List < GroupedMediaItem > result = MultiPartEpisodeGrouper . GroupMediaItems ( mediaItems , false ) ;
result . Count . Should ( ) . Be ( 3 ) ;
ShouldHaveOneItem ( result , mediaItems [ 0 ] ) ;
@ -123,6 +145,28 @@ namespace ErsatzTV.Core.Tests.Scheduling
@@ -123,6 +145,28 @@ namespace ErsatzTV.Core.Tests.Scheduling
ShouldHaveTwoItems ( result , mediaItems [ 2 ] , mediaItems [ 3 ] ) ;
}
[Test]
[TestCase("Episode 1", "Episode 2 (2)", "Episode 3 (3)", "Episode 4")]
[TestCase("Episode 1 - More", "Episode 2 (2) - Title", "Episode 3 (3) - After", "Episode 4 - Dash")]
[TestCase("Episode 1", "Episode 2 Part 2", "Episode 3 Part 3", "Episode 4")]
public void Part2And3_Without_Part1 ( string one , string two , string three , string four )
{
var mediaItems = new List < MediaItem >
{
NamedEpisode ( one , 1 , 1 , 1 ) ,
NamedEpisode ( two , 1 , 1 , 2 ) ,
NamedEpisode ( three , 1 , 1 , 3 ) ,
NamedEpisode ( four , 1 , 1 , 4 )
} ;
List < GroupedMediaItem > result = MultiPartEpisodeGrouper . GroupMediaItems ( mediaItems , false ) ;
result . Count . Should ( ) . Be ( 3 ) ;
ShouldHaveOneItem ( result , mediaItems [ 0 ] ) ;
ShouldHaveTwoItems ( result , mediaItems [ 1 ] , mediaItems [ 2 ] ) ;
ShouldHaveOneItem ( result , mediaItems [ 3 ] ) ;
}
[Test]
[TestCase("Episode 1 (1)", "Episode 3 (3)", "Episode 4", "Episode 5")]
[TestCase("Episode 1 (1) - More", "Episode 3 (3) - Title", "Episode 4 - After", "Episode 5 - Dash")]
@ -137,7 +181,7 @@ namespace ErsatzTV.Core.Tests.Scheduling
@@ -137,7 +181,7 @@ namespace ErsatzTV.Core.Tests.Scheduling
NamedEpisode ( four , 1 , 1 , 5 )
} ;
List < GroupedMediaItem > result = MultiPartEpisodeGrouper . GroupMediaItems ( mediaItems ) ;
List < GroupedMediaItem > result = MultiPartEpisodeGrouper . GroupMediaItems ( mediaItems , false ) ;
result . Count . Should ( ) . Be ( 4 ) ;
ShouldHaveOneItem ( result , mediaItems [ 0 ] ) ;
@ -160,7 +204,7 @@ namespace ErsatzTV.Core.Tests.Scheduling
@@ -160,7 +204,7 @@ namespace ErsatzTV.Core.Tests.Scheduling
NamedEpisode ( four , 1 , 1 , 5 )
} ;
List < GroupedMediaItem > result = MultiPartEpisodeGrouper . GroupMediaItems ( mediaItems ) ;
List < GroupedMediaItem > result = MultiPartEpisodeGrouper . GroupMediaItems ( mediaItems , false ) ;
result . Count . Should ( ) . Be ( 3 ) ;
ShouldHaveOneItem ( result , mediaItems [ 0 ] ) ;
@ -186,7 +230,7 @@ namespace ErsatzTV.Core.Tests.Scheduling
@@ -186,7 +230,7 @@ namespace ErsatzTV.Core.Tests.Scheduling
NamedEpisode ( four , 1 , 1 , 5 , new DateTime ( 2 0 2 0 , 1 , 4 ) )
} ;
List < GroupedMediaItem > result = MultiPartEpisodeGrouper . GroupMediaItems ( mediaItems ) ;
List < GroupedMediaItem > result = MultiPartEpisodeGrouper . GroupMediaItems ( mediaItems , false ) ;
result . Count . Should ( ) . Be ( 3 ) ;
ShouldHaveTwoItems ( result , mediaItems [ 0 ] , mediaItems [ 2 ] ) ;
@ -194,6 +238,31 @@ namespace ErsatzTV.Core.Tests.Scheduling
@@ -194,6 +238,31 @@ namespace ErsatzTV.Core.Tests.Scheduling
ShouldHaveOneItem ( result , mediaItems [ 3 ] ) ;
}
[Test]
[TestCase("S1 Episode 1 (1)", "S2 Episode 3 (2)", "S1 Episode 2 (3)", "S1 Episode 5")]
[ TestCase (
"S1 Episode 1 (1) - More" ,
"S2 Episode 3 (2) - Title" ,
"S1 Episode 2 (3) - After" ,
"S1 Episode 5 - Dash" ) ]
[TestCase("S1 Episode 1 Part 1", "S2 Episode 3 Part 2", "S1 Episode 2 Part 3", "S1 Episode 5")]
public void Mixed_Shows_Chronologically_Crossover ( string one , string two , string three , string four )
{
var mediaItems = new List < MediaItem >
{
NamedEpisode ( one , 1 , 1 , 1 , new DateTime ( 2 0 2 0 , 1 , 1 ) ) ,
NamedEpisode ( two , 2 , 1 , 3 , new DateTime ( 2 0 2 0 , 1 , 2 ) ) ,
NamedEpisode ( three , 1 , 1 , 2 , new DateTime ( 2 0 2 0 , 1 , 3 ) ) ,
NamedEpisode ( four , 1 , 1 , 5 , new DateTime ( 2 0 2 0 , 1 , 4 ) )
} ;
List < GroupedMediaItem > result = MultiPartEpisodeGrouper . GroupMediaItems ( mediaItems , true ) ;
result . Count . Should ( ) . Be ( 2 ) ;
ShouldHaveMultipleItems ( result , mediaItems [ 0 ] , new List < MediaItem > { mediaItems [ 1 ] , mediaItems [ 2 ] } ) ;
ShouldHaveOneItem ( result , mediaItems [ 3 ] ) ;
}
private static Episode NamedEpisode (
string title ,
int showId ,
@ -225,5 +294,14 @@ namespace ErsatzTV.Core.Tests.Scheduling
@@ -225,5 +294,14 @@ namespace ErsatzTV.Core.Tests.Scheduling
MediaItem additional ) = >
result . Filter ( g = > g . First = = first & & Optional ( g . Additional ) . Flatten ( ) . HeadOrNone ( ) = = Some ( additional ) )
. Should ( ) . HaveCount ( 1 ) ;
private static void ShouldHaveMultipleItems (
IEnumerable < GroupedMediaItem > result ,
MediaItem first ,
List < MediaItem > additional ) = >
result . Filter (
g = > g . First = = first & & g . Additional ! = null & & g . Additional . Count = = additional . Count & &
additional . ForAll ( g . Additional . Contains ) )
. Should ( ) . HaveCount ( 1 ) ;
}
}