142 lines
4.2 KiB
C#
142 lines
4.2 KiB
C#
using TeleWave.Domain.Programming;
|
|
using Xunit;
|
|
|
|
namespace TeleWave.Domain.Tests.Programming;
|
|
|
|
public class ScheduleTemplateTests
|
|
{
|
|
private static ScheduleTemplate NewTemplate() =>
|
|
ScheduleTemplate.Create(Guid.NewGuid(), "Основная");
|
|
|
|
[Fact]
|
|
public void Create_AddsBackgroundLayer()
|
|
{
|
|
var template = NewTemplate();
|
|
|
|
var background = Assert.Single(template.Layers);
|
|
Assert.True(background.IsBackground);
|
|
Assert.Equal(GridLayer.BackgroundPriority, background.Priority);
|
|
}
|
|
|
|
[Fact]
|
|
public void RemoveLayer_RefusesBackground()
|
|
{
|
|
var template = NewTemplate();
|
|
var background = template.Background!;
|
|
|
|
Assert.False(template.RemoveLayer(background.Id));
|
|
Assert.Single(template.Layers);
|
|
}
|
|
|
|
[Fact]
|
|
public void AddLayer_KeepsPriorityAboveBackground()
|
|
{
|
|
var template = NewTemplate();
|
|
|
|
var layer = template.AddLayer("Выходные", 0);
|
|
|
|
// Ноль занят фоном: слой с таким же приоритетом сделал бы выбор неоднозначным.
|
|
Assert.True(layer.Priority > GridLayer.BackgroundPriority);
|
|
}
|
|
|
|
[Fact]
|
|
public void BackgroundLayer_KeepsPriority_WhenUpdated()
|
|
{
|
|
var template = NewTemplate();
|
|
var background = template.Background!;
|
|
|
|
background.Update("Фон", 99, null, isEnabled: true);
|
|
|
|
Assert.Equal(GridLayer.BackgroundPriority, background.Priority);
|
|
}
|
|
|
|
[Fact]
|
|
public void MarkChanged_MakesPendingUntilApplied()
|
|
{
|
|
var template = NewTemplate();
|
|
Assert.False(template.HasPendingChanges);
|
|
|
|
template.MarkChanged();
|
|
Assert.True(template.HasPendingChanges);
|
|
|
|
template.MarkApplied();
|
|
Assert.False(template.HasPendingChanges);
|
|
}
|
|
}
|
|
|
|
public class GridLayerOverlapTests
|
|
{
|
|
private static GridLayer NewLayer() =>
|
|
ScheduleTemplate.Create(Guid.NewGuid(), "T").AddLayer("Базовая", 10);
|
|
|
|
[Fact]
|
|
public void HasOverlap_DetectsIntersectionOnSameDay()
|
|
{
|
|
var layer = NewLayer();
|
|
layer.AddSlot("Вечернее кино", new TimeOnly(20, 0), 90, weekday: 5);
|
|
|
|
Assert.True(layer.HasOverlap(5, new TimeOnly(21, 0), 30, null));
|
|
Assert.False(layer.HasOverlap(5, new TimeOnly(21, 30), 30, null));
|
|
}
|
|
|
|
[Fact]
|
|
public void HasOverlap_IgnoresOtherWeekdays()
|
|
{
|
|
var layer = NewLayer();
|
|
layer.AddSlot("Вечернее кино", new TimeOnly(20, 0), 90, weekday: 5);
|
|
|
|
Assert.False(layer.HasOverlap(3, new TimeOnly(20, 30), 30, null));
|
|
}
|
|
|
|
[Fact]
|
|
public void HasOverlap_EverydaySlotConflictsWithAnyDay()
|
|
{
|
|
var layer = NewLayer();
|
|
layer.AddSlot("Новости", new TimeOnly(18, 0), 30);
|
|
|
|
// Слот без дня недели идёт каждый день, поэтому конфликтует и с конкретным днём.
|
|
Assert.True(layer.HasOverlap(2, new TimeOnly(18, 15), 30, null));
|
|
}
|
|
|
|
[Fact]
|
|
public void HasOverlap_SkipsSlotBeingEdited()
|
|
{
|
|
var layer = NewLayer();
|
|
var slot = layer.AddSlot("Вечернее кино", new TimeOnly(20, 0), 90, weekday: 5);
|
|
|
|
Assert.False(layer.HasOverlap(5, new TimeOnly(20, 0), 120, slot.Id));
|
|
}
|
|
|
|
[Fact]
|
|
public void UpdateContent_ClearsFieldsForeignToSlotKind()
|
|
{
|
|
var layer = NewLayer();
|
|
var slot = layer.AddSlot("Кино", new TimeOnly(20, 0), 90);
|
|
slot.UpdateContent(
|
|
"Кино",
|
|
SlotKind.Content,
|
|
Guid.NewGuid(),
|
|
"{\"type\":\"sequential\"}",
|
|
null,
|
|
SlotBlockMode.Count,
|
|
1,
|
|
OverflowPolicy.ContinueNext
|
|
);
|
|
|
|
slot.UpdateContent(
|
|
"Конец вещания",
|
|
SlotKind.SignOff,
|
|
Guid.NewGuid(),
|
|
"{\"type\":\"sequential\"}",
|
|
null,
|
|
SlotBlockMode.FillSlot,
|
|
1,
|
|
OverflowPolicy.ContinueNext
|
|
);
|
|
|
|
// Иначе генератор прочитал бы настройки, оставшиеся от прежнего типа слота.
|
|
Assert.Null(slot.GroupId);
|
|
Assert.Null(slot.StrategyJson);
|
|
}
|
|
}
|