Forge
csharpdeeb25a2
1using CascadeIDE.Features.Chat;
2using Xunit;
3
4namespace CascadeIDE.Tests;
5
6public sealed class ParametricSegmentListParserTests
7{
8 [Theory]
9 [InlineData("5", 1, 5, 5)]
10 [InlineData("5 10", 1, 5, 10)]
11 [InlineData("5:10", 1, 5, 10)]
12 [InlineData("5;10", 1, 5, 10)]
13 public void TryParse_LegacySingleContiguous(string tail, int count, int start, int end)
14 {
15 Assert.True(ParametricSegmentListParser.TryParse(tail, out var segments, out var error), error);
16 Assert.Equal(count, segments.Count);
17 Assert.Equal(start, segments[0].Start);
18 Assert.Equal(end, segments[0].End);
19 }
20
21 [Fact]
22 public void TryParse_BracketDisjointSegments()
23 {
24 Assert.True(ParametricSegmentListParser.TryParse("[3;5] [8;15] [20]", out var segments, out var error), error);
25 Assert.Equal(3, segments.Count);
26 Assert.Equal(3, segments[0].Start);
27 Assert.Equal(5, segments[0].End);
28 Assert.Equal(8, segments[1].Start);
29 Assert.Equal(15, segments[1].End);
30 Assert.Equal(20, segments[2].Start);
31 Assert.Equal(20, segments[2].End);
32 }
33
34 [Fact]
35 public void TryParse_BracketSingleLine()
36 {
37 Assert.True(ParametricSegmentListParser.TryParse("[20]", out var segments, out _));
38 Assert.Single(segments);
39 Assert.Equal(20, segments[0].Start);
40 Assert.Equal(20, segments[0].End);
41 }
42
43 [Fact]
44 public void TryParse_RejectsLegacyMixedWithBrackets()
45 {
46 Assert.False(ParametricSegmentListParser.TryParse("3:5 [8;15]", out _, out var error));
47 Assert.Contains("скобках", error, StringComparison.Ordinal);
48 }
49
50 [Fact]
51 public void TryParseSingleContiguous_RejectsDisjoint()
52 {
53 Assert.False(ParametricSegmentListParser.TryParseSingleContiguous("[3;5] [8;15]", out _, out var error));
54 Assert.Contains("disjoint", error, StringComparison.OrdinalIgnoreCase);
55 }
56
57 [Fact]
58 public void TryParseLineRangeTail_RejectsThreeTokens_Still()
59 {
60 Assert.False(ChatSlashParametricArgsBuilder.TryParseLineRangeTail("3 5 7", out _, out _, out var error));
61 Assert.Contains("Ожидается", error);
62 }
63
64 [Fact]
65 public void FormatSummary_MultiSegment()
66 {
67 var segments = new[]
68 {
69 new ParametricIntRange(3, 5),
70 new ParametricIntRange(8, 15),
71 new ParametricIntRange(20, 20),
72 };
73 var summary = ParametricSegmentListParser.FormatSummary(segments, "Строки");
74 Assert.Contains("3–5", summary);
75 Assert.Contains("8–15", summary);
76 Assert.Contains("20", summary);
77 Assert.Contains("12", summary);
78 Assert.Contains("строк", summary);
79 }
80
81 [Fact]
82 public void SlashCommandPreviewEvaluator_MessageSelect()
83 {
84 Assert.True(SlashCommandPreviewEvaluator.TryEvaluateSummary(
85 "/intercom message select [3;5] [8;15] [20]",
86 out var summary));
87 Assert.Contains("Сообщения", summary);
88 Assert.Contains("3–5", summary);
89 }
90}
91
View only · write via MCP/CIDE