Name Message Date
📄 AnalyzeShould.cs One-shot 5 days ago
📄 core/tests/AnalyzerTests/AnalyzeShould.cs
using System.Collections.Immutable;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Shouldly;
using Xunit;

namespace Cfa.Tests.AnalyzerTests;

public sealed class AnalyzeShould
{
    [Fact]
    public void KeepTheOriginWhenItsCallsLeadBackToIt()
    {
        // Arrange
        var compilation = CSharpCompilation.Create(
            "Example",
            [CSharpSyntaxTree.ParseText("class Example { void Start() { Start(); } }")],
            [MetadataReference.CreateFromFile(typeof(object).Assembly.Location)]
        );
        var origin = compilation.GetTypeByMetadataName("Example")!.GetMembers("Start").Single();
        var calls = ImmutableDictionary.CreateBuilder<ISymbol, IImmutableList<Call>>(SymbolEqualityComparer.Default);
        calls[origin] = [new(origin, LinkKind.Direct)];
        var graph = new CallGraph(
            origin,
            calls.ToImmutable(),
            ImmutableDictionary.Create<ISymbol, IImmutableList<Call>>(SymbolEqualityComparer.Default)
        );

        // Act
        var analysis = Analyzer.Analyze(graph);

        // Assert
        analysis.Appearances[origin].ShouldBe(1u);
        analysis.CallsTo[origin].ShouldHaveSingleItem().Target.ShouldBe(origin);
    }
}