Implement yearly intake functionality in school simulation, allowing for the graduation of students and the addition of new first-year pupils. Update the roster management to reflect these changes, ensuring proper entity handling in the simulation. Enhance the API to support name sets during roster installation and revise related tests to validate the new intake process and roster updates.
This commit is contained in:
@@ -94,6 +94,85 @@ public class PeopleInSchoolTests
|
||||
second.People.Select(person => $"{person.Name.Surname} {person.Name.Given} {person.Name.Patronymic}"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TickPastFirstSeptember_GraduatesTheOldestYearAndKeepsCapacity()
|
||||
{
|
||||
var catalog = Catalog();
|
||||
var map = Classrooms(4);
|
||||
var roster = RosterGenerator.Generate(catalog, map, schoolSeed: 1, "Slavic", Start);
|
||||
var demand = SchoolDemand.From(catalog, map);
|
||||
var oldest = roster.Classes.Max(schoolClass => schoolClass.Year);
|
||||
var graduated = roster.Classes
|
||||
.Where(schoolClass => schoolClass.Year == oldest)
|
||||
.SelectMany(schoolClass => schoolClass.PupilIds)
|
||||
.ToHashSet(StringComparer.Ordinal);
|
||||
|
||||
using var school = School.Create(1, "Четыре кабинета", Start, catalog, map);
|
||||
school.InstallPeople(roster, seed: 1, "Slavic");
|
||||
|
||||
var sept = new DateTime(2012, 9, 1, 0, 0, 0, DateTimeKind.Utc);
|
||||
var changed = school.Tick((sept - Start).TotalMinutes / 5d, 5d);
|
||||
|
||||
Assert.True(changed);
|
||||
Assert.True(school.Clock.Time >= sept);
|
||||
Assert.NotNull(school.Roster);
|
||||
Assert.True(RosterFit.Matches(school.Roster, demand));
|
||||
Assert.Equal(roster.People.Count(person => person.IsStudent), school.Roster.People.Count(person => person.IsStudent));
|
||||
Assert.DoesNotContain(school.Roster.People, person => graduated.Contains(person.Id));
|
||||
Assert.Contains(school.Roster.Classes, schoolClass => schoolClass.Year == 1);
|
||||
|
||||
var peopleQuery = new QueryDescription().WithAll<PersonIdentity>();
|
||||
var classesQuery = new QueryDescription().WithAll<ClassIdentity>();
|
||||
Assert.Equal(school.Roster.People.Count, school.World.CountEntities(in peopleQuery));
|
||||
Assert.Equal(school.Roster.Classes.Count, school.World.CountEntities(in classesQuery));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TickOnCreateDateOfFirstSeptember_DoesNotIntake()
|
||||
{
|
||||
var start = new DateTime(2012, 9, 1, 6, 0, 0, DateTimeKind.Utc);
|
||||
var catalog = Catalog();
|
||||
var map = Classrooms(4);
|
||||
var roster = RosterGenerator.Generate(catalog, map, schoolSeed: 3, "Slavic", start);
|
||||
using var school = School.Create(3, "Первое сентября", start, catalog, map);
|
||||
school.InstallPeople(roster, seed: 3, "Slavic");
|
||||
|
||||
var years = roster.Classes.Select(schoolClass => schoolClass.Year).OrderBy(year => year).ToArray();
|
||||
var changed = school.Tick(1d / 20d, 5d);
|
||||
|
||||
Assert.False(changed);
|
||||
Assert.Same(roster, school.Roster);
|
||||
Assert.Equal(years, school.Roster!.Classes.Select(schoolClass => schoolClass.Year).OrderBy(year => year));
|
||||
}
|
||||
|
||||
private static DefCatalog Catalog()
|
||||
{
|
||||
var root = Path.Combine(AppContext.BaseDirectory, "vanilla");
|
||||
return new CatalogLoader().Load([CatalogLoader.CorePackId], PackDocumentsFrom(root));
|
||||
}
|
||||
|
||||
private static MapLayout Classrooms(int count, int desks = 16)
|
||||
{
|
||||
var rooms = new RoomNode[count];
|
||||
for (var i = 0; i < count; i++)
|
||||
{
|
||||
rooms[i] = new RoomNode
|
||||
{
|
||||
Id = $"classroom-{i:00}",
|
||||
Def = "Classroom",
|
||||
Building = "main",
|
||||
Floor = "floor-1",
|
||||
Label = $"{101 + i}",
|
||||
Slots =
|
||||
[
|
||||
new SlotFill { Key = "studentDesks", Thing = "StudentDesk", Count = desks },
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
return new MapLayout { Rooms = rooms };
|
||||
}
|
||||
|
||||
private static (DefCatalog Catalog, MapLayout Map) Vanilla()
|
||||
{
|
||||
var root = Path.Combine(AppContext.BaseDirectory, "vanilla");
|
||||
|
||||
Reference in New Issue
Block a user