feat(ui): complete Avalonia UI port with 7 main pages, tool settings & top MenuBar

This commit is contained in:
Richard
2026-08-10 10:48:34 +02:00
parent a0e18d2a57
commit b5bf97ae74
187 changed files with 20054 additions and 882 deletions
@@ -9,8 +9,13 @@ namespace ClawdDotNet.Tools.Tests.FileRW;
/// "…\Workspace-Backup\…".
///
/// Das Dateisystem wird hier bewusst NICHT abstrahiert — die Tests sollen die echte
/// Windows-Pfadsemantik prüfen (.., UNC, Alternate Data Streams, abschließende Punkte).
/// Eine Abstraktion würde genau die Fehlerklasse verstecken, um die es geht.
/// Pfadsemantik der jeweiligen Plattform prüfen (.., UNC, Alternate Data Streams,
/// abschließende Punkte, unter Linux zusätzlich Groß-/Kleinschreibung und
/// Verknüpfungen). Eine Abstraktion würde genau die Fehlerklasse verstecken, um die es
/// geht.
///
/// Die Verzeichnisgrenze selbst prüft <c>PathBoundaryTests</c> in Core.Tests; hier geht
/// es um das, was <see cref="WorkspacePath.Resolve"/> darüber hinaus abweist.
/// </summary>
public sealed class WorkspacePathTests : IDisposable
{
@@ -45,6 +50,13 @@ public sealed class WorkspacePathTests : IDisposable
Should.Throw<UnauthorizedAccessException>(() => Resolve(path));
}
/// <summary>
/// Die Windows-Formen müssen auch unter Linux abgewiesen werden — dort greift
/// aber eine andere Regel: <c>Path.IsPathRooted(@"C:\temp\x")</c> ist unter Linux
/// <c>false</c>, weil das schlicht ein Dateiname mit Doppelpunkt ist. Gefangen
/// werden die Fälle dann von der Doppelpunkt- bzw. der <c>\\</c>-Prüfung.
/// Das Ergebnis ist auf beiden Plattformen dasselbe, der Weg dorthin nicht.
/// </summary>
[Theory]
[InlineData(@"C:\Windows\System32\config\SAM")]
[InlineData(@"\\server\share\evil.txt")]
@@ -55,6 +67,20 @@ public sealed class WorkspacePathTests : IDisposable
Should.Throw<UnauthorizedAccessException>(() => Resolve(path));
}
/// <summary>
/// Die Linux-Entsprechungen. Unter Windows sind das gewöhnliche relative Pfade,
/// die entweder ins Leere zeigen oder von der <c>..</c>-Regel gefangen werden —
/// deshalb laufen sie dort mit, statt übersprungen zu werden.
/// </summary>
[Theory]
[InlineData("/etc/passwd")]
[InlineData("/root/.ssh/id_rsa")]
[InlineData("../../../../etc/shadow")]
public void Unix_Systempfade_werden_abgelehnt(string path)
{
Should.Throw<UnauthorizedAccessException>(() => Resolve(path));
}
[Theory]
[InlineData("datei.txt:versteckt")]
[InlineData("datei.txt:$DATA")]