mirror of https://github.com/ErsatzTV/ErsatzTV.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
4.2 KiB
132 lines
4.2 KiB
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); |
|
} |
|
}
|
|
|