ChangeSignatureTestState.cs 4.9 KB
Newer Older
J
Jonathon Marolf 已提交
1 2 3
// 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.
4 5 6 7

using System;
using System.Linq;
using System.Threading;
8
using System.Threading.Tasks;
9 10 11 12 13 14 15
using System.Xml.Linq;
using Microsoft.CodeAnalysis.ChangeSignature;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.ChangeSignature;
using Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces;
using Microsoft.CodeAnalysis.Notification;
using Microsoft.CodeAnalysis.Shared.Extensions;
16
using Microsoft.CodeAnalysis.Test.Utilities;
17 18 19
using Microsoft.CodeAnalysis.VisualBasic;
using Microsoft.CodeAnalysis.VisualBasic.ChangeSignature;
using Microsoft.VisualStudio.Composition;
20
using Roslyn.Test.Utilities;
21
using Roslyn.Utilities;
22 23 24 25 26 27

namespace Microsoft.CodeAnalysis.Editor.UnitTests.ChangeSignature
{
    internal sealed class ChangeSignatureTestState : IDisposable
    {
        private TestHostDocument _testDocument;
28 29 30
        public TestWorkspace Workspace { get; }
        public Document InvocationDocument { get; }
        public AbstractChangeSignatureService ChangeSignatureService { get; }
31 32 33
        public string ErrorMessage { get; private set; }
        public NotificationSeverity ErrorSeverity { get; private set; }

C
CyrusNajmabadi 已提交
34
        public static ChangeSignatureTestState Create(string markup, string languageName, ParseOptions parseOptions = null)
35
        {
36
            var exportProvider = s_exportProviderFactory.CreateExportProvider();
C
Cyrus Najmabadi 已提交
37
            var workspace = languageName == LanguageNames.CSharp
38 39
                  ? TestWorkspace.CreateCSharp(markup, exportProvider: exportProvider, parseOptions: (CSharpParseOptions)parseOptions)
                  : TestWorkspace.CreateVisualBasic(markup, exportProvider: exportProvider, parseOptions: parseOptions, compilationOptions: new VisualBasicCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
C
Cyrus Najmabadi 已提交
40 41

            return new ChangeSignatureTestState(workspace);
42 43
        }

C
CyrusNajmabadi 已提交
44
        public static ChangeSignatureTestState Create(XElement workspaceXml)
45
        {
C
CyrusNajmabadi 已提交
46
            var workspace = TestWorkspace.Create(workspaceXml);
C
Cyrus Najmabadi 已提交
47
            return new ChangeSignatureTestState(workspace);
48 49 50 51 52 53 54 55 56
        }

        public ChangeSignatureTestState(TestWorkspace workspace)
        {
            Workspace = workspace;
            _testDocument = Workspace.Documents.SingleOrDefault(d => d.CursorPosition.HasValue);

            if (_testDocument == null)
            {
57
                throw new ArgumentException("markup does not contain a cursor position", nameof(workspace));
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
            }

            InvocationDocument = Workspace.CurrentSolution.GetDocument(_testDocument.Id);
            ChangeSignatureService = InvocationDocument.GetLanguageService<AbstractChangeSignatureService>();
        }

        public TestChangeSignatureOptionsService TestChangeSignatureOptionsService
        {
            get
            {
                return (TestChangeSignatureOptionsService)InvocationDocument.Project.Solution.Workspace.Services.GetService<IChangeSignatureOptionsService>();
            }
        }

        public ChangeSignatureResult ChangeSignature()
        {
74
            WpfTestRunner.RequireWpfFact($"{nameof(AbstractChangeSignatureService.ChangeSignature)} currently needs to run on a WPF Fact because it's factored in a way that tries popping up UI in some cases.");
75

76 77 78 79 80 81 82 83 84 85 86
            return ChangeSignatureService.ChangeSignature(
                InvocationDocument,
                _testDocument.CursorPosition.Value,
                (errorMessage, severity) =>
                {
                    this.ErrorMessage = errorMessage;
                    this.ErrorSeverity = severity;
                },
                CancellationToken.None);
        }

87 88 89 90 91 92 93 94
        public async Task<ParameterConfiguration> GetParameterConfigurationAsync()
        {
            WpfTestRunner.RequireWpfFact($"{nameof(AbstractChangeSignatureService.ChangeSignature)} currently needs to run on a WPF Fact because it's factored in a way that tries popping up UI in some cases.");

            var context = await ChangeSignatureService.GetContextAsync(InvocationDocument, _testDocument.CursorPosition.Value, restrictToDeclarations: false, CancellationToken.None);
            return context.ParameterConfiguration;
        }

95
        private static readonly IExportProviderFactory s_exportProviderFactory =
96
            ExportProviderCache.GetOrCreateExportProviderFactory(
97 98 99 100
                TestExportProvider.MinimumCatalogWithCSharpAndVisualBasic
                    .WithPart(typeof(TestChangeSignatureOptionsService))
                    .WithPart(typeof(CSharpChangeSignatureService))
                    .WithPart(typeof(VisualBasicChangeSignatureService)));
101 102 103 104 105 106 107 108 109 110

        public void Dispose()
        {
            if (Workspace != null)
            {
                Workspace.Dispose();
            }
        }
    }
}