namespace HSchool.Simulation.Tests;
///
/// What used to be checked through SchoolRegistry. The registry is gone — the server gives
/// every school its own worker — but the name and start-date rules it guarded are still the ones
/// the create endpoint applies.
///
public class SchoolNamesTests
{
[Theory]
[InlineData(null)]
[InlineData("")]
[InlineData(" ")]
[InlineData("\u0009\u000A")]
public void BlankNames_AreRejected(string? name)
{
Assert.False(SchoolNames.TryNormalize(name, out _));
}
[Fact]
public void OverlongNames_AreRejected()
{
Assert.False(SchoolNames.TryNormalize(new string('ш', School.MaxNameLength + 1), out _));
Assert.True(SchoolNames.TryNormalize(new string('ш', School.MaxNameLength), out _));
}
[Fact]
public void SurroundingSpaceAndControlCharacters_AreStripped()
{
Assert.True(SchoolNames.TryNormalize(" Лицей ", out var normalized));
Assert.Equal("Лицей", normalized);
}
[Fact]
public void StartDatesOutsideTheSupportedRange_AreRejected()
{
Assert.False(GameClock.IsValidStartDate(new DateTime(1500, 1, 1, 0, 0, 0, DateTimeKind.Utc)));
Assert.False(GameClock.IsValidStartDate(new DateTime(3200, 1, 1, 0, 0, 0, DateTimeKind.Utc)));
Assert.True(GameClock.IsValidStartDate(new DateTime(2012, 4, 3, 6, 0, 0, DateTimeKind.Utc)));
}
[Fact]
public void SuggestedNames_AreUsableAndNeverRepeatATakenOne()
{
var generator = new SchoolNameGenerator(new Random(1234));
var taken = new List();
for (var i = 0; i < 20; i++)
{
var suggestion = generator.Next(taken, SchoolNameLanguage.Russian);
Assert.True(SchoolNames.TryNormalize(suggestion, out _), $"\"{suggestion}\" is not a usable name.");
Assert.DoesNotContain(suggestion, taken, StringComparer.OrdinalIgnoreCase);
taken.Add(suggestion);
}
}
[Fact]
public void SuggestedNames_FitTheNameLimitInBothLanguages()
{
var generator = new SchoolNameGenerator(new Random(1234));
foreach (var language in new[] { SchoolNameLanguage.Russian, SchoolNameLanguage.English })
{
for (var i = 0; i < 200; i++)
{
Assert.InRange(generator.Next([], language).Length, 1, School.MaxNameLength);
}
}
}
[Fact]
public void SuggestedEnglishNames_AreAscii()
{
var generator = new SchoolNameGenerator(new Random(1234));
for (var i = 0; i < 50; i++)
{
Assert.Matches("^[A-Za-z0-9 .]+$", generator.Next([], SchoolNameLanguage.English));
}
}
}