File: ParserUtilitiesTests.cs
Web Access
Project: src\test\Generators\Microsoft.Gen.Logging\Unit\Microsoft.Gen.Logging.Unit.Tests.csproj (Microsoft.Gen.Logging.Unit.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections.Immutable;
using System.Threading;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.Gen.Shared;
using Moq;
using Xunit;
 
namespace Microsoft.Gen.Logging.Test;
 
public class ParserUtilitiesTests
{
    [Fact]
    public void ShouldDetect_SymbolHasModifier()
    {
        var propertyDeclaration = SyntaxFactory.PropertyDeclaration(
            default,
            SyntaxFactory.TokenList(
                SyntaxFactory.Token(SyntaxKind.PublicKeyword),
                SyntaxFactory.Token(SyntaxKind.StaticKeyword),
                SyntaxFactory.Token(SyntaxKind.PartialKeyword)),
            SyntaxFactory.ParseTypeName("string"),
            null!,
            SyntaxFactory.Identifier("Identifier_1"),
            null!);
 
        var anotherPropertyDeclaration = SyntaxFactory.PropertyDeclaration(
            default,
            SyntaxFactory.TokenList(
                SyntaxFactory.Token(SyntaxKind.ProtectedKeyword),
                SyntaxFactory.Token(SyntaxKind.VirtualKeyword)),
            SyntaxFactory.ParseTypeName("object"),
            null!,
            SyntaxFactory.Identifier("Identifier_2"),
            null!);
 
        var syntaxReferenceMock = new Mock<SyntaxReference>();
        syntaxReferenceMock.Setup(x => x.GetSyntax(It.IsAny<CancellationToken>()))
            .Returns(propertyDeclaration);
 
        var anotherSyntaxReferenceMock = new Mock<SyntaxReference>();
        anotherSyntaxReferenceMock.Setup(x => x.GetSyntax(It.IsAny<CancellationToken>()))
            .Returns(anotherPropertyDeclaration);
 
        var symbolMock = new Mock<ISymbol>();
        symbolMock
            .SetupGet(x => x.DeclaringSyntaxReferences)
            .Returns(new[] { syntaxReferenceMock.Object, anotherSyntaxReferenceMock.Object }.ToImmutableArray());
 
        var result = ParserUtilities.PropertyHasModifier(symbolMock.Object, SyntaxKind.ProtectedKeyword, CancellationToken.None);
        Assert.True(result);
    }
 
    [Fact]
    public void ShouldDetect_SymbolHasNoModifier()
    {
        var propertyDeclaration = SyntaxFactory.FieldDeclaration(
            default,
            SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.PartialKeyword)),
            SyntaxFactory.VariableDeclaration(SyntaxFactory.ParseTypeName("string")));
 
        var syntaxReferenceMock = new Mock<SyntaxReference>();
        syntaxReferenceMock.Setup(x => x.GetSyntax(It.IsAny<CancellationToken>()))
            .Returns(propertyDeclaration);
 
        var symbolMock = new Mock<ISymbol>();
        symbolMock
            .SetupGet(x => x.DeclaringSyntaxReferences)
            .Returns(new[] { syntaxReferenceMock.Object }.ToImmutableArray());
 
        var result = ParserUtilities.PropertyHasModifier(symbolMock.Object, SyntaxKind.ProtectedKeyword, CancellationToken.None);
        Assert.False(result);
    }
 
    [Fact]
    public void ShouldGetSymbolAttributeWhenSymbolNull()
    {
        var result = ParserUtilities.GetSymbolAttributeAnnotationOrDefault(null, null!);
        Assert.Null(result);
    }
 
    [Fact]
    public void Should_ReturnNull_GetLocation()
    {
        Assert.Null(ParserUtilities.GetLocation(null!));
 
        var symbolMock = new Mock<ISymbol>();
        symbolMock.SetupGet(x => x.Locations)
            .Returns(default(ImmutableArray<Location>));
 
        Assert.Null(ParserUtilities.GetLocation(symbolMock.Object));
 
        symbolMock.SetupGet(x => x.Locations)
            .Returns(ImmutableArray<Location>.Empty);
 
        Assert.Null(ParserUtilities.GetLocation(symbolMock.Object));
    }
 
    [Fact]
    public void Should_ReturnFirstLocation_GetLocation()
    {
        var symbolMock = new Mock<ISymbol>();
        var locationMock = Mock.Of<Location>();
        symbolMock.SetupGet(x => x.Locations)
            .Returns(new[] { locationMock, Mock.Of<Location>() }.ToImmutableArray());
 
        var result = ParserUtilities.GetLocation(symbolMock.Object);
        Assert.Same(locationMock, result);
    }
}