Stufe 4c (#764): Kommentare in C#, WebUI-Skripten, CSS und HTML auf Englisch
Rund 2.600 Kommentarblöcke in 310 C#-Dateien übersetzt, Begründungen vollständig erhalten: blockweise gleiche Anzahl wie vorher, kein Block unter 60 % seiner Länge, der Code außerhalb der Kommentare per Tokenizer byte-identisch geprüft. Zitate deutscher Oberflächentexte und Testdaten bleiben deutsch. WebUI: Kommentare in JS/CSS/HTML übersetzt, JSDoc-@param an die in 4b umbenannten Parameter angeglichen. Dabei behoben: - 4b hatte "tag" (HTML-Tag) als deutsches "Tag" gelesen und zu "dayValue" gemacht (makeElement, svg, Tagesübersicht) - zurück auf tag/day. - Aufgaben "InProgress" bekamen die Plakettenart "laufend", für die es nie eine CSS-Klasse gab - jetzt "success" wie laufende Instanzen. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
da4ceac7d5
commit
837a634a22
@@ -4,7 +4,7 @@ using Shouldly;
|
||||
|
||||
namespace ClawdDotNet.Manager.Tests;
|
||||
|
||||
/// <summary>Zählt mit, wem ein Token besorgt wurde.</summary>
|
||||
/// <summary>Counts for whom a token was obtained.</summary>
|
||||
internal sealed class FakeTokenSource : IInstanceTokenSource
|
||||
{
|
||||
public List<string> Fuer { get; } = [];
|
||||
@@ -19,12 +19,12 @@ internal sealed class FakeTokenSource : IInstanceTokenSource
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Der Instanzmanager als Ganzes (#528, Stufe 3).
|
||||
/// The instance manager as a whole (#528, stage 3).
|
||||
///
|
||||
/// <para><b>Die Lizenz wird hier ohne Lizenzserver geprüft</b>, und das ist Absicht: Die
|
||||
/// Zusage lautet nicht „der Torwächter funktioniert" — das ist die Aufgabe des SDK —,
|
||||
/// sondern „ein Urteil führt zum Anhalten aller Instanzen, ein Ausfall nicht". Genau
|
||||
/// dieser Weg wird hier gegangen, ausgelöst über
|
||||
/// <para><b>The license is checked here without a license server</b>, and that is intentional: the
|
||||
/// promise is not "the gatekeeper works" — that is the SDK's job —,
|
||||
/// but "a verdict leads to stopping all instances, an outage does not". Exactly
|
||||
/// this path is taken here, triggered via
|
||||
/// <see cref="ManagerCore.HandleLicenseRevokedAsync"/>.</para>
|
||||
/// </summary>
|
||||
public sealed class ManagerCoreTests : IAsyncDisposable
|
||||
@@ -49,8 +49,8 @@ public sealed class ManagerCoreTests : IAsyncDisposable
|
||||
{
|
||||
Directory.CreateDirectory(_root);
|
||||
_verzeichnisse = new InstanceDirectoryManager(Path.Combine(_root, "Instances"));
|
||||
// Der Socket antwortet nur, wenn wirklich ein Prozess laeuft - genau wie im
|
||||
// Betrieb (siehe FakeChannel.Launcher).
|
||||
// The socket only answers if a process is really running - exactly as in
|
||||
// operation (see FakeChannel.Launcher).
|
||||
_kanal.Launcher = _launcher;
|
||||
}
|
||||
|
||||
@@ -67,18 +67,17 @@ public sealed class ManagerCoreTests : IAsyncDisposable
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
try { Directory.Delete(_root, recursive: true); }
|
||||
catch { /* Ein liegengebliebener Testordner faerbt keinen Lauf rot. */ }
|
||||
catch { /* A leftover test folder does not turn a run red. */ }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Lässt die Instanz ab jetzt antworten — und prüft, dass sie danach wirklich
|
||||
/// gestartet und nicht bloß übernommen wurde.
|
||||
/// Lets the instance answer from now on — and checks that it was really
|
||||
/// started afterwards and not merely taken over.
|
||||
///
|
||||
/// <para><b>Der Unterschied ist keine Feinheit.</b> Wer die Antwort schon vor dem
|
||||
/// Hochfahren des Managers hinterlegt, sagt damit „diese Instanz läuft bereits" — der
|
||||
/// Manager übernimmt sie dann (E-M6), der Starter wird nie angefasst, und der Test
|
||||
/// prüft etwas anderes, als er behauptet. Genau das ist mir hier zweimal
|
||||
/// passiert.</para>
|
||||
/// <para><b>The difference is not a subtlety.</b> Whoever stores the answer before
|
||||
/// the manager comes up says with it "this instance is already running" — the
|
||||
/// manager then takes it over (E-M6), the launcher is never touched, and the test
|
||||
/// checks something other than it claims. Exactly that happened to me here twice.</para>
|
||||
/// </summary>
|
||||
private async Task<StartRefusal> StarteUndPruefe(ManagerCore manager, string pfad, string name)
|
||||
{
|
||||
@@ -92,13 +91,13 @@ public sealed class ManagerCoreTests : IAsyncDisposable
|
||||
return ergebnis;
|
||||
}
|
||||
|
||||
// ─── Hochfahren ───
|
||||
// ─── Starting up ───
|
||||
|
||||
[Fact]
|
||||
public async Task Ohne_Lizenzpruefung_arbeitet_der_Manager()
|
||||
{
|
||||
// Kein Torwaechter heisst keine Sperre - sonst gaebe es eine Henne-Ei-Sperre,
|
||||
// bevor ueberhaupt jemand einen Schluessel eintragen kann.
|
||||
// No gatekeeper means no lock - otherwise there would be a chicken-and-egg lock
|
||||
// before anyone can even enter a key.
|
||||
await using var manager = Manager();
|
||||
|
||||
(await manager.StartAsync()).ShouldBeTrue();
|
||||
@@ -122,8 +121,8 @@ public sealed class ManagerCoreTests : IAsyncDisposable
|
||||
[Fact]
|
||||
public async Task Eine_neue_Instanz_bekommt_gleich_ihr_eigenes_Token()
|
||||
{
|
||||
// Beim Anlegen und nicht beim ersten Start: Dann gehoert die Instanzdatei
|
||||
// zweifelsfrei niemandem.
|
||||
// At creation and not at the first start: then the instance file belongs
|
||||
// to nobody without doubt.
|
||||
await using var manager = Manager();
|
||||
|
||||
var pfad = await manager.CreateInstanceAsync("Frisch");
|
||||
@@ -134,8 +133,8 @@ public sealed class ManagerCoreTests : IAsyncDisposable
|
||||
[Fact]
|
||||
public async Task Vor_dem_Start_wird_das_Token_nachgeholt()
|
||||
{
|
||||
// Der Fall einer Instanz, die es vor dem Manager schon gab - oder bei der das
|
||||
// Deploymentcenter beim Anlegen nicht erreichbar war.
|
||||
// The case of an instance that existed before the manager - or for which the
|
||||
// Deploymentcenter was not reachable at creation.
|
||||
var pfad = _verzeichnisse.CreateInstance("Alt");
|
||||
|
||||
await using var manager = Manager();
|
||||
@@ -149,8 +148,8 @@ public sealed class ManagerCoreTests : IAsyncDisposable
|
||||
[Fact]
|
||||
public async Task Ein_fehlgeschlagener_Tokenbezug_verhindert_den_Start_nicht()
|
||||
{
|
||||
// Monitoring, das nur bei perfekter Rechtelage laeuft, ist genau dann still,
|
||||
// wenn man es braucht.
|
||||
// Monitoring that only runs with perfect permissions is silent exactly
|
||||
// when you need it.
|
||||
_tokens.Erfolg = false;
|
||||
|
||||
var pfad = _verzeichnisse.CreateInstance("Alt");
|
||||
@@ -161,14 +160,14 @@ public sealed class ManagerCoreTests : IAsyncDisposable
|
||||
(await StarteUndPruefe(manager, pfad, "Alt")).ShouldBe(StartRefusal.None);
|
||||
}
|
||||
|
||||
// ─── Das Urteil ───
|
||||
// ─── The verdict ───
|
||||
|
||||
/// <summary>
|
||||
/// Der einzige Fall, in dem der Manager von sich aus Instanzen anhält.
|
||||
/// The only case in which the manager stops instances on its own initiative.
|
||||
///
|
||||
/// <para>Ein Serverausfall gehört ausdrücklich nicht dazu — das SDK trennt Urteil und
|
||||
/// gescheiterten Versuch, und nur das Urteil kommt hier an. Sonst nähme ein
|
||||
/// Netzproblem sämtliche Installationen gleichzeitig mit.</para>
|
||||
/// <para>A server outage explicitly does not belong here — the SDK separates verdict and
|
||||
/// failed attempt, and only the verdict arrives here. Otherwise a
|
||||
/// network problem would take all installations down at the same time.</para>
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public async Task Ein_Lizenzwiderruf_haelt_alle_laufenden_Instanzen_an()
|
||||
@@ -181,7 +180,7 @@ public sealed class ManagerCoreTests : IAsyncDisposable
|
||||
|
||||
manager.Instances.Instances.Single().Condition.ShouldBe(InstanceCondition.Running);
|
||||
|
||||
// Die Instanz endet auf die Bitte hin.
|
||||
// The instance ends upon the request.
|
||||
var prozess = _launcher.Last!;
|
||||
_kanal.OnStopRequest = _ => { _kanal.AnswerFor[Path.GetFullPath(pfad)] = null; prozess.Exit(0); };
|
||||
|
||||
@@ -208,7 +207,7 @@ public sealed class ManagerCoreTests : IAsyncDisposable
|
||||
_tokens.Fuer.ShouldBeEmpty("Ohne Lizenz wird auch kein Token verbraucht.");
|
||||
}
|
||||
|
||||
// ─── Wenn der Start scheitert ───
|
||||
// ─── When the start fails ───
|
||||
|
||||
[Fact]
|
||||
public async Task Eine_Instanz_die_sich_nicht_meldet_gilt_als_nicht_gestartet()
|
||||
@@ -218,7 +217,7 @@ public sealed class ManagerCoreTests : IAsyncDisposable
|
||||
await using var manager = Manager();
|
||||
await manager.StartAsync();
|
||||
|
||||
// Der Prozess laeuft, die Instanz meldet sich nie.
|
||||
// The process runs, the instance never reports in.
|
||||
(await manager.StartInstanceAsync(pfad)).ShouldBe(StartRefusal.DidNotStart);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user