using Agent.Core.Tasks; namespace Agent.Core.Tests; public sealed class TaskRegistryTests { [Fact] public async Task Explicit_task_id_can_be_cancelled_and_observed_as_terminal() { var registry = new TaskRegistry(); Guid taskId = Guid.NewGuid(); TaskSnapshot queued = registry.Enqueue("work", null, null, requestedTaskId: taskId); Assert.Equal(taskId, queued.TaskId); Assert.True(registry.Cancel(taskId)); TaskSnapshot terminal = await registry.WaitForTerminalAsync(taskId, TestContext.Current.CancellationToken); Assert.Equal(AgentTaskState.Cancelled, terminal.State); Assert.True(registry.GetCancellationToken(taskId).IsCancellationRequested); } [Fact] public void NewTaskGetsUniqueTaskAndSessionIds() { var registry = new TaskRegistry(); TaskSnapshot first = registry.Enqueue("one", null, null); TaskSnapshot second = registry.Enqueue("two", null, 0.2); Assert.NotEqual(first.TaskId, second.TaskId); Assert.NotEqual(first.SessionId, second.SessionId); Assert.Equal(AgentTaskState.Queued, first.State); } [Fact] public void UnknownSessionIsRejected() { var registry = new TaskRegistry(); Assert.Throws(() => registry.Enqueue("request", Guid.NewGuid(), null)); } [Fact] public void TerminalTaskCannotTransition() { var registry = new TaskRegistry(); TaskSnapshot task = registry.Enqueue("request", null, null); Assert.True(registry.Transition(task.TaskId, AgentTaskState.Planning)); Assert.True(registry.Transition(task.TaskId, AgentTaskState.Running)); Assert.True(registry.Transition(task.TaskId, AgentTaskState.Completed)); Assert.False(registry.Transition(task.TaskId, AgentTaskState.Running)); } }