Example #1
0
        public async Task UpdateReturnsChanges()
        {
            const string Code      = @"
_ = GeneratedCode.$$S;
_ = ""Hello world!""";
            const string Path      = @"Test.cs";
            var          reference = new TestGeneratorReference(context =>
            {
                // NOTE: Don't actually do this in a real generator. This is just for test
                // code. Do not use this as an example of what to do in production.

                var syntax = context.Compilation.SyntaxTrees.Single().GetRoot().DescendantNodes().OfType <LiteralExpressionSyntax>().SingleOrDefault();
                if (syntax != null)
                {
                    context.AddSource("GeneratedSource", @"
class GeneratedCode
{
    public static string S = " + syntax.ToString() + @";
}");
                }
            });

            TestFile testFile = new TestFile(Path, Code);

            TestHelpers.AddProjectToWorkspace(SharedOmniSharpTestHost.Workspace,
                                              "project.csproj",
                                              new[] { "netcoreapp3.1" },
                                              new[] { testFile },
                                              analyzerConfigFiles: null,
                                              otherFiles: null,
                                              ImmutableArray.Create <AnalyzerReference>(reference));

            var point = testFile.Content.GetPointFromPosition();

            var gotoDefRequest = new GotoDefinitionRequest {
                FileName = Path, Line = point.Line, Column = point.Offset
            };
            var gotoDefResponse = (await SharedOmniSharpTestHost
                                   .GetRequestHandler <GotoDefinitionServiceV2>(OmniSharpEndpoints.V2.GotoDefinition)
                                   .Handle(gotoDefRequest)).Definitions.Single();

            var initialContent = await SharedOmniSharpTestHost
                                 .GetRequestHandler <SourceGeneratedFileService>(OmniSharpEndpoints.SourceGeneratedFile)
                                 .Handle(new SourceGeneratedFileRequest()
            {
                ProjectGuid  = gotoDefResponse.SourceGeneratedFileInfo.ProjectGuid,
                DocumentGuid = gotoDefResponse.SourceGeneratedFileInfo.DocumentGuid
            });

            Assert.Contains("Hello world!", initialContent.Source);

            var updateRequest = new UpdateSourceGeneratedFileRequest
            {
                DocumentGuid = gotoDefResponse.SourceGeneratedFileInfo.DocumentGuid,
                ProjectGuid  = gotoDefResponse.SourceGeneratedFileInfo.ProjectGuid
            };
            var updateHandler   = SharedOmniSharpTestHost.GetRequestHandler <SourceGeneratedFileService>(OmniSharpEndpoints.UpdateSourceGeneratedFile);
            var updatedResponse = await updateHandler.Handle(updateRequest);

            Assert.Null(updatedResponse.Source);
            Assert.Equal(UpdateType.Unchanged, updatedResponse.UpdateType);

            var updateBufferHandler = SharedOmniSharpTestHost.GetRequestHandler <UpdateBufferService>(OmniSharpEndpoints.UpdateBuffer);

            _ = await updateBufferHandler.Handle(new()
            {
                FileName = Path,
                Buffer   = Code.Replace("Hello world!", "Goodbye!")
            });

            updatedResponse = await updateHandler.Handle(updateRequest);

            Assert.Equal(UpdateType.Modified, updatedResponse.UpdateType);
            Assert.Contains("Goodbye!", updatedResponse.Source);
            Assert.DoesNotContain("Hello world!", updatedResponse.Source);

            _ = await updateBufferHandler.Handle(new()
            {
                FileName = Path,
                Buffer   = @"_ = GeneratedCode.S;"
            });

            updatedResponse = await updateHandler.Handle(updateRequest);

            Assert.Equal(UpdateType.Deleted, updatedResponse.UpdateType);
            Assert.Null(updatedResponse.Source);
        }