File: Tooltip\DocCommentHelperTests.cs
Web Access
Project: src\src\Razor\src\Razor\test\Microsoft.CodeAnalysis.Razor.Workspaces.UnitTests\Microsoft.CodeAnalysis.Razor.Workspaces.UnitTests.csproj (Microsoft.CodeAnalysis.Razor.Workspaces.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.AspNetCore.Razor.Test.Common;
using Xunit;
using Xunit.Abstractions;
 
namespace Microsoft.CodeAnalysis.Razor.Tooltip;
 
public class DocCommentHelperTests(ITestOutputHelper testOutput) : ToolingTestBase(testOutput)
{
    [Fact]
    public void ReduceTypeName_Plain()
    {
        // Arrange
        var content = "Microsoft.AspNetCore.SomeTagHelpers.SomeTypeName";
 
        // Act
        var reduced = DocCommentHelpers.ReduceTypeName(content);
 
        // Assert
        Assert.Equal("SomeTypeName", reduced);
    }
 
    [Fact]
    public void ReduceTypeName_Generics()
    {
        // Arrange
        var content = "System.Collections.Generic.List<System.String>";
 
        // Act
        var reduced = DocCommentHelpers.ReduceTypeName(content);
 
        // Assert
        Assert.Equal("List<System.String>", reduced);
    }
 
    [Fact]
    public void ReduceTypeName_CrefGenerics()
    {
        // Arrange
        var content = "System.Collections.Generic.List{System.String}";
 
        // Act
        var reduced = DocCommentHelpers.ReduceTypeName(content);
 
        // Assert
        Assert.Equal("List{System.String}", reduced);
    }
 
    [Fact]
    public void ReduceTypeName_NestedGenerics()
    {
        // Arrange
        var content = "Microsoft.AspNetCore.SometTagHelpers.SomeType<Foo.Bar<Baz.Phi>>";
 
        // Act
        var reduced = DocCommentHelpers.ReduceTypeName(content);
 
        // Assert
        Assert.Equal("SomeType<Foo.Bar<Baz.Phi>>", reduced);
    }
 
    [Theory]
    [InlineData("Microsoft.AspNetCore.SometTagHelpers.SomeType.Foo.Bar<Baz.Phi>>")]
    [InlineData("Microsoft.AspNetCore.SometTagHelpers.SomeType.Foo.Bar{Baz.Phi}}")]
    public void ReduceTypeName_UnbalancedDocs_NotRecoverable_ReturnsOriginalContent(string content)
    {
        // Arrange
 
        // Act
        var reduced = DocCommentHelpers.ReduceTypeName(content);
 
        // Assert
        Assert.Equal(content, reduced);
    }
 
    [Fact]
    public void ReduceMemberName_Plain()
    {
        // Arrange
        var content = "Microsoft.AspNetCore.SometTagHelpers.SomeType.SomeProperty";
 
        // Act
        var reduced = DocCommentHelpers.ReduceMemberName(content);
 
        // Assert
        Assert.Equal("SomeType.SomeProperty", reduced);
    }
 
    [Fact]
    public void ReduceMemberName_Generics()
    {
        // Arrange
        var content = "Microsoft.AspNetCore.SometTagHelpers.SomeType<Foo.Bar>.SomeProperty<Foo.Bar>";
 
        // Act
        var reduced = DocCommentHelpers.ReduceMemberName(content);
 
        // Assert
        Assert.Equal("SomeType<Foo.Bar>.SomeProperty<Foo.Bar>", reduced);
    }
 
    [Fact]
    public void ReduceMemberName_CrefGenerics()
    {
        // Arrange
        var content = "Microsoft.AspNetCore.SometTagHelpers.SomeType{Foo.Bar}.SomeProperty{Foo.Bar}";
 
        // Act
        var reduced = DocCommentHelpers.ReduceMemberName(content);
 
        // Assert
        Assert.Equal("SomeType{Foo.Bar}.SomeProperty{Foo.Bar}", reduced);
    }
 
    [Fact]
    public void ReduceMemberName_NestedGenericsMethodsTypes()
    {
        // Arrange
        var content = "Microsoft.AspNetCore.SometTagHelpers.SomeType<Foo.Bar<Baz,Fi>>.SomeMethod(Foo.Bar<System.String>,Baz<Something>.Fi)";
 
        // Act
        var reduced = DocCommentHelpers.ReduceMemberName(content);
 
        // Assert
        Assert.Equal("SomeType<Foo.Bar<Baz,Fi>>.SomeMethod(Foo.Bar<System.String>,Baz<Something>.Fi)", reduced);
    }
 
    [Theory]
    [InlineData("Microsoft.AspNetCore.SometTagHelpers.SomeType.Foo.Bar<Baz.Phi>>")]
    [InlineData("Microsoft.AspNetCore.SometTagHelpers.SomeType.Foo.Bar{Baz.Phi}}")]
    [InlineData("Microsoft.AspNetCore.SometTagHelpers.SomeType.Foo.Bar(Baz.Phi))")]
    [InlineData("Microsoft.AspNetCore.SometTagHelpers.SomeType.Foo{.>")]
    public void ReduceMemberName_UnbalancedDocs_NotRecoverable_ReturnsOriginalContent(string content)
    {
        // Arrange
 
        // Act
        var reduced = DocCommentHelpers.ReduceMemberName(content);
 
        // Assert
        Assert.Equal(content, reduced);
    }
 
    [Fact]
    public void ReduceCrefValue_InvalidShortValue_ReturnsEmptyString()
    {
        // Arrange
        var content = "T:";
 
        // Act
        var value = DocCommentHelpers.ReduceCrefValue(content);
 
        // Assert
        Assert.Equal(string.Empty, value);
    }
 
    [Fact]
    public void ReduceCrefValue_InvalidUnknownIdentifierValue_ReturnsEmptyString()
    {
        // Arrange
        var content = "X:";
 
        // Act
        var value = DocCommentHelpers.ReduceCrefValue(content);
 
        // Assert
        Assert.Equal(string.Empty, value);
    }
 
    [Fact]
    public void ReduceCrefValue_Type()
    {
        // Arrange
        var content = "T:Microsoft.AspNetCore.SometTagHelpers.SomeType";
 
        // Act
        var value = DocCommentHelpers.ReduceCrefValue(content);
 
        // Assert
        Assert.Equal("SomeType", value);
    }
 
    [Fact]
    public void ReduceCrefValue_Property()
    {
        // Arrange
        var content = "P:Microsoft.AspNetCore.SometTagHelpers.SomeType.SomeProperty";
 
        // Act
        var value = DocCommentHelpers.ReduceCrefValue(content);
 
        // Assert
        Assert.Equal("SomeType.SomeProperty", value);
    }
 
    [Fact]
    public void ReduceCrefValue_Member()
    {
        // Arrange
        var content = "P:Microsoft.AspNetCore.SometTagHelpers.SomeType.SomeMember";
 
        // Act
        var value = DocCommentHelpers.ReduceCrefValue(content);
 
        // Assert
        Assert.Equal("SomeType.SomeMember", value);
    }
 
    [Fact]
    public void TryExtractSummary_Null_ReturnsFalse()
    {
        // Arrange & Act
        var result = DocCommentHelpers.TryExtractSummary(documentation: null, out var summary);
 
        // Assert
        Assert.False(result);
        Assert.Null(summary);
    }
 
    [Fact]
    public void TryExtractSummary_ExtractsSummary_ReturnsTrue()
    {
        // Arrange
        var expectedSummary = " Hello World ";
        var documentation = $@"
Prefixed invalid content
 
 
<summary>{expectedSummary}</summary>
 
Suffixed invalid content";
 
        // Act
        var result = DocCommentHelpers.TryExtractSummary(documentation, out var summary);
 
        // Assert
        Assert.True(result);
        Assert.Equal(expectedSummary, summary);
    }
 
    [Fact]
    public void TryExtractSummary_NoStartSummary_ReturnsFalse()
    {
        // Arrange
        var documentation = @"
Prefixed invalid content
 
 
</summary>
 
Suffixed invalid content";
 
        // Act
        var result = DocCommentHelpers.TryExtractSummary(documentation, out var summary);
 
        // Assert
        Assert.True(result);
        Assert.Equal(@"Prefixed invalid content
 
 
</summary>
 
Suffixed invalid content", summary);
    }
 
    [Fact]
    public void TryExtractSummary_NoEndSummary_ReturnsTrue()
    {
        // Arrange
        var documentation = @"
Prefixed invalid content
 
 
<summary>
 
Suffixed invalid content";
 
        // Act
        var result = DocCommentHelpers.TryExtractSummary(documentation, out var summary);
 
        // Assert
        Assert.True(result);
        Assert.Equal(@"Prefixed invalid content
 
 
<summary>
 
Suffixed invalid content", summary);
    }
 
    [Fact]
    public void TryExtractSummary_XMLButNoSummary_ReturnsFalse()
    {
        // Arrange
        var documentation = @"
<param type=""stuff"">param1</param>
<return>Result</return>
";
 
        // Act
        var result = DocCommentHelpers.TryExtractSummary(documentation, out var summary);
 
        // Assert
        Assert.False(result);
        Assert.Null(summary);
    }
 
    [Fact]
    public void TryExtractSummary_NoXml_ReturnsTrue()
    {
        // Arrange
        var documentation = @"
There is no xml, but I got you this < and the >.
";
 
        // Act
        var result = DocCommentHelpers.TryExtractSummary(documentation, out var summary);
 
        // Assert
        Assert.True(result);
        Assert.Equal("There is no xml, but I got you this < and the >.", summary);
    }
}