using SameBeat.Domain.Encje;
using SameBeat.Domain.Wyjatki;
using Xunit;
namespace SameBeat.Tests.Unit;
///
/// Testy zywego stanu mikrofonu (ETAP 5) na encji Wydarzenie -- PrzyznajMikrofon/OdbierzMikrofon.
/// Tak samo jak WydarzenieMuzykaTests, to prawdziwy zegar (DateTime.UtcNow), sprawdzamy przedzial
/// czasowy, nie dokladna wartosc co do milisekundy.
///
public class WydarzenieMikrofonTests
{
[Fact]
public void Utworz_MaDomyslnyBrakMikrofonu()
{
var wydarzenie = Wydarzenie.Utworz("Test");
Assert.Null(wydarzenie.AktywnyMikrofonUczestnikId);
Assert.Null(wydarzenie.AktywnyMikrofonKoniecUtc);
}
[Fact]
public void PrzyznajMikrofon_UstawiaUczestnikaIKoniecZaCzasSekundy()
{
var wydarzenie = Wydarzenie.Utworz("Test");
var uczestnikId = Guid.NewGuid();
var przed = DateTime.UtcNow;
wydarzenie.PrzyznajMikrofon(uczestnikId, 5);
Assert.Equal(uczestnikId, wydarzenie.AktywnyMikrofonUczestnikId);
Assert.NotNull(wydarzenie.AktywnyMikrofonKoniecUtc);
// Koniec ma byc mniej-wiecej "teraz + 5s" -- hojny margines na wolne CI.
Assert.InRange(wydarzenie.AktywnyMikrofonKoniecUtc!.Value, przed.AddSeconds(4.5), przed.AddSeconds(10));
}
[Fact]
public void PrzyznajMikrofon_PustyUczestnikId_Rzuca()
{
var wydarzenie = Wydarzenie.Utworz("Test");
Assert.Throws(() => wydarzenie.PrzyznajMikrofon(Guid.Empty, 5));
}
[Theory]
[InlineData(0)]
[InlineData(-1)]
public void PrzyznajMikrofon_NiedodatniCzas_Rzuca(int czasSekundy)
{
var wydarzenie = Wydarzenie.Utworz("Test");
Assert.Throws(() => wydarzenie.PrzyznajMikrofon(Guid.NewGuid(), czasSekundy));
}
[Fact]
public void PrzyznajMikrofon_GdyJuzKtosMa_Rzuca()
{
var wydarzenie = Wydarzenie.Utworz("Test");
wydarzenie.PrzyznajMikrofon(Guid.NewGuid(), 5);
Assert.Throws(() => wydarzenie.PrzyznajMikrofon(Guid.NewGuid(), 5));
}
[Fact]
public void OdbierzMikrofon_CzysciAktywnegoUczestnikaIKoniec()
{
var wydarzenie = Wydarzenie.Utworz("Test");
wydarzenie.PrzyznajMikrofon(Guid.NewGuid(), 5);
wydarzenie.OdbierzMikrofon();
Assert.Null(wydarzenie.AktywnyMikrofonUczestnikId);
Assert.Null(wydarzenie.AktywnyMikrofonKoniecUtc);
}
[Fact]
public void OdbierzMikrofon_GdyNikogoNieMa_JestIdempotentne()
{
var wydarzenie = Wydarzenie.Utworz("Test");
wydarzenie.OdbierzMikrofon();
Assert.Null(wydarzenie.AktywnyMikrofonUczestnikId);
}
[Fact]
public void PrzyznajMikrofon_PoOdebraniu_MoznaPrzyznacZnowu()
{
var wydarzenie = Wydarzenie.Utworz("Test");
wydarzenie.PrzyznajMikrofon(Guid.NewGuid(), 5);
wydarzenie.OdbierzMikrofon();
var nowyUczestnikId = Guid.NewGuid();
wydarzenie.PrzyznajMikrofon(nowyUczestnikId, 10);
Assert.Equal(nowyUczestnikId, wydarzenie.AktywnyMikrofonUczestnikId);
}
}