| File: SyntaxContextReceiverTests.cs | Web Access |
| Project: src\test\Generators\Microsoft.Gen.ContextualOptions\Unit\Microsoft.Gen.ContextualOptions.Unit.Tests.csproj (Microsoft.Gen.ContextualOptions.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.IO; using System.Linq; using System.Reflection; using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.Extensions.Options.Contextual; using Microsoft.Gen.Shared; using Xunit; namespace Microsoft.Gen.ContextualOptions.Test; public class SyntaxContextReceiverTests { [Fact] public async Task ShouldCollectTypesWithTheOptionsContextAttribute() { var sut = new ContextReceiver(CancellationToken.None); var sources = new[] { File.ReadAllText("TestClasses/Class1.cs"), File.ReadAllText("TestClasses/Struct1.cs"), File.ReadAllText("TestClasses/Record1.cs"), }; var comp = await RoslynTestUtils.RunSyntaxContextReceiver(sut, new[] { typeof(OptionsContextAttribute).Assembly }, sources).ConfigureAwait(true); Assert.True(sut.TryGetTypeDeclarations(comp, out var typeDeclarations)); Assert.Equal(3, typeDeclarations!.Count); foreach (var declaration in typeDeclarations) { Assert.Equal(declaration.Key.Name, declaration.Value.Single().Identifier.Text); Assert.Equal("TestClasses", declaration.Key.ContainingNamespace.ToString()); } } [Fact] public async Task ShouldDoNothingWithoutTheOptionsContextAttributeReferenced() { var sut = new ContextReceiver(CancellationToken.None); var sources = new[] { File.ReadAllText("TestClasses/Class1.cs"), File.ReadAllText("TestClasses/Struct1.cs"), File.ReadAllText("TestClasses/Record1.cs"), }; var comp = await RoslynTestUtils.RunSyntaxContextReceiver(sut, Enumerable.Empty<Assembly>(), sources).ConfigureAwait(true); Assert.False(sut.TryGetTypeDeclarations(comp, out _)); } [Fact] public async Task ShouldCollectMultiFileTypesWithTheOptionsContextAttribute() { var sut = new ContextReceiver(CancellationToken.None); var sources = new[] { File.ReadAllText("TestClasses/Class2A.cs"), File.ReadAllText("TestClasses/Class2B.cs"), }; var comp = await RoslynTestUtils.RunSyntaxContextReceiver(sut, new[] { typeof(OptionsContextAttribute).Assembly }, sources).ConfigureAwait(true); Assert.True(sut.TryGetTypeDeclarations(comp, out var typeDeclarations)); Assert.Single(typeDeclarations!); var declaration = typeDeclarations!.Single(); Assert.Equal("TestClasses", declaration.Key.ContainingNamespace.ToString()); Assert.Equal(2, declaration.Value.Count); Assert.All(declaration.Value.Select(dec => dec.Identifier.Text), className => Assert.Equal("Class2", className)); Assert.NotEqual(declaration.Value[0], declaration.Value[1]); } [Fact] public async Task ShouldIgnoreTypesWithoutTheOptionsContextAttribute() { var sut = new ContextReceiver(CancellationToken.None); var sources = new[] { File.ReadAllText("TestClasses/ClassWithNoAttribute.cs"), }; var comp = await RoslynTestUtils.RunSyntaxContextReceiver(sut, new[] { typeof(OptionsContextAttribute).Assembly }, sources).ConfigureAwait(true); Assert.True(sut.TryGetTypeDeclarations(comp, out var typeDeclarations)); Assert.Empty(typeDeclarations!); } }