| 1 | using CascadeIDE.Models.Forge; |
| 2 | using CascadeIDE.Features.Forge.Infrastructure; |
| 3 | using Xunit; |
| 4 | |
| 5 | namespace CascadeIDE.Tests; |
| 6 | |
| 7 | public sealed class BracketForgeReferenceParserTests |
| 8 | { |
| 9 | [Theory] |
| 10 | [InlineData("[FRG:pilot/issues/7]", "pilot", ForgeArtifactKind.Issue, 7)] |
| 11 | [InlineData("[FRG:cad-tools/mr/3]", "cad-tools", ForgeArtifactKind.MergeRequest, 3)] |
| 12 | public void Parses_issue_and_mr(string bracket, string repo, ForgeArtifactKind kind, int number) |
| 13 | { |
| 14 | Assert.True(BracketForgeReferenceParser.TryParse(bracket, out var artifact, out var error), error); |
| 15 | Assert.Equal(repo, artifact.Repo); |
| 16 | Assert.Equal(kind, artifact.Kind); |
| 17 | Assert.Equal(number, artifact.Number); |
| 18 | Assert.Null(artifact.CodeBracket); |
| 19 | } |
| 20 | |
| 21 | [Fact] |
| 22 | public void Parses_compound_code_tail() |
| 23 | { |
| 24 | const string bracket = "[FRG:pilot/issues/7; F:src/Foo.cs; L:10]"; |
| 25 | Assert.True(BracketForgeReferenceParser.TryParse(bracket, out var artifact, out var error), error); |
| 26 | Assert.Equal("pilot", artifact.Repo); |
| 27 | Assert.Equal(ForgeArtifactKind.Issue, artifact.Kind); |
| 28 | Assert.Equal(7, artifact.Number); |
| 29 | Assert.Contains("F:src/Foo.cs", artifact.CodeBracket, StringComparison.Ordinal); |
| 30 | } |
| 31 | |
| 32 | [Fact] |
| 33 | public void Facade_discriminates_forge_vs_code() |
| 34 | { |
| 35 | Assert.True(BracketReferenceParser.TryParse("[FRG:pilot/issues/1]", out var kind, out var forge, out _, out _)); |
| 36 | Assert.Equal(BracketReferenceKind.Forge, kind); |
| 37 | Assert.Equal("pilot", forge.Repo); |
| 38 | |
| 39 | Assert.True(BracketReferenceParser.TryParse("[F:src/A.cs; L:1]", out kind, out _, out var code, out _)); |
| 40 | Assert.Equal(BracketReferenceKind.Code, kind); |
| 41 | Assert.Equal("src/A.cs", code.File); |
| 42 | } |
| 43 | } |
| 44 | |