| File: CoalesceAnalyzerTests.cs | Web Access |
| Project: src\test\Analyzers\Microsoft.Analyzers.Extra.Tests\Microsoft.Analyzers.Extra.Tests.csproj (Microsoft.Analyzers.Extra.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.Threading.Tasks; using Xunit; namespace Microsoft.Extensions.ExtraAnalyzers.Test; public static class CoalesceAnalyzerTests { [Fact] public static async Task CoalesceAssignmentWithTask() { const string Source = @" using System; using System.Threading.Tasks; namespace Example { public class Foo { } public class Test { public async Task<DateTime?> GetDate() { return await GetSomething() ?? await GetSomethingElse(); } private Task<DateTime?> GetSomething() { return Task.FromResult((DateTime?)DateTime.Now); } private Task<DateTime?> GetSomethingElse() { return Task.FromResult((DateTime?)DateTime.Now); } } } "; var d = await RoslynTestUtils.RunAnalyzer( new CoalesceAnalyzer(), null, new[] { Source }); Assert.Empty(d); } [Fact] public static async Task CoalesceAssignment() { const string Source = @" using System.Diagnostics.CodeAnalysis; namespace Example { public class Foo { } public class Test { public Foo? NullableFooProp { get; set; } public Foo FooProp { get; set; } = new Foo(); [MaybeNull] public Foo FooPropMaybeNull { get; set; } = new Foo(); public Foo? NullableFooField; public Foo FooField = new Foo(); [MaybeNull] public Foo FooFieldMaybeNull = new Foo(); public void Method() { string s = ""Hello""; /*0+*/s ??= ""World""/*-0*/; NullableFooProp ??= new Foo(); /*1+*/FooProp ??= new Foo()/*-1*/; FooPropMaybeNull ??= new Foo(); NullableFooField ??= new Foo(); /*2+*/FooField ??= new Foo()/*-2*/; FooFieldMaybeNull ??= new Foo(); Foo? nullableFooLocal = null; Foo fooLocal = new Foo(); nullableFooLocal ??= new Foo(); /*3+*/fooLocal ??= new Foo()/*-3*/; } } } "; var d = await RoslynTestUtils.RunAnalyzer( new CoalesceAnalyzer(), null, new[] { Source }); Assert.Equal(4, d.Count); for (int i = 0; i < d.Count; i++) { Source.AssertDiagnostic(i, DiagDescriptors.CoalesceAssignment, d[i]); } } [Fact] public static async Task Coalesce() { const string Source = @" using System.Diagnostics.CodeAnalysis; namespace Example { public class Foo { } public class Test { public Foo? NullableFooProp { get; set; } public Foo FooProp { get; set; } = new Foo(); [MaybeNull] public Foo FooPropMaybeNull { get; set; } = new Foo(); public Foo? NullableFooField; public Foo FooField = new Foo(); [MaybeNull] public Foo FooFieldMaybeNull = new Foo(); public Foo? NullableFooMethod() => new Foo(); public Foo FooMethod() => new Foo(); [return: MaybeNull] public Foo FooMethodMaybeNull() => new Foo(); public void Method() { string s = ""Hello""; _ = /*0+*/s ?? ""World""/*-0*/; _ = NullableFooProp ?? new Foo(); _ = /*1+*/FooProp ?? new Foo()/*-1*/; _ = FooPropMaybeNull ?? new Foo(); _ = NullableFooField ?? new Foo(); _ = /*2+*/FooField ?? new Foo()/*-2*/; _ = FooFieldMaybeNull ?? new Foo(); _ = NullableFooMethod() ?? new Foo(); _ = /*3+*/FooMethod() ?? new Foo()/*-3*/; _ = FooMethodMaybeNull() ?? new Foo(); Foo? nullableFooLocal = null; Foo fooLocal = new Foo(); _ = nullableFooLocal ?? new Foo(); _ = /*4+*/fooLocal ?? new Foo()/*-4*/; } } } "; var d = await RoslynTestUtils.RunAnalyzer( new CoalesceAnalyzer(), null, new[] { Source }); Assert.Equal(5, d.Count); for (int i = 0; i < d.Count; i++) { Source.AssertDiagnostic(i, DiagDescriptors.Coalesce, d[i]); } } }