Files
h-school/tests/HSchool.People.Tests/GradeTrailTests.cs
T
Leonid Pershin 59a7023bc4 Wire grade trail notices, dress mark factor, and truancy summons weights.
Lesson multipliers stay explicit in tests; poor marks and unexcused absences toast and may auto-summon, while illness stays excused.
2026-08-21 14:18:41 +03:00

89 lines
3.2 KiB
C#

using HSchool.Content;
using HSchool.People;
namespace HSchool.People.Tests;
public class GradeTrailTests
{
private static readonly BehaviorDef Rules = new()
{
DefName = "Behavior",
LessonMarkMax = 40,
AttendanceMax = 40,
PoorMarkTrailMaxAverage = 2.5f,
PoorMarkTrailMinMarks = 3,
TruancyTrailMinCount = 2,
OffenseMemoryMax = 5,
OffenseMemoryKinds = BehaviorDef.DefaultOffenseMemoryKinds,
};
[Fact]
public void ThreeTwos_IsPoorMarks()
{
var person = Blank("p1");
var t0 = new DateTime(2012, 4, 3, 9, 0, 0, DateTimeKind.Utc);
Assert.True(LessonMarkMemory.Record(person, "Mathematics", 2, t0, 1, Rules));
Assert.True(LessonMarkMemory.Record(person, "Mathematics", 2, t0.AddHours(1), 2, Rules));
Assert.True(LessonMarkMemory.Record(person, "Literature", 2, t0.AddHours(2), 3, Rules));
Assert.True(GradeTrail.HasPoorMarks(person, Rules));
Assert.True(GradeTrail.IsPoor(person, Rules));
Assert.Equal(2f, GradeTrail.AverageMark(person));
}
[Fact]
public void TwoTruancies_IsTruancyTrail_IllnessDoesNotCount()
{
var person = Blank("p1");
var t0 = new DateTime(2012, 4, 3, 9, 0, 0, DateTimeKind.Utc);
Assert.True(AttendanceMemory.Record(
person, "Mathematics", AttendanceStatuses.Absent, t0, 1, Rules, AbsenceReasons.Truancy));
Assert.True(AttendanceMemory.Record(
person, "Literature", AttendanceStatuses.Absent, t0.AddHours(1), 2, Rules, AbsenceReasons.Illness));
Assert.False(GradeTrail.HasTruancyTrail(person, Rules));
Assert.True(AttendanceMemory.Record(
person, "History", AttendanceStatuses.Absent, t0.AddHours(2), 3, Rules, AbsenceReasons.Truancy));
Assert.True(GradeTrail.HasTruancyTrail(person, Rules));
Assert.Equal(2, GradeTrail.TruancyCount(person));
}
[Fact]
public void Illness_DoesNotCountAsSummonOffense()
{
Assert.False(GradeTrail.CountsAsSummonOffense(AbsenceReasons.Illness));
Assert.True(GradeTrail.CountsAsSummonOffense(AbsenceReasons.Truancy));
Assert.True(GradeTrail.CountsAsSummonOffense(null));
}
private static Person Blank(string id)
{
var cases = new CaseTable
{
Nom = id,
Gen = id,
Dat = id,
Acc = id,
Ins = id,
Pre = id,
};
return new Person
{
Id = id,
FamilyId = "f",
Female = false,
BirthDate = new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc),
Name = new PersonName(id, id, id, cases, cases, cases),
IsStudent = true,
IsStaff = false,
IsParent = false,
Numbers = new Dictionary<string, int>(StringComparer.Ordinal),
Choices = new Dictionary<string, string>(StringComparer.Ordinal),
Skills = new Dictionary<string, int>(StringComparer.Ordinal),
Traits = [],
Needs = new Dictionary<string, float>(StringComparer.Ordinal),
Opinions = new Dictionary<string, int>(StringComparer.Ordinal),
};
}
}