Forge
csharp4405de34
1using CascadeIDE.Features.Chat;
2using CascadeIDE.Models.AgentChat;
3using Xunit;
4
5namespace CascadeIDE.Tests;
6
7public sealed class ChatThreadForkProjectorTests
8{
9 [Fact]
10 public void Project_ReadsTypedThreadForkedPayload()
11 {
12 var newId = Guid.NewGuid();
13 var prevId = Guid.NewGuid();
14 var payload = ChatHistoryPayloadMapping.ToThreadForkedPayload(newId, prevId, null);
15 var events = new[]
16 {
17 new ChatHistoryEvent(
18 Guid.NewGuid(),
19 Guid.NewGuid(),
20 DateTimeOffset.UtcNow,
21 ChatHistoryEventKind.ThreadForked,
22 ChatHistoryJson.Serialize(payload)),
23 };
24
25 var forks = ChatThreadForkProjector.Project(events);
26 var fork = Assert.Single(forks);
27 Assert.Equal(newId, fork.NewThreadId);
28 Assert.Equal(prevId, fork.PreviousThreadId);
29 }
30
31 [Fact]
32 public void Project_DedupesDuplicateNewThreadIds()
33 {
34 var id = Guid.NewGuid();
35 var a = Guid.NewGuid();
36 var b = Guid.NewGuid();
37 var events = new[]
38 {
39 ForkEvent(id, a),
40 ForkEvent(id, b),
41 };
42
43 var forks = ChatThreadForkProjector.Project(events);
44 var fork = Assert.Single(forks);
45 Assert.Equal(b, fork.PreviousThreadId);
46 }
47
48 [Fact]
49 public void DedupeByNewThread_KeepsLastForkPerBranch()
50 {
51 var id = Guid.NewGuid();
52 var first = new ChatThreadForkRecord(id, Guid.NewGuid(), null);
53 var second = new ChatThreadForkRecord(id, Guid.NewGuid(), Guid.NewGuid());
54
55 var deduped = ChatThreadForkProjector.DedupeByNewThread([first, second]);
56 var fork = Assert.Single(deduped);
57 Assert.Equal(second.PreviousThreadId, fork.PreviousThreadId);
58 }
59
60 private static ChatHistoryEvent ForkEvent(Guid newId, Guid previousId)
61 {
62 var payload = ChatHistoryPayloadMapping.ToThreadForkedPayload(newId, previousId, null);
63 return new ChatHistoryEvent(
64 Guid.NewGuid(),
65 Guid.NewGuid(),
66 DateTimeOffset.UtcNow,
67 ChatHistoryEventKind.ThreadForked,
68 ChatHistoryJson.Serialize(payload));
69 }
70}
71
View only · write via MCP/CIDE