Stufe 4c (#764): Bezeichner auf Englisch - Typen, Methoden, Felder, Parameter, Locals, Testnamen
Mit Roslyn umbenannt (Verweise folgen, Zeichenketten bleiben unberuehrt). Nicht umbenannt, weil gespeichert oder ueber die API gebunden (Stufe 4e): Properties, Record-Parameter, Enum-Member sowie die Parameter der Endpunkt-Handler (Routen-/Query-Bindung ueber den Namen). Die JSON-Felder anonymer Objekte bleiben ausdruecklich benannt (JsonFilter: pfad). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
837a634a22
commit
77062facc9
@@ -55,7 +55,7 @@ public sealed class TaskScannerTests : IDisposable
|
||||
// ─── Basic flow ───
|
||||
|
||||
[Fact]
|
||||
public async Task Eine_faellige_Aufgabe_wird_ausgefuehrt_und_abgeschlossen()
|
||||
public async Task A_due_task_is_executed_and_completed()
|
||||
{
|
||||
await SeedDue("t-1");
|
||||
var dispatcher = new FakeDispatcher();
|
||||
@@ -68,7 +68,7 @@ public sealed class TaskScannerTests : IDisposable
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Mit_require_approval_landet_das_Ergebnis_im_Review()
|
||||
public async Task With_require_approval_the_result_ends_up_in_review()
|
||||
{
|
||||
await SeedDue("t-1", requireApproval: true);
|
||||
|
||||
@@ -78,7 +78,7 @@ public sealed class TaskScannerTests : IDisposable
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Ein_gescheiterter_Lauf_geht_zurueck_auf_todo_und_wird_nicht_wiederholt()
|
||||
public async Task A_failed_run_goes_back_to_todo_and_is_not_retried()
|
||||
{
|
||||
await SeedDue("t-1");
|
||||
var dispatcher = new FakeDispatcher(succeed: false);
|
||||
@@ -95,7 +95,7 @@ public sealed class TaskScannerTests : IDisposable
|
||||
// ─── Invariant 2: no dispatch with an open blocker / to humans ───
|
||||
|
||||
[Fact]
|
||||
public async Task Eine_blockierte_Aufgabe_wird_nicht_angestossen()
|
||||
public async Task A_blocked_task_is_not_triggered()
|
||||
{
|
||||
await SeedDue("t-1", status: TaskItemStatus.Blocked, blockedBy: ["t-0"]);
|
||||
var dispatcher = new FakeDispatcher();
|
||||
@@ -105,7 +105,7 @@ public sealed class TaskScannerTests : IDisposable
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Eine_Aufgabe_fuer_einen_Menschen_wird_nicht_angestossen()
|
||||
public async Task A_task_for_a_human_is_not_triggered()
|
||||
{
|
||||
await SeedDue("t-1", assignee: "@human");
|
||||
var dispatcher = new FakeDispatcher();
|
||||
@@ -118,7 +118,7 @@ public sealed class TaskScannerTests : IDisposable
|
||||
// ─── Invariant 3: double tick = one run ───
|
||||
|
||||
[Fact]
|
||||
public async Task Zwei_gleichzeitige_Takte_stossen_eine_Aufgabe_nur_einmal_an()
|
||||
public async Task Two_concurrent_ticks_trigger_a_task_only_once()
|
||||
{
|
||||
for (var round = 0; round < 20; round++)
|
||||
{
|
||||
@@ -138,7 +138,7 @@ public sealed class TaskScannerTests : IDisposable
|
||||
// ─── Recurring tasks (replaces the legacy scheduler) ───
|
||||
|
||||
[Fact]
|
||||
public async Task Ein_wiederkehrender_Task_bleibt_nach_dem_Feuern_auf_todo()
|
||||
public async Task A_recurring_task_stays_on_todo_after_firing()
|
||||
{
|
||||
_clock.SetUtcNow(new DateTimeOffset(2027, 1, 1, 9, 0, 0, TimeSpan.Zero));
|
||||
await _repo.UpsertAsync(new TaskItem
|
||||
@@ -154,7 +154,7 @@ public sealed class TaskScannerTests : IDisposable
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Ein_wiederkehrender_Task_feuert_an_jedem_Termin_erneut()
|
||||
public async Task A_recurring_task_fires_again_at_every_occurrence()
|
||||
{
|
||||
await _repo.UpsertAsync(new TaskItem
|
||||
{
|
||||
@@ -174,7 +174,7 @@ public sealed class TaskScannerTests : IDisposable
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Ein_backlog_Task_wird_nicht_ausgefuehrt()
|
||||
public async Task A_backlog_task_is_not_executed()
|
||||
{
|
||||
await SeedDue("t-1", status: TaskItemStatus.Backlog);
|
||||
var dispatcher = new FakeDispatcher();
|
||||
@@ -186,7 +186,7 @@ public sealed class TaskScannerTests : IDisposable
|
||||
// ─── C1 hook: market calendar ───
|
||||
|
||||
[Fact]
|
||||
public async Task Bei_geschlossenem_Markt_bleibt_ein_marktabhaengiger_Termin_liegen()
|
||||
public async Task With_the_market_closed_a_market_dependent_schedule_waits()
|
||||
{
|
||||
await SeedDue("t-1", onlyWhenMarketOpen: true);
|
||||
var dispatcher = new FakeDispatcher();
|
||||
@@ -201,7 +201,7 @@ public sealed class TaskScannerTests : IDisposable
|
||||
// ─── Auto-dispatch: blocker done → waiting ones released ───
|
||||
|
||||
[Fact]
|
||||
public async Task Wird_der_letzte_Blocker_fertig_gibt_das_die_wartende_Aufgabe_frei()
|
||||
public async Task When_the_last_blocker_is_done_the_waiting_task_is_released()
|
||||
{
|
||||
await SeedDue("t-blocker");
|
||||
await SeedDue("t-wartend", status: TaskItemStatus.Blocked, blockedBy: ["t-blocker"]);
|
||||
@@ -214,7 +214,7 @@ public sealed class TaskScannerTests : IDisposable
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Solange_ein_Blocker_offen_ist_bleibt_die_wartende_Aufgabe_blockiert()
|
||||
public async Task While_a_blocker_is_open_the_waiting_task_stays_blocked()
|
||||
{
|
||||
await SeedDue("t-b1"); // finishes in this tick
|
||||
await SeedDue("t-b2", assignee: "@human"); // a human — stays open
|
||||
@@ -229,10 +229,10 @@ public sealed class TaskScannerTests : IDisposable
|
||||
// ─── #643: tasks that did not run ───
|
||||
|
||||
[Fact]
|
||||
public async Task Eine_einmalige_Aufgabe_ohne_Budget_bleibt_faellig_statt_liegenzubleiben()
|
||||
public async Task A_one_off_task_without_budget_stays_due_instead_of_being_dropped()
|
||||
{
|
||||
await _repo.UpsertAsync(new TaskItem { Id = "t-einmal", Title = "einmal", Assignee = "@new:a", Status = TaskItemStatus.Todo }, default);
|
||||
var dispatcher = new FakeDispatcher { Ergebnis = TaskLauf.NichtGelaufen };
|
||||
var dispatcher = new FakeDispatcher { Ergebnis = DispatchOutcome.NichtGelaufen };
|
||||
var scanner = Scanner(dispatcher);
|
||||
|
||||
(await scanner.ScanOnceAsync(default)).ShouldBe(1);
|
||||
@@ -243,14 +243,14 @@ public sealed class TaskScannerTests : IDisposable
|
||||
|
||||
(await scanner.ScanOnceAsync(default)).ShouldBe(0, "Wiedervorlage erst nach der Pause, nicht im Minutentakt");
|
||||
|
||||
_clock.Advance(TaskScanner.Wiedervorlage + TimeSpan.FromMinutes(1));
|
||||
dispatcher.Ergebnis = TaskLauf.Erledigt;
|
||||
_clock.Advance(TaskScanner.RetryDelay + TimeSpan.FromMinutes(1));
|
||||
dispatcher.Ergebnis = DispatchOutcome.Erledigt;
|
||||
(await scanner.ScanOnceAsync(default)).ShouldBe(1);
|
||||
(await _repo.GetAsync("t-einmal", default))!.Status.ShouldBe(TaskItemStatus.Done);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Eine_gescheiterte_einmalige_Aufgabe_bleibt_verbraucht()
|
||||
public async Task A_failed_one_off_task_stays_used_up()
|
||||
{
|
||||
await _repo.UpsertAsync(new TaskItem { Id = "t-kaputt", Title = "kaputt", Assignee = "@new:a", Status = TaskItemStatus.Todo }, default);
|
||||
var scanner = Scanner(new FakeDispatcher(succeed: false));
|
||||
@@ -267,13 +267,13 @@ public sealed class TaskScannerTests : IDisposable
|
||||
private readonly Lock _lock = new();
|
||||
public List<string> Dispatched { get; } = [];
|
||||
|
||||
public TaskLauf? Ergebnis { get; set; }
|
||||
public DispatchOutcome? Ergebnis { get; set; }
|
||||
|
||||
public Task<TaskLauf> DispatchAsync(TaskItem task, CancellationToken ct)
|
||||
public Task<DispatchOutcome> DispatchAsync(TaskItem task, CancellationToken ct)
|
||||
{
|
||||
lock (_lock)
|
||||
Dispatched.Add(task.Id);
|
||||
return Task.FromResult(Ergebnis ?? (succeed ? TaskLauf.Erledigt : TaskLauf.Gescheitert));
|
||||
return Task.FromResult(Ergebnis ?? (succeed ? DispatchOutcome.Erledigt : DispatchOutcome.Gescheitert));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user