Files
LehrerApp/LehrerApp.TemplateDesigner.Tests/ExamCoverDesignerTests.cs
T
2026-10-22 11:24:43 +02:00

120 lines
4.9 KiB
C#

using LehrerApp.TemplateDesigner;
using LehrerApp.Templating;
using Xunit;
namespace LehrerApp.TemplateDesigner.Tests;
public sealed class ExamCoverDesignerTests
{
[Fact]
public void Schuelerbericht_EinrichtenUndSonderinhalte_RendernMitBeispieldaten()
{
var vm = new DesignerViewModel();
vm.Reset();
vm.SetUpStudentReport();
vm.SetUpStudentReport();
vm.LayoutSource = StudentReportTemplate.Layout;
Assert.Equal(TemplateReportTypes.StudentReport, vm.BuildLoaded().Manifest.Metadata[TemplateMetadataKeys.ReportType]);
Assert.Equal(StudentReportTemplate.Create().Manifest.Placeholders.Count, vm.Placeholders.Count);
using var pdf = UglyToad.PdfPig.PdfDocument.Open(vm.RenderCurrentPdf());
var text = string.Concat(pdf.GetPages().Select(p => p.Text)).Replace(" ", "");
Assert.Contains("GewichteteMitarbeit", text);
Assert.Contains("Hausaufgaben", text);
Assert.Contains("VorläufigeZeugnisnote", text);
}
[Fact]
public void SetUpExamCover_SetztVorlagentypUndErgaenztFehlendePlatzhalter()
{
var viewModel = new DesignerViewModel();
viewModel.Reset();
viewModel.Placeholders.Add(new("Exam.Title", PlaceholderType.Text, true, "Mein Titel"));
viewModel.SetUpExamCover();
viewModel.SetUpExamCover();
Assert.True(viewModel.IsExamCover);
Assert.Single(viewModel.MetadataItems, x => x.Name == TemplateMetadataKeys.ReportType);
Assert.Equal(ExamCoverPlaceholders.All.Count, viewModel.Placeholders.Count);
// Vorhandene Platzhalter bleiben samt Beispielwert erhalten.
Assert.Equal("Mein Titel", viewModel.Placeholders.Single(x => x.Name == "Exam.Title").Sample);
Assert.Equal("G-Kurs", viewModel.Placeholders.Single(x => x.Name == "Exam.Course").Sample);
Assert.Equal(PlaceholderType.Date, viewModel.Placeholders.Single(x => x.Name == "Exam.Date").Type);
Assert.Equal(TemplateReportTypes.ExamCover,
viewModel.BuildLoaded().Manifest.Metadata[TemplateMetadataKeys.ReportType]);
}
[Fact]
public void SetUpExamCover_AbweichenderTyp_WirdGemeldetStattUeberschrieben()
{
var viewModel = new DesignerViewModel();
viewModel.Reset();
viewModel.Placeholders.Add(new("Exam.Date", PlaceholderType.Text, false, "18.12."));
viewModel.SetUpExamCover();
Assert.Equal(PlaceholderType.Text, viewModel.Placeholders.Single(x => x.Name == "Exam.Date").Type);
Assert.Contains("Exam.Date", viewModel.Status);
}
[Fact]
public void Punktetabelle_WirdAlsFlowDrawBoxMitFitContentInDenContentFlowVorbereitet()
{
var viewModel = new DesignerViewModel();
viewModel.Reset();
viewModel.SelectedSpecialContent = viewModel.SpecialContents.Single(x =>
x.PlaceholderName == ExamPointsTableDrawing.PlaceholderName);
viewModel.PrepareSelectedSpecialContent();
viewModel.AddElement();
Assert.Contains("FLOWDRAWBOX $Exam.PointsTable w=165 h=150 fit=content", viewModel.LayoutSource);
var layout = viewModel.BuildLoaded().Layout;
Assert.IsType<FlowDrawBoxElement>(layout.ContentFlows.Single().Elements.Single());
}
[Fact]
public void Vorschau_ZeigtDieEchtePunktetabelleUndSprechendeBeispielwerte()
{
var viewModel = new DesignerViewModel();
viewModel.Reset();
viewModel.SetUpExamCover();
viewModel.LayoutSource = """
PAGE 210 297 mm
#pragma format-version 3
#pragma page-template first
TEXT 20 20 "Fach: $Subject.Name $Exam.Course $Teacher.Abbreviation" size=12
#pragma flow-slot body x=20 y=40 w=170 h=230
#pragma end-page-template
#pragma content-flow body
FLOWDRAWBOX $Exam.PointsTable w=100 h=150 fit=content
TEXT "Gesamtpunkte: $Result.Points von $Exam.MaxPoints Punkte" size=11 gap=8
#pragma end-content-flow
""";
using var document = UglyToad.PdfPig.PdfDocument.Open(viewModel.RenderCurrentPdf());
var text = document.GetPage(1).Text.Replace(" ", "");
Assert.Contains("Fach:ChemieG-KursHED", text);
Assert.Contains("Gesamtpunkte:52,5von62Punkte", text);
Assert.Contains("+3", text);
// 100 mm Boxbreite: drei Aufgaben je Block, also drei Blöcke für neun Spalten.
Assert.Equal(3, System.Text.RegularExpressions.Regex.Matches(text, "Max.Punktzahl").Count);
}
[Fact]
public void Laden_EinerDeckblattVorlage_VerwendetSprechendeBeispielwerte()
{
var source = new DesignerViewModel();
source.Reset();
source.SetUpExamCover();
var loaded = source.BuildLoaded();
var viewModel = new DesignerViewModel();
viewModel.Load(loaded, source.LayoutSource);
Assert.True(viewModel.IsExamCover);
Assert.Equal("Atombau und PSE", viewModel.Placeholders.Single(x => x.Name == "Exam.Title").Sample);
}
}