Files
h-school/tests/HSchool.Ai.Tests/LessonLearningTests.cs
T
Leonid PershinandCursor c2579d6767 Scale lesson skill gain by the teacher's subject skill.
Hiring a 78-math applicant already cost more than a 41; the class now actually learns faster when that teacher is in the room.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-20 08:54:13 +03:00

84 lines
2.8 KiB
C#

using HSchool.Content;
namespace HSchool.Ai.Tests;
public class LessonLearningTests
{
private static readonly SkillDef Math = new()
{
DefName = "Mathematics",
Range = new IntRange { Min = 0, Max = 100 },
};
[Fact]
public void HungryLearnsLessThanFull()
{
var full = LessonLearning.Gain(50, Math, share: 1, lessonSkillPerHour: 0.05f, hours: 0.75f, hunger: 1f, traitOffset: 0, teacherSkill: 100);
var hungry = LessonLearning.Gain(50, Math, share: 1, lessonSkillPerHour: 0.05f, hours: 0.75f, hunger: 0.1f, traitOffset: 0, teacherSkill: 100);
Assert.True(full > 50);
Assert.True(hungry > 50);
Assert.True(full - 50 > hungry - 50);
}
[Fact]
public void DiligentOffset_RaisesTheGain()
{
var plain = LessonLearning.Gain(50, Math, 1, 0.05f, 1f, 1f, 0, 100);
var diligent = LessonLearning.Gain(50, Math, 1, 0.05f, 1f, 1f, 8, 100);
Assert.True(diligent > plain);
}
[Fact]
public void TeacherSkill20_GainsLessThan80()
{
var weak = LessonLearning.Gain(50, Math, 1, 0.05f, 1f, 1f, 0, 20);
var strong = LessonLearning.Gain(50, Math, 1, 0.05f, 1f, 1f, 0, 80);
Assert.True(weak > 50);
Assert.True(strong - 50 > weak - 50);
}
[Fact]
public void TeacherFactor_MatchesNeedCurve()
{
Assert.Equal(LessonLearning.NeedFactor(0f), LessonLearning.TeacherFactor(0f));
Assert.Equal(LessonLearning.NeedFactor(1f), LessonLearning.TeacherFactor(100f));
Assert.Equal(LessonLearning.NeedFactor(0.2f), LessonLearning.TeacherFactor(20f));
}
[Fact]
public void MultiSkillSubject_AveragesListedSkills_NotDictionaryOrder()
{
var (catalog, _) = Fixtures.Vanilla();
var subject = catalog.Subjects["PrimarySchool"];
var skills = new Dictionary<string, float>(StringComparer.Ordinal)
{
["Biology"] = 100,
["Literature"] = 100,
["RussianLanguage"] = 100,
["Mathematics"] = 0,
};
var average = LessonLearning.AverageTeacherSkill(subject, skills, catalog);
Assert.Equal(75f, average);
Assert.NotEqual(skills.Values.First(), average);
}
[Fact]
public void MissingTeacherSkill_UsesRangeMin_AndStillGains()
{
var (catalog, _) = Fixtures.Vanilla();
var subject = catalog.Subjects["Mathematics"];
var min = catalog.Skills["Mathematics"].Range.Min;
var average = LessonLearning.AverageTeacherSkill(subject, new Dictionary<string, float>(), catalog);
var gained = LessonLearning.Gain(50, Math, 1, 0.05f, 1f, 1f, 0, average);
Assert.Equal(min, average);
Assert.True(gained > 50);
Assert.True(gained < LessonLearning.Gain(50, Math, 1, 0.05f, 1f, 1f, 0, 100));
}
}