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
@@ -5,11 +5,11 @@ using Shouldly;
|
||||
namespace ClawdDotNet.Core.Tests.Memory;
|
||||
|
||||
/// <summary>
|
||||
/// K1 aus der Bestandsaufnahme: Geplante Agenten begannen bei jedem Cron-Lauf bei null.
|
||||
/// K1 from the inventory: scheduled agents started from zero at every cron run.
|
||||
///
|
||||
/// Getestet wird gegen eine echte SQLite-Datei, nicht gegen eine Attrappe — nur so
|
||||
/// werden Schema, Indizes, Sperrverhalten und die Behandlung gleichzeitiger Zugriffe
|
||||
/// tatsächlich geprüft.
|
||||
/// Testing is against a real SQLite file, not against a fake — only that way
|
||||
/// are schema, indexes, locking behavior and the handling of simultaneous access
|
||||
/// actually checked.
|
||||
/// </summary>
|
||||
public sealed class MemoryRepositoryTests : IDisposable
|
||||
{
|
||||
@@ -31,7 +31,7 @@ public sealed class MemoryRepositoryTests : IDisposable
|
||||
{
|
||||
ClawdDotNet.Core.Storage.SqliteStorage.ReleasePooledConnections(_directory);
|
||||
try { Directory.Delete(_directory, recursive: true); }
|
||||
catch { /* Aufräumen ist Nebensache */ }
|
||||
catch { /* Cleaning up is secondary */ }
|
||||
}
|
||||
|
||||
private Task<MemoryEntry> Remember(
|
||||
@@ -66,7 +66,7 @@ public sealed class MemoryRepositoryTests : IDisposable
|
||||
}, default);
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// Grundfunktionen
|
||||
// Basic functions
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
|
||||
[Fact]
|
||||
@@ -113,14 +113,14 @@ public sealed class MemoryRepositoryTests : IDisposable
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// Schlüssel: aktualisieren statt zuwachsen
|
||||
// Key: update instead of growing
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
|
||||
[Fact]
|
||||
public async Task Ein_Schluessel_aktualisiert_statt_eine_zweite_Erinnerung_anzulegen()
|
||||
{
|
||||
// Sonst wüchse das Gedächtnis bei einem alle 30 Minuten laufenden Agenten
|
||||
// binnen eines Tages um 48 Einträge zur selben Sache.
|
||||
// Otherwise, with an agent running every 30 minutes, the memory would grow
|
||||
// by 48 entries about the same thing within a day.
|
||||
await Remember("NVDA", "Kursziel 120", key: "kursziel_nvda");
|
||||
await Remember("NVDA", "Kursziel 145", key: "kursziel_nvda");
|
||||
|
||||
@@ -162,7 +162,7 @@ public sealed class MemoryRepositoryTests : IDisposable
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// Bereiche
|
||||
// Scopes
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
|
||||
[Fact]
|
||||
@@ -195,13 +195,13 @@ public sealed class MemoryRepositoryTests : IDisposable
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// Reihenfolge und Kappung
|
||||
// Order and capping
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
|
||||
[Fact]
|
||||
public async Task Wichtiges_kommt_zuerst()
|
||||
{
|
||||
// Entscheidend, weil der Abruf begrenzt wird — das Wichtigste muss überleben.
|
||||
// Crucial, because recall is limited — the most important things must survive.
|
||||
await Remember("A", "nebensächlich", importance: 1);
|
||||
await Remember("B", "zentral", importance: 5);
|
||||
await Remember("C", "mittel", importance: 3);
|
||||
@@ -254,7 +254,7 @@ public sealed class MemoryRepositoryTests : IDisposable
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// Schlagworte
|
||||
// Keywords
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
|
||||
[Fact]
|
||||
@@ -271,7 +271,7 @@ public sealed class MemoryRepositoryTests : IDisposable
|
||||
[Fact]
|
||||
public async Task Ein_Schlagwort_trifft_kein_laengeres_mit_gleichem_Anfang()
|
||||
{
|
||||
// "news" darf nicht "newsletter" treffen.
|
||||
// "news" must not match "newsletter".
|
||||
await Remember("A", "eins", tags: ["newsletter"]);
|
||||
|
||||
(await Recall(tags: "news")).ShouldBeEmpty();
|
||||
@@ -289,7 +289,7 @@ public sealed class MemoryRepositoryTests : IDisposable
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// Löschen und Überblick
|
||||
// Deleting and overview
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
|
||||
[Fact]
|
||||
@@ -334,13 +334,13 @@ public sealed class MemoryRepositoryTests : IDisposable
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// Nebenläufigkeit — der eigentliche Grund für WAL und busy_timeout
|
||||
// Concurrency — the actual reason for WAL and busy_timeout
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
|
||||
[Fact]
|
||||
public async Task Viele_Agenten_koennen_gleichzeitig_schreiben()
|
||||
{
|
||||
// Ohne WAL und Sperr-Wartezeit quittiert SQLite das mit "database is locked".
|
||||
// Without WAL and lock wait time SQLite answers this with "database is locked".
|
||||
var tasks = Enumerable.Range(0, 60)
|
||||
.Select(i => Remember($"Betreff {i % 5}", $"Notiz {i}", owner: $"agent-{i % 6}"));
|
||||
|
||||
@@ -367,7 +367,7 @@ public sealed class MemoryRepositoryTests : IDisposable
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// Sonderfälle
|
||||
// Special cases
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
|
||||
[Fact]
|
||||
@@ -376,7 +376,7 @@ public sealed class MemoryRepositoryTests : IDisposable
|
||||
await Remember("A", "Erster Eintrag");
|
||||
await Remember("B", "Zweiter Eintrag");
|
||||
|
||||
// Als LIKE-Muster würde "%" alles treffen.
|
||||
// As a LIKE pattern "%" would match everything.
|
||||
(await Recall("%")).ShouldBeEmpty();
|
||||
}
|
||||
|
||||
@@ -402,7 +402,7 @@ public sealed class MemoryRepositoryTests : IDisposable
|
||||
[Fact]
|
||||
public async Task Erinnerungen_ueberdauern_das_Schliessen_der_Datenbank()
|
||||
{
|
||||
// Der eigentliche Zweck: Ein Neustart der Anwendung darf nichts kosten.
|
||||
// The actual purpose: a restart of the application must cost nothing.
|
||||
await Remember("Dauerhaft", "muss einen Neustart überleben");
|
||||
|
||||
var wiederEroeffnet = new SqliteMemoryRepository(
|
||||
|
||||
Reference in New Issue
Block a user