Files
LehrerApp/LehrerApp.Tests/CompetencyAnalysisServiceTests.cs
2026-08-16 02:32:12 +02:00

133 lines
4.9 KiB
C#

using LehrerApp.Core.Models;
using LehrerApp.Core.Services;
using Xunit;
namespace LehrerApp.Tests;
public sealed class CompetencyAnalysisServiceTests
{
private readonly CompetencyAnalysisService _service = new();
[Fact]
public void Analyze_UnterscheidetPlanungBehandlungUndPruefung()
{
var groupId = Guid.NewGuid();
var catalog = Catalog();
var units = new List<Unit>
{
new() { GroupId = groupId, Status = UnitStatus.Planned, Competencies = ["K1"] },
new() { GroupId = groupId, Status = UnitStatus.Active, Competencies = ["K1"] },
new() { GroupId = groupId, Status = UnitStatus.Completed, Competencies = ["K1"] },
};
var exams = new List<Exam>
{
new() { GroupId = groupId, Status = ExamStatus.Planned,
Tasks = [new ExamTask { MaxPoints = 10, CompetencyCodes = ["K1"] }] },
new() { GroupId = groupId, Status = ExamStatus.Graded,
Tasks = [new ExamTask { MaxPoints = 10, CompetencyCodes = ["K1"] }] },
};
var item = Assert.Single(_service.Analyze(catalog, units, exams, []));
Assert.Equal(1, item.PlannedUnitCount);
Assert.Equal(2, item.TaughtUnitCount);
Assert.Equal(1, item.PlannedExamCount);
Assert.Equal(1, item.AssessedExamCount);
}
[Fact]
public void Analyze_BerechnetGewichteteGruppenUndSchuelerprofileAusAufgabenpunkten()
{
var firstStudent = Guid.NewGuid();
var secondStudent = Guid.NewGuid();
var absentStudent = Guid.NewGuid();
var exam = new Exam
{
Status = ExamStatus.Graded,
Tasks =
[
new ExamTask { MaxPoints = 10, CompetencyCodes = ["K1"] },
new ExamTask { MaxPoints = 20, CompetencyCodes = ["K1"] },
],
};
var results = new List<ExamResult>
{
new() { ExamId = exam.Id, StudentId = firstStudent, Points = [5, 10] },
new() { ExamId = exam.Id, StudentId = secondStudent, Points = [10, 20] },
new() { ExamId = exam.Id, StudentId = absentStudent, Points = [0, 0], Absent = true },
};
var item = Assert.Single(_service.Analyze(Catalog(), [], [exam], results));
Assert.NotNull(item.GroupScore);
Assert.Equal(75, item.GroupScore.Percent, 6);
Assert.Equal(2, item.GroupScore.ParticipantCount);
Assert.Equal(4, item.GroupScore.EvidenceCount);
Assert.Equal(50, item.StudentScores[firstStudent].Percent, 6);
Assert.Equal(100, item.StudentScores[secondStudent].Percent, 6);
Assert.False(item.StudentScores.ContainsKey(absentStudent));
}
[Fact]
public void Analyze_AufgabeMitMehrerenCodes_WertetJedeZugeordneteKompetenzAus()
{
var studentId = Guid.NewGuid();
var exam = new Exam
{
Status = ExamStatus.Returned,
Tasks = [new ExamTask { MaxPoints = 8, CompetencyCodes = ["K1", "K2"] }],
};
var result = new ExamResult { ExamId = exam.Id, StudentId = studentId, Points = [6] };
var analysis = _service.Analyze(Catalog(includeSecond: true), [], [exam], [result]);
Assert.All(analysis, item => Assert.Equal(75, item.StudentScores[studentId].Percent, 6));
}
[Fact]
public void Analyze_DurchgefuehrteAberNichtKorrigierteKlausur_LiefertNochKeinProfil()
{
var studentId = Guid.NewGuid();
var exam = new Exam
{
Status = ExamStatus.Conducted,
Tasks = [new ExamTask { MaxPoints = 10, CompetencyCodes = ["K1"] }],
};
var result = new ExamResult { ExamId = exam.Id, StudentId = studentId, Points = [5] };
var item = Assert.Single(_service.Analyze(Catalog(), [], [exam], [result]));
Assert.Equal(1, item.AssessedExamCount);
Assert.Null(item.GroupScore);
Assert.Empty(item.StudentScores);
}
[Fact]
public void Analyze_VerwendeterUnbekannterCode_BleibtInUebersichtSichtbar()
{
var unit = new Unit { Status = UnitStatus.Active, Competencies = ["ALT1"] };
var analysis = _service.Analyze(Catalog(), [unit], [], []);
var unknown = Assert.Single(analysis, x => x.Code == "ALT1");
Assert.Equal("Nicht im Katalog", unknown.DomainName);
Assert.Equal(1, unknown.TaughtUnitCount);
}
private static List<CompetencyDomain> Catalog(bool includeSecond = false) =>
[
new CompetencyDomain
{
Name = "Bereich",
Code = "B",
Items = includeSecond
?
[
new CompetencyItem { Code = "K1", Description = "Erste Kompetenz", SortOrder = 0 },
new CompetencyItem { Code = "K2", Description = "Zweite Kompetenz", SortOrder = 1 },
]
: [new CompetencyItem { Code = "K1", Description = "Erste Kompetenz" }],
},
];
}