Files
h-school/tests/HSchool.People.Tests/ClassTeacherTests.cs
T

96 lines
4.0 KiB
C#

using HSchool.Content;
namespace HSchool.People.Tests;
public class ClassTeacherTests
{
private const float Cap = 100_000f;
[Fact]
public void Assign_WritesIdIntoRoster_AndSurvivesPeopleJsonRoundTrip()
{
var (catalog, map, roster, pool) = Fresh();
var hired = HireTeacher(catalog, map, roster, pool);
var schoolClass = hired.Roster.Classes[0];
var assigned = ClassTeachers.Assign(hired.Roster, schoolClass.Id, hired.TeacherId);
Assert.Equal(ClassTeacherError.None, assigned.Error);
Assert.Equal(hired.TeacherId, assigned.Roster.Classes.Single(row => row.Id == schoolClass.Id).ClassTeacherId);
var json = RosterJson.Serialize(RosterDocument.From(Fixtures.SchoolSeed, assigned.Roster, hired.Pool));
var loaded = RosterJson.Parse(json);
Assert.Equal(hired.TeacherId, loaded.Classes.Single(row => row.Id == schoolClass.Id).ClassTeacherId);
}
[Fact]
public void Assign_RejectsNonTeacherAndUnknownPerson()
{
var (catalog, map, roster, pool) = Fresh();
var hired = HireTeacher(catalog, map, roster, pool);
var schoolClass = hired.Roster.Classes[0];
var pupil = Assert.Single(hired.Roster.People.Where(person => person.IsStudent).Take(1));
Assert.Equal(
ClassTeacherError.NotTeacher,
ClassTeachers.Assign(hired.Roster, schoolClass.Id, pupil.Id).Error);
Assert.Equal(
ClassTeacherError.UnknownPerson,
ClassTeachers.Assign(hired.Roster, schoolClass.Id, "nobody").Error);
Assert.Null(hired.Roster.Classes.Single(row => row.Id == schoolClass.Id).ClassTeacherId);
}
[Fact]
public void Clear_EmptiesSlot_AndClassWithoutTeacherIsValid()
{
var (catalog, map, roster, pool) = Fresh();
var hired = HireTeacher(catalog, map, roster, pool);
var schoolClass = hired.Roster.Classes[0];
var assigned = ClassTeachers.Assign(hired.Roster, schoolClass.Id, hired.TeacherId);
Assert.Equal(ClassTeacherError.None, assigned.Error);
var cleared = ClassTeachers.Clear(assigned.Roster, schoolClass.Id);
Assert.Equal(ClassTeacherError.None, cleared.Error);
Assert.Null(cleared.Roster.Classes.Single(row => row.Id == schoolClass.Id).ClassTeacherId);
Assert.Contains(cleared.Roster.Classes, row => row.Id == schoolClass.Id);
}
[Fact]
public void TwoClasses_MayShareTheSameTeacher()
{
var (catalog, map, roster, pool) = Fresh();
var hired = HireTeacher(catalog, map, roster, pool);
Assert.True(hired.Roster.Classes.Count >= 2);
var first = hired.Roster.Classes[0];
var second = hired.Roster.Classes[1];
var one = ClassTeachers.Assign(hired.Roster, first.Id, hired.TeacherId);
Assert.Equal(ClassTeacherError.None, one.Error);
var two = ClassTeachers.Assign(one.Roster, second.Id, hired.TeacherId);
Assert.Equal(ClassTeacherError.None, two.Error);
Assert.Equal(hired.TeacherId, two.Roster.Classes.Single(row => row.Id == first.Id).ClassTeacherId);
Assert.Equal(hired.TeacherId, two.Roster.Classes.Single(row => row.Id == second.Id).ClassTeacherId);
}
private static (DefCatalog Catalog, MapLayout Map, Roster Roster, ApplicantPool Pool) Fresh()
{
var catalog = Fixtures.Catalog();
var map = Fixtures.VanillaMap();
var roster = Fixtures.Generate(map);
var pool = ApplicantPool.Create(catalog, roster, Fixtures.SchoolSeed, "Russia", Fixtures.AsOf);
return (catalog, map, roster, pool);
}
private static (Roster Roster, ApplicantPool Pool, string TeacherId) HireTeacher(
DefCatalog catalog,
MapLayout map,
Roster roster,
ApplicantPool pool)
{
var applicant = pool.Applicants[0];
var hired = Staffing.Hire(catalog, map, roster, pool, applicant.Person.Id, Staffing.TeacherPosition, Cap);
Assert.Equal(StaffingError.None, hired.Error);
return (hired.Roster, hired.Pool, applicant.Person.Id);
}
}