File: CSharp\CSharpExtractInterfaceDialog.cs
Web Access
Project: ..\..\..\src\VisualStudio\IntegrationTest\IntegrationTests\Microsoft.VisualStudio.LanguageServices.IntegrationTests.csproj (Microsoft.VisualStudio.LanguageServices.IntegrationTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
#nullable disable
 
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Test.Utilities;
using Microsoft.VisualStudio.IntegrationTest.Utilities;
using Microsoft.VisualStudio.IntegrationTest.Utilities.OutOfProcess;
using Roslyn.Test.Utilities;
using Xunit;
using Xunit.Abstractions;
using ProjectUtils = Microsoft.VisualStudio.IntegrationTest.Utilities.Common.ProjectUtils;
 
namespace Roslyn.VisualStudio.IntegrationTests.CSharp
{
    [Collection(nameof(SharedIntegrationHostFixture))]
    [Trait(Traits.Feature, Traits.Features.CodeActionsExtractInterface)]
    public class CSharpExtractInterfaceDialog : AbstractEditorTest
    {
        protected override string LanguageName => LanguageNames.CSharp;
 
        private ExtractInterfaceDialog_OutOfProc ExtractInterfaceDialog => VisualStudio.ExtractInterfaceDialog;
 
        public CSharpExtractInterfaceDialog(VisualStudioInstanceFactory instanceFactory)
            : base(instanceFactory, nameof(CSharpExtractInterfaceDialog))
        {
        }
 
        [WpfFact]
        public void VerifyCancellation()
        {
            SetUpEditor(@"class C$$
{
    public void M() { }
}
");
            VisualStudio.Editor.InvokeCodeActionList();
            VisualStudio.Editor.Verify.CodeAction("Extract interface...",
                applyFix: true,
                blockUntilComplete: false);
 
            ExtractInterfaceDialog.VerifyOpen();
            ExtractInterfaceDialog.ClickCancel();
            ExtractInterfaceDialog.VerifyClosed();
 
            VisualStudio.Editor.Verify.TextContains(@"class C
{
    public void M() { }
}
");
        }
 
        [WpfFact]
        public void CheckFileName()
        {
            SetUpEditor(@"class C$$
{
    public void M() { }
}
");
            VisualStudio.Editor.InvokeCodeActionList();
            VisualStudio.Editor.Verify.CodeAction("Extract interface...",
                applyFix: true,
                blockUntilComplete: false);
 
            ExtractInterfaceDialog.VerifyOpen();
 
            var targetFileName = ExtractInterfaceDialog.GetTargetFileName();
            Assert.Equal(expected: "IC.cs", actual: targetFileName);
 
            ExtractInterfaceDialog.ClickCancel();
            ExtractInterfaceDialog.VerifyClosed();
        }
 
        [WpfFact]
        public void VerifySelectAndDeselectAllButtons()
        {
            SetUpEditor(@"class C$$
{
    public void M1() { }
    public void M2() { }
}
");
 
            VisualStudio.Editor.InvokeCodeActionList();
            VisualStudio.Editor.Verify.CodeAction("Extract interface...",
                applyFix: true,
                blockUntilComplete: false);
 
            ExtractInterfaceDialog.VerifyOpen();
 
            var selectedItems = ExtractInterfaceDialog.GetSelectedItems();
            Assert.Equal(
                expected: new[] { "M1()", "M2()" },
                actual: selectedItems);
 
            ExtractInterfaceDialog.ClickDeselectAll();
 
            selectedItems = ExtractInterfaceDialog.GetSelectedItems();
            Assert.Empty(selectedItems);
 
            ExtractInterfaceDialog.ClickSelectAll();
 
            selectedItems = ExtractInterfaceDialog.GetSelectedItems();
            Assert.Equal(
                expected: new[] { "M1()", "M2()" },
                actual: selectedItems);
 
            ExtractInterfaceDialog.ClickCancel();
            ExtractInterfaceDialog.VerifyClosed();
        }
 
        [WpfFact]
        public void OnlySelectedItemsAreGenerated()
        {
            SetUpEditor(@"class C$$
{
    public void M1() { }
    public void M2() { }
}
");
 
            VisualStudio.Editor.InvokeCodeActionList();
            VisualStudio.Editor.Verify.CodeAction("Extract interface...",
                applyFix: true,
                blockUntilComplete: false);
 
            ExtractInterfaceDialog.VerifyOpen();
            ExtractInterfaceDialog.ClickDeselectAll();
            ExtractInterfaceDialog.ToggleItem("M2()");
            ExtractInterfaceDialog.ClickOK();
            ExtractInterfaceDialog.VerifyClosed();
 
            var project = new ProjectUtils.Project(ProjectName);
            VisualStudio.SolutionExplorer.OpenFile(project, "Class1.cs");
            VisualStudio.Editor.Verify.TextContains(@"class C : IC
{
    public void M1() { }
    public void M2() { }
}
");
 
            VisualStudio.SolutionExplorer.OpenFile(project, "IC.cs");
            VisualStudio.Editor.Verify.TextContains(@"interface IC
{
    void M2();
}");
        }
 
        [WpfFact]
        public void CheckSameFile()
        {
            SetUpEditor(@"class C$$
{
    public void M() { }
}
");
            VisualStudio.Editor.InvokeCodeActionList();
            VisualStudio.Editor.Verify.CodeAction("Extract interface...",
                applyFix: true,
                blockUntilComplete: false);
 
            ExtractInterfaceDialog.VerifyOpen();
 
            ExtractInterfaceDialog.SelectSameFile();
 
            ExtractInterfaceDialog.ClickOK();
            ExtractInterfaceDialog.VerifyClosed();
 
            _ = new ProjectUtils.Project(ProjectName);
            VisualStudio.Editor.Verify.TextContains(@"interface IC
{
    void M();
}
 
class C : IC
{
    public void M() { }
}
");
 
        }
 
        [WpfFact]
        public void CheckSameFileOnlySelectedItems()
        {
            SetUpEditor(@"class C$$
{
    public void M1() { }
    public void M2() { }
}
");
 
            VisualStudio.Editor.InvokeCodeActionList();
            VisualStudio.Editor.Verify.CodeAction("Extract interface...",
                applyFix: true,
                blockUntilComplete: false);
 
            ExtractInterfaceDialog.VerifyOpen();
            ExtractInterfaceDialog.ClickDeselectAll();
            ExtractInterfaceDialog.ToggleItem("M2()");
            ExtractInterfaceDialog.SelectSameFile();
            ExtractInterfaceDialog.ClickOK();
            ExtractInterfaceDialog.VerifyClosed();
 
            VisualStudio.Editor.Verify.TextContains(@"interface IC
{
    void M2();
}
 
class C : IC
{
    public void M1() { }
    public void M2() { }
}
");
        }
 
        [WpfFact]
        public void CheckSameFileNamespace()
        {
            SetUpEditor(@"namespace A
{
    class C$$
    {
        public void M() { }
    }
}
");
            VisualStudio.Editor.InvokeCodeActionList();
            VisualStudio.Editor.Verify.CodeAction("Extract interface...",
                applyFix: true,
                blockUntilComplete: false);
 
            ExtractInterfaceDialog.VerifyOpen();
 
            ExtractInterfaceDialog.SelectSameFile();
 
            ExtractInterfaceDialog.ClickOK();
            ExtractInterfaceDialog.VerifyClosed();
 
            _ = new ProjectUtils.Project(ProjectName);
            VisualStudio.Editor.Verify.TextContains(@"namespace A
{
    interface IC
    {
        void M();
    }
 
    class C : IC
    {
        public void M() { }
    }
}
");
        }
 
        [WpfFact]
        public void CheckSameWithTypes()
        {
            SetUpEditor(@"class C$$
{
    public bool M() => false;
}
");
            VisualStudio.Editor.InvokeCodeActionList();
            VisualStudio.Editor.Verify.CodeAction("Extract interface...",
                applyFix: true,
                blockUntilComplete: false);
 
            ExtractInterfaceDialog.VerifyOpen();
 
            ExtractInterfaceDialog.SelectSameFile();
 
            ExtractInterfaceDialog.ClickOK();
            ExtractInterfaceDialog.VerifyClosed();
 
            _ = new ProjectUtils.Project(ProjectName);
            VisualStudio.Editor.Verify.TextContains(@"interface IC
{
    bool M();
}
 
class C : IC
{
    public bool M() => false;
}
");
        }
    }
}