File: VirtualizeItemComparerAnalyzerTest.cs
Web Access
Project: src\src\Components\Analyzers\test\Microsoft.AspNetCore.Components.Analyzers.Tests.csproj (Microsoft.AspNetCore.Components.Analyzers.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Diagnostics;
using TestHelper;
 
namespace Microsoft.AspNetCore.Components.Analyzers.Test;
 
public class VirtualizeItemComparerAnalyzerTest : DiagnosticVerifier
{
    protected override DiagnosticAnalyzer GetCSharpDiagnosticAnalyzer() => new VirtualizeItemComparerAnalyzer();
 
    private static readonly string VirtualizeDeclarations = @"
    namespace Microsoft.AspNetCore.Components.Rendering
    {
        public class RenderTreeBuilder
        {
            public void OpenComponent<TComponent>(int sequence) where TComponent : IComponent { }
            public void AddComponentParameter(int sequence, string name, object value) { }
            public void CloseComponent() { }
        }
    }
 
    namespace Microsoft.AspNetCore.Components
    {
        public interface IComponent { }
    }
 
    namespace Microsoft.AspNetCore.Components.Web.Virtualization
    {
        public class Virtualize<TItem> : Microsoft.AspNetCore.Components.IComponent
        {
            public object ItemsProvider { get; set; }
            public object Items { get; set; }
            public object ItemComparer { get; set; }
            public float ItemSize { get; set; }
        }
 
        public delegate System.Threading.Tasks.ValueTask<ItemsProviderResult<TItem>> ItemsProviderDelegate<TItem>(ItemsProviderRequest request);
 
        public struct ItemsProviderRequest { }
        public struct ItemsProviderResult<TItem> { }
    }
";
 
    [Fact]
    public void ItemsProviderWithoutItemComparer_ReportsDiagnostic()
    {
        var test = @"
    namespace ConsoleApplication1
    {
        using Microsoft.AspNetCore.Components.Rendering;
        using Microsoft.AspNetCore.Components.Web.Virtualization;
 
        class TestComponent
        {
            void BuildRenderTree(RenderTreeBuilder __builder)
            {
                __builder.OpenComponent<Virtualize<string>>(0);
                __builder.AddComponentParameter(1, ""ItemsProvider"", (object)null);
                __builder.AddComponentParameter(2, ""ItemSize"", (object)50f);
                __builder.CloseComponent();
            }
        }
    }" + VirtualizeDeclarations;
 
        VerifyCSharpDiagnostic(test,
            new DiagnosticResult
            {
                Id = DiagnosticDescriptors.VirtualizeItemsProviderRequiresItemComparer.Id,
                Message = "Virtualize uses 'ItemsProvider' without 'ItemComparer'. Set ItemComparer to an IEqualityComparer that identifies items by a unique key.",
                Severity = DiagnosticSeverity.Warning,
                Locations = new[]
                {
                    new DiagnosticResultLocation("Test0.cs", 12, 17)
                }
            });
    }
 
    [Fact]
    public void ItemsProviderWithItemComparer_NoDiagnostic()
    {
        var test = @"
    namespace ConsoleApplication1
    {
        using Microsoft.AspNetCore.Components.Rendering;
        using Microsoft.AspNetCore.Components.Web.Virtualization;
 
        class TestComponent
        {
            void BuildRenderTree(RenderTreeBuilder __builder)
            {
                __builder.OpenComponent<Virtualize<string>>(0);
                __builder.AddComponentParameter(1, ""ItemsProvider"", (object)null);
                __builder.AddComponentParameter(2, ""ItemComparer"", (object)null);
                __builder.CloseComponent();
            }
        }
    }" + VirtualizeDeclarations;
 
        VerifyCSharpDiagnostic(test);
    }
 
    [Fact]
    public void ItemsCollectionWithoutItemComparer_NoDiagnostic()
    {
        var test = @"
    namespace ConsoleApplication1
    {
        using Microsoft.AspNetCore.Components.Rendering;
        using Microsoft.AspNetCore.Components.Web.Virtualization;
 
        class TestComponent
        {
            void BuildRenderTree(RenderTreeBuilder __builder)
            {
                __builder.OpenComponent<Virtualize<string>>(0);
                __builder.AddComponentParameter(1, ""Items"", (object)null);
                __builder.CloseComponent();
            }
        }
    }" + VirtualizeDeclarations;
 
        VerifyCSharpDiagnostic(test);
    }
}