mirror of https://github.com/ErsatzTV/ErsatzTV.git
4 changed files with 158 additions and 5 deletions
@ -0,0 +1,132 @@
@@ -0,0 +1,132 @@
|
||||
using ErsatzTV.Core.Domain; |
||||
using ErsatzTV.Core.Scheduling; |
||||
using LanguageExt.UnsafeValueAccess; |
||||
using NUnit.Framework; |
||||
using Shouldly; |
||||
|
||||
namespace ErsatzTV.Core.Tests.Scheduling; |
||||
|
||||
[TestFixture] |
||||
public class ShuffleInOrderCollectionEnumeratorTests |
||||
{ |
||||
[Test] |
||||
public void Should_Not_Repeat_Items_Until_Cycle_Complete() |
||||
{ |
||||
var collections = new List<CollectionWithItems> |
||||
{ |
||||
new( |
||||
0, |
||||
0, |
||||
"1", |
||||
Enumerable.Range(1, 10).Select(i => new Movie { Id = i, MovieMetadata = [] }).Cast<MediaItem>().ToList(), |
||||
true, |
||||
PlaybackOrder.ShuffleInOrder, |
||||
false), |
||||
new( |
||||
0, |
||||
0, |
||||
"2", |
||||
Enumerable.Range(11, 20).Select(i => new Movie { Id = i, MovieMetadata = [] }).Cast<MediaItem>().ToList(), |
||||
true, |
||||
PlaybackOrder.ShuffleInOrder, |
||||
false) |
||||
}; |
||||
|
||||
var state = new CollectionEnumeratorState { Seed = 1234, Index = 0 }; |
||||
var enumerator = new ShuffleInOrderCollectionEnumerator(collections, state, false, CancellationToken.None); |
||||
|
||||
var seenIds = new System.Collections.Generic.HashSet<int>(); |
||||
for (int i = 0; i < 20; i++) |
||||
{ |
||||
enumerator.Current.IsSome.ShouldBeTrue(); |
||||
int id = enumerator.Current.ValueUnsafe().Id; |
||||
seenIds.ShouldNotContain(id, $"at index {i}"); |
||||
seenIds.Add(id); |
||||
enumerator.MoveNext(Option<DateTimeOffset>.None); |
||||
} |
||||
|
||||
seenIds.Count.ShouldBe(20); |
||||
} |
||||
|
||||
[Test] |
||||
public void Should_Handle_Single_Collection() |
||||
{ |
||||
var collections = new List<CollectionWithItems> |
||||
{ |
||||
new( |
||||
0, |
||||
0, |
||||
"1", |
||||
Enumerable.Range(1, 10).Select(i => new Movie { Id = i, MovieMetadata = [] }).Cast<MediaItem>().ToList(), |
||||
true, |
||||
PlaybackOrder.ShuffleInOrder, |
||||
false) |
||||
}; |
||||
|
||||
var state = new CollectionEnumeratorState { Seed = 1234, Index = 0 }; |
||||
var enumerator = new ShuffleInOrderCollectionEnumerator(collections, state, false, CancellationToken.None); |
||||
|
||||
var seenIds = new List<int>(); |
||||
for (int i = 0; i < 10; i++) |
||||
{ |
||||
seenIds.Add(enumerator.Current.ValueUnsafe().Id); |
||||
enumerator.MoveNext(Option<DateTimeOffset>.None); |
||||
} |
||||
|
||||
seenIds.Count.ShouldBe(10); |
||||
seenIds.ShouldBeInOrder(SortDirection.Ascending); |
||||
} |
||||
|
||||
[Test] |
||||
public void Should_Reshuffle_After_Cycle() |
||||
{ |
||||
var collections = new List<CollectionWithItems> |
||||
{ |
||||
new( |
||||
0, |
||||
0, |
||||
"1", |
||||
Enumerable.Range(1, 10).Select(i => new Movie { Id = i, MovieMetadata = [] }).Cast<MediaItem>().ToList(), |
||||
true, |
||||
PlaybackOrder.ShuffleInOrder, |
||||
false) |
||||
}; |
||||
|
||||
var state = new CollectionEnumeratorState { Seed = 1234, Index = 0 }; |
||||
var enumerator = new ShuffleInOrderCollectionEnumerator(collections, state, false, CancellationToken.None); |
||||
|
||||
for (int i = 0; i < 10; i++) |
||||
{ |
||||
enumerator.MoveNext(Option<DateTimeOffset>.None); |
||||
} |
||||
|
||||
enumerator.State.Index.ShouldBe(0); |
||||
// Should have a new seed
|
||||
enumerator.State.Seed.ShouldNotBe(1234); |
||||
} |
||||
|
||||
[Test] |
||||
public void ResetState_Should_Update_Seed() |
||||
{ |
||||
var collections = new List<CollectionWithItems> |
||||
{ |
||||
new( |
||||
0, |
||||
0, |
||||
"1", |
||||
Enumerable.Range(1, 10).Select(i => new Movie { Id = i, MovieMetadata = [] }).Cast<MediaItem>().ToList(), |
||||
true, |
||||
PlaybackOrder.ShuffleInOrder, |
||||
false) |
||||
}; |
||||
|
||||
var state = new CollectionEnumeratorState { Seed = 1234, Index = 0 }; |
||||
var enumerator = new ShuffleInOrderCollectionEnumerator(collections, state, false, CancellationToken.None); |
||||
|
||||
var newState = new CollectionEnumeratorState { Seed = 5678, Index = 5 }; |
||||
enumerator.ResetState(newState); |
||||
|
||||
enumerator.State.Seed.ShouldBe(5678); |
||||
enumerator.State.Index.ShouldBe(5); |
||||
} |
||||
} |
||||
Loading…
Reference in new issue