Sidebar-Klausuren war bisher ein Placeholder. Neue Seite zeigt alle Klausuren des Schuljahres sortiert nach abgeleiteter Dringlichkeit (Korrekturfortschritt statt manuellem Status), mit Detailbereich, Parallelkurs-Umschalter und Notenspiegel. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
66 lines
2.9 KiB
C#
66 lines
2.9 KiB
C#
using LehrerApp.Core.Models;
|
|
using LehrerApp.Core.Services;
|
|
using LehrerApp.Desktop.ViewModels.Groups;
|
|
using Xunit;
|
|
|
|
namespace LehrerApp.Desktop.Tests;
|
|
|
|
/// Deckt 1.6.3 (Bulk-Aktion "Rest als abwesend markieren") ab — löst das Nutzer-Feedback, dass
|
|
/// Schüler, die nie nachschreiben, sonst dauerhaft eine leere, unberührte Zeile hinterlassen.
|
|
public sealed class ExamGradingDialogViewModelTests
|
|
{
|
|
[Fact]
|
|
public void MarkRemainingAbsent_MarktNurUnberührteZeilenAbwesend()
|
|
{
|
|
var group = new LearningGroup { Name = "Q1 Chemie" };
|
|
var studentWithPoints = new Student { FirstName = "Anna", LastName = "Bauer" };
|
|
var untouchedStudent1 = new Student { FirstName = "Ben", LastName = "Cordes" };
|
|
var untouchedStudent2 = new Student { FirstName = "Cara", LastName = "Diehl" };
|
|
var students = new FakeStudents([studentWithPoints, untouchedStudent1, untouchedStudent2]);
|
|
var memberships = new FakeMemberships(
|
|
[
|
|
new GroupMembership { GroupId = group.Id, StudentId = studentWithPoints.Id },
|
|
new GroupMembership { GroupId = group.Id, StudentId = untouchedStudent1.Id },
|
|
new GroupMembership { GroupId = group.Id, StudentId = untouchedStudent2.Id },
|
|
]);
|
|
var exam = new Exam
|
|
{
|
|
GroupId = group.Id,
|
|
Title = "Klausur 1",
|
|
Tasks = [new ExamTask { Nr = 1, MaxPoints = 10 }],
|
|
GradingKey = GradingService.DefaultKey1To6(),
|
|
};
|
|
var results = new FakeResults();
|
|
|
|
var vm = new ExamGradingDialogViewModel(results, students, memberships,
|
|
new GradingService(), exam, group.Id);
|
|
|
|
var rowWithPoints = vm.Rows.Single(r => r.StudentId == studentWithPoints.Id);
|
|
rowWithPoints.Cells[0].TrySetValue(7);
|
|
|
|
vm.MarkRemainingAbsentCommand.Execute(null);
|
|
|
|
Assert.False(rowWithPoints.Absent);
|
|
Assert.True(vm.Rows.Single(r => r.StudentId == untouchedStudent1.Id).Absent);
|
|
Assert.True(vm.Rows.Single(r => r.StudentId == untouchedStudent2.Id).Absent);
|
|
}
|
|
|
|
[Fact]
|
|
public void MarkRemainingAbsent_LässtBereitsAbwesendMarkierteUnverändert()
|
|
{
|
|
var group = new LearningGroup { Name = "Q1 Chemie" };
|
|
var student = new Student { FirstName = "Ben", LastName = "Cordes" };
|
|
var students = new FakeStudents([student]);
|
|
var memberships = new FakeMemberships(
|
|
[new GroupMembership { GroupId = group.Id, StudentId = student.Id }]);
|
|
var exam = new Exam { GroupId = group.Id, Title = "Klausur 1", Tasks = [new ExamTask { Nr = 1, MaxPoints = 10 }], GradingKey = GradingService.DefaultKey1To6() };
|
|
var vm = new ExamGradingDialogViewModel(new FakeResults(), students, memberships,
|
|
new GradingService(), exam, group.Id);
|
|
|
|
vm.Rows[0].Absent = true;
|
|
vm.MarkRemainingAbsentCommand.Execute(null);
|
|
|
|
Assert.True(vm.Rows[0].Absent);
|
|
}
|
|
}
|