File: Microsoft.CodeQuality.Analyzers\ApiDesignGuidelines\OverrideEqualsOnOverloadingOperatorEqualsTests.Fixer.cs
Web Access
Project: ..\..\..\src\Microsoft.CodeAnalysis.NetAnalyzers\tests\Microsoft.CodeAnalysis.NetAnalyzers.UnitTests\Microsoft.CodeAnalysis.NetAnalyzers.UnitTests.csproj (Microsoft.CodeAnalysis.NetAnalyzers.UnitTests)
// Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the MIT license.  See License.txt in the project root for license information.
 
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Xunit;
using VerifyCS = Test.Utilities.CSharpCodeFixVerifier<
    Microsoft.CodeAnalysis.Testing.EmptyDiagnosticAnalyzer, // Diagnostic is from the compiler
    Microsoft.CodeQuality.CSharp.Analyzers.ApiDesignGuidelines.CSharpOverrideEqualsOnOverloadingOperatorEqualsFixer>;
using VerifyVB = Test.Utilities.VisualBasicCodeFixVerifier<
    Microsoft.CodeQuality.VisualBasic.Analyzers.ApiDesignGuidelines.BasicOverrideEqualsOnOverloadingOperatorEqualsAnalyzer,
    Microsoft.CodeQuality.VisualBasic.Analyzers.ApiDesignGuidelines.BasicOverrideEqualsOnOverloadingOperatorEqualsFixer>;
 
namespace Microsoft.CodeQuality.Analyzers.ApiDesignGuidelines.UnitTests
{
    public class OverrideEqualsOnOverloadingOperatorEqualsFixerTests
    {
        [Fact]
        public async Task CS0660Async()
        {
            await new VerifyCS.Test
            {
                TestState =
                {
                    Sources =
                    {
                        @"
class {|CS0660:{|CS0661:C|}|}
{
    public static bool operator ==(C c1, C c2) => true;
    public static bool operator !=(C c1, C c2) => false;
}
",
                    },
                },
                FixedState =
                {
                    Sources =
                    {
                        @"
class {|CS0659:{|CS0661:C|}|}
{
    public static bool operator ==(C c1, C c2) => true;
    public static bool operator !=(C c1, C c2) => false;
 
    public override bool Equals(object obj)
    {
        if (ReferenceEquals(this, obj))
        {
            return true;
        }
 
        if (ReferenceEquals(obj, null))
        {
            return false;
        }
 
        throw new System.NotImplementedException();
    }
}
",
                    },
                },
                SolutionTransforms =
                {
                    (solution, projectId) =>
                    {
                        var compilationOptions = solution.GetProject(projectId).CompilationOptions;
                        compilationOptions = compilationOptions.WithGeneralDiagnosticOption(ReportDiagnostic.Error);
                        return solution.WithProjectCompilationOptions(projectId, compilationOptions);
                    },
                },
            }.RunAsync();
        }
 
        [Fact]
        public async Task CS0660_SimplifiedAsync()
        {
            await new VerifyCS.Test
            {
                TestState =
                {
                    Sources =
                    {
                        @"
using System;
 
class {|CS0660:{|CS0661:C|}|}
{
    public static bool operator ==(C c1, C c2) => true;
    public static bool operator !=(C c1, C c2) => false;
}
",
                    },
                },
                FixedState =
                {
                    Sources =
                    {
                        @"
using System;
 
class {|CS0659:{|CS0661:C|}|}
{
    public static bool operator ==(C c1, C c2) => true;
    public static bool operator !=(C c1, C c2) => false;
 
    public override bool Equals(object obj)
    {
        if (ReferenceEquals(this, obj))
        {
            return true;
        }
 
        if (ReferenceEquals(obj, null))
        {
            return false;
        }
 
        throw new NotImplementedException();
    }
}
",
                    },
                },
                SolutionTransforms =
                {
                    (solution, projectId) =>
                    {
                        var compilationOptions = solution.GetProject(projectId).CompilationOptions;
                        compilationOptions = compilationOptions.WithGeneralDiagnosticOption(ReportDiagnostic.Error);
                        return solution.WithProjectCompilationOptions(projectId, compilationOptions);
                    },
                },
            }.RunAsync();
        }
 
        [Fact]
        public async Task CA2224Async()
        {
            await new VerifyVB.Test
            {
                TestCode = @"
Class [|C|]
    Public Shared Operator =(c1 As C, c2 As C) As Boolean
        Return True
    End Operator
 
    Public Shared Operator <>(c1 As C, c2 As C) As Boolean
        Return False
    End Operator
End Class
",
                FixedCode = @"
Class C
    Public Shared Operator =(c1 As C, c2 As C) As Boolean
        Return True
    End Operator
 
    Public Shared Operator <>(c1 As C, c2 As C) As Boolean
        Return False
    End Operator
 
    Public Overrides Function Equals(obj As Object) As Boolean
        If ReferenceEquals(Me, obj) Then
            Return True
        End If
 
        If ReferenceEquals(obj, Nothing) Then
            Return False
        End If
 
        Throw New System.NotImplementedException()
    End Function
End Class
",
            }.RunAsync();
        }
 
        [Fact]
        public async Task CA2224_SimplifiedAsync()
        {
            await new VerifyVB.Test
            {
                TestCode = @"
Imports System
 
Class [|C|]
    Public Shared Operator =(c1 As C, c2 As C) As Boolean
        Return True
    End Operator
 
    Public Shared Operator <>(c1 As C, c2 As C) As Boolean
        Return False
    End Operator
End Class
",
                FixedCode = @"
Imports System
 
Class C
    Public Shared Operator =(c1 As C, c2 As C) As Boolean
        Return True
    End Operator
 
    Public Shared Operator <>(c1 As C, c2 As C) As Boolean
        Return False
    End Operator
 
    Public Overrides Function Equals(obj As Object) As Boolean
        If ReferenceEquals(Me, obj) Then
            Return True
        End If
 
        If ReferenceEquals(obj, Nothing) Then
            Return False
        End If
 
        Throw New NotImplementedException()
    End Function
End Class
",
            }.RunAsync();
        }
    }
}