Beispiel #1
0
        public async Task A_script_snippet_workspace_can_be_used_to_get_completions()
        {
            var(processed, position) = WorkspaceServer.Tests.CodeManipulation.ProcessMarkup("Console.$$");
            using (var agent = new AgentService())
            {
                var json = new WorkspaceRequest(
                    requestId: "TestRun",
                    activeBufferId: "default.cs",
                    workspace: Workspace.FromSource(
                        processed,
                        "script",
                        id: "default.cs",
                        position: position))
                           .ToJson();

                var request = new HttpRequestMessage(
                    HttpMethod.Post,
                    @"/workspace/completion")
                {
                    Content = new StringContent(
                        json,
                        Encoding.UTF8,
                        "application/json")
                };

                var response = await agent.SendAsync(request);

                var result = await response
                             .EnsureSuccess()
                             .DeserializeAs <CompletionResult>();

                result.Items.Should().ContainSingle(item => item.DisplayText == "WriteLine");
            }
        }
Beispiel #2
0
        public async Task Can_extract_regions_from_files()
        {
            using (var agent = new AgentService())
            {
                var json = new CreateRegionsFromFilesRequest(
                    "testRun",
                    new[] { new SourceFile(
                                "program.cs",
                                "#region one\n#endregion\n#region two\nvar a = 1;\n#endregion") }).ToJson();

                var request = new HttpRequestMessage(
                    HttpMethod.Post,
                    @"/project/files/regions")
                {
                    Content = new StringContent(
                        json,
                        Encoding.UTF8,
                        "application/json")
                };

                var response = await agent.SendAsync(request);

                var result = await response
                             .EnsureSuccess()
                             .DeserializeAs <CreateRegionsFromFilesResponse>();

                result.Should().NotBeNull();
                result.Regions.Should().Contain(p => p.Content == string.Empty && p.Id.Contains("one") && p.Id.Contains("program.cs"));
                result.Regions.Should().Contain(p => p.Content == "var a = 1;" && p.Id.Contains("two") && p.Id.Contains("program.cs"));
            }
        }
Beispiel #3
0
        private static async Task <HttpResponseMessage> Call(
            string relativeUrl,
            string requestBody,
            int?timeoutMs          = null,
            StartupOptions options = null)
        {
            HttpResponseMessage response;

            using (var agent = new AgentService(options ?? StartupOptions.FromCommandLine("hosted")))
            {
                var request = new HttpRequestMessage(
                    HttpMethod.Post,
                    relativeUrl)
                {
                    Content = new StringContent(
                        requestBody,
                        Encoding.UTF8,
                        "application/json")
                };

                if (timeoutMs != null)
                {
                    request.Headers.Add("Timeout", timeoutMs.Value.ToString("F0"));
                }

                response = await agent.SendAsync(request);
            }

            return(response);
        }
Beispiel #4
0
        public async Task XForwardedPathBase_is_prepended_to_request_url()
        {
            using (var service = new AgentService())
            {
                var message = new HttpRequestMessage(HttpMethod.Get, "/");
                message.Headers.Add("X-Forwarded-PathBase", "/LocalCodeRunner/blazor-console");

                var expected = @"<!DOCTYPE html>
<html>
<head>
    <meta charset=""utf-8"" />
    <meta name=""viewport"" content=""width=device-width"">
    <base href=""/LocalCodeRunner/blazor-console/"" />
</head>
<body>
    <app>Loading...</app>

    <script src=""interop.js""></script>
    <script src=""_framework/blazor.webassembly.js""></script>
</body>
</html>
";

                var result = await service.SendAsync(message);

                var content = await result.Content.ReadAsStringAsync();

                content.Should().Be(expected);
            }
        }
        public static Task <HttpResponseMessage> GetAsync(
            this AgentService service,
            string uri,
            string referer = null)
        {
            var message = new HttpRequestMessage(HttpMethod.Get, uri);

            if (referer != null)
            {
                message.Headers.Add("referer", referer);
            }

            return(service.SendAsync(message));
        }
Beispiel #6
0
        public async Task When_they_run_a_snippet_then_they_get_diagnostics_for_the_first_line()
        {
            await Default.ConsoleWorkspace();

            var output = Guid.NewGuid().ToString();

            using (var agent = new AgentService())
            {
                var json =
                    new WorkspaceRequest(
                        Workspace.FromSource(
                            $@"Console.WriteLine(""{output}""".EnforceLF(),
                            workspaceType: "script"),
                        requestId: "TestRun")
                    .ToJson();

                var request = new HttpRequestMessage(
                    HttpMethod.Post,
                    @"/workspace/run")
                {
                    Content = new StringContent(
                        json,
                        Encoding.UTF8,
                        "application/json")
                };

                var response = await agent.SendAsync(request);

                var result = await response
                             .EnsureSuccess()
                             .DeserializeAs <RunResult>();

                var diagnostics = result.GetFeature <Diagnostics>();

                diagnostics.Should().Contain(d =>
                                             d.Start == 56 &&
                                             d.End == 56 &&
                                             d.Message == "(1,57): error CS1026: ) expected" &&
                                             d.Id == "CS1026");
            }
        }
Beispiel #7
0
        public async Task A_script_snippet_workspace_can_be_used_to_get_diagnostics()
        {
            await Default.ConsoleWorkspace();

            var log = new LogEntryList();

            var(processed, position) = CodeManipulation.ProcessMarkup("adddd");
            using (LogEvents.Subscribe(log.Add))
                using (var agent = new AgentService())
                {
                    var json = new WorkspaceRequest(
                        requestId: "TestRun",
                        activeBufferId: "default.cs",
                        workspace: Workspace.FromSource(
                            processed,
                            "script",
                            id: "default.cs",
                            position: position))
                               .ToJson();

                    var request = new HttpRequestMessage(HttpMethod.Post, @"/workspace/diagnostics")
                    {
                        Content = new StringContent(
                            json,
                            Encoding.UTF8,
                            "application/json")
                    };

                    var response = await agent.SendAsync(request);

                    var result = await response
                                 .EnsureSuccess()
                                 .DeserializeAs <DiagnosticResult>();

                    result.Diagnostics.Should().NotBeNullOrEmpty();
                    result.Diagnostics.Should().Contain(signature => signature.Message == "default.cs(1,1): error CS0103: The name \'adddd\' does not exist in the current context");
                }
        }
Beispiel #8
0
        public async Task A_script_snippet_workspace_can_be_used_to_get_signature_help()
        {
            await Default.ConsoleWorkspace();

            var log = new LogEntryList();

            var(processed, position) = CodeManipulation.ProcessMarkup("Console.WriteLine($$)");
            using (LogEvents.Subscribe(log.Add))
                using (var agent = new AgentService())
                {
                    var json = new WorkspaceRequest(
                        requestId: "TestRun",
                        activeBufferId: "default.cs",
                        workspace: Workspace.FromSource(
                            processed,
                            "script",
                            id: "default.cs",
                            position: position))
                               .ToJson();

                    var request = new HttpRequestMessage(HttpMethod.Post, @"/workspace/signaturehelp")
                    {
                        Content = new StringContent(
                            json,
                            Encoding.UTF8,
                            "application/json")
                    };

                    var response = await agent.SendAsync(request);

                    var result = await response
                                 .EnsureSuccess()
                                 .DeserializeAs <SignatureHelpResult>();

                    result.Signatures.Should().NotBeNullOrEmpty();
                    result.Signatures.Should().Contain(signature => signature.Label == "void Console.WriteLine(string format, params object[] arg)");
                }
        }
Beispiel #9
0
        public async Task A_console_project_can_be_used_to_get_diagnostics()
        {
            await Default.ConsoleWorkspace();

            #region bufferSources

            var program = @"using System;
using System.Linq;

namespace FibonacciTest
{
    public class Program
    {
        public static void Main()
        {
            foreach (var i in FibonacciGenerator.Fibonacci().Take(20))
            {
                Console.WriteLine(i);
            }
        }       
    }
}".EnforceLF();

            var generator = @"using System.Collections.Generic;
using System;
namespace FibonacciTest
{
    public static class FibonacciGenerator
    {
        public static IEnumerable<int> Fibonacci()
        {
            int current = 1, next = 1;
            while (true)
            {   
                adddd
                yield return current;
                next = current + (current = next);
                Cons$$
            }
        }
    }
}".EnforceLF();

            #endregion
            var(processed, position) = CodeManipulation.ProcessMarkup(generator);
            var log = new LogEntryList();
            using (LogEvents.Subscribe(log.Add))
                using (var agent = new AgentService())
                {
                    var json =
                        new WorkspaceRequest(activeBufferId: "generators/FibonacciGenerator.cs",
                                             requestId: "TestRun",
                                             workspace: Workspace.FromSources(
                                                 "console",
                                                 language: "csharp",
                                                 ("Program.cs", program, 0),
                                                 ("generators/FibonacciGenerator.cs", processed, position)
                                                 )).ToJson();

                    var request = new HttpRequestMessage(
                        HttpMethod.Post,
                        @"/workspace/diagnostics")
                    {
                        Content = new StringContent(
                            json,
                            Encoding.UTF8,
                            "application/json")
                    };

                    var response = await agent.SendAsync(request);

                    var result = await response
                                 .EnsureSuccess()
                                 .DeserializeAs <DiagnosticResult>();

                    result.Diagnostics.Should().NotBeNullOrEmpty();
                    result.Diagnostics.Should().Contain(diagnostic => diagnostic.Message == "generators/FibonacciGenerator.cs(12,17): error CS0246: The type or namespace name \'adddd\' could not be found (are you missing a using directive or an assembly reference?)");
                }
        }
Beispiel #10
0
        public async Task A_console_project_can_be_used_to_get_type_completion_with_a_space_in_the_name()
        {
            await Default.ConsoleWorkspace();

            #region bufferSources

            var program = @"using System;
using System.Linq;

namespace FibonacciTest
{
    public class Program
    {
        public static void Main()
        {
            foreach (var i in FibonacciGenerator.Fibonacci().Take(20))
            {
                Console.WriteLine(i);
            }
        }       
    }
}".EnforceLF();

            var generator = @"using System.Collections.Generic;
using System;
namespace FibonacciTest
{
    public static class FibonacciGenerator
    {
        public static IEnumerable<int> Fibonacci()
        {
            int current = 1, next = 1;
            while (true)
            {
                yield return current;
                next = current + (current = next);
                Cons$$
            }
        }
    }
}".EnforceLF();

            #endregion
            var package = await PackageUtilities.Copy(await Default.ConsoleWorkspace(), "a space");

            var(processed, position) = CodeManipulation.ProcessMarkup(generator);
            var log = new LogEntryList();
            using (LogEvents.Subscribe(log.Add))
                using (var agent = new AgentService())
                {
                    var json =
                        new WorkspaceRequest(activeBufferId: "generators/FibonacciGenerator.cs",
                                             requestId: "TestRun",
                                             workspace: Workspace.FromSources(
                                                 package.Name,
                                                 language: "csharp",
                                                 ("Program.cs", program, 0),
                                                 ("generators/FibonacciGenerator.cs", processed, position)
                                                 )).ToJson();

                    var request = new HttpRequestMessage(
                        HttpMethod.Post,
                        @"/workspace/completion")
                    {
                        Content = new StringContent(
                            json,
                            Encoding.UTF8,
                            "application/json")
                    };

                    var response = await agent.SendAsync(request);

                    var result = await response
                                 .EnsureSuccess()
                                 .DeserializeAs <CompletionResult>();

                    result.Items.Should().NotBeNullOrEmpty();
                    result.Items.Should().Contain(completion => completion.SortText == "Console");
                }
        }
Beispiel #11
0
        public async Task A_console_workspace_can_be_used_to_get_signature_help()
        {
            await Default.ConsoleWorkspace();

            #region bufferSources

            var program   = @"using System;
using System.Linq;

namespace FibonacciTest
{
    public class Program
    {
        public static void Main()
        {
            foreach (var i in FibonacciGenerator.Fibonacci().Take(20))
            {
                Console.WriteLine(i);
            }
        }       
    }
}".EnforceLF();
            var generator = @"using System.Collections.Generic;
using System;
namespace FibonacciTest
{
    public static class FibonacciGenerator
    {
        public static IEnumerable<int> Fibonacci()
        {
            int current = 1, next = 1;
            while (true)
            {
                yield return current;
                next = current + (current = next);
                Console.WriteLine($$);
            }
        }
    }
}".EnforceLF();
            #endregion
            var(processed, position) = CodeManipulation.ProcessMarkup(generator);
            var log = new LogEntryList();
            using (LogEvents.Subscribe(log.Add))
                using (var agent = new AgentService())
                {
                    var json =
                        new WorkspaceRequest(activeBufferId: "generators/FibonacciGenerator.cs",
                                             requestId: "TestRun",
                                             workspace: Workspace.FromSources(
                                                 workspaceType: "console",
                                                 language: "csharp",
                                                 ("Program.cs", program, 0),
                                                 ("generators/FibonacciGenerator.cs", processed, position)
                                                 )).ToJson();

                    var request = new HttpRequestMessage(
                        HttpMethod.Post,
                        @"/workspace/signaturehelp")
                    {
                        Content = new StringContent(
                            json,
                            Encoding.UTF8,
                            "application/json")
                    };

                    var response = await agent.SendAsync(request);

                    var result = await response
                                 .EnsureSuccess()
                                 .DeserializeAs <SignatureHelpResult>();

                    result.Signatures.Should().NotBeNullOrEmpty();
                    result.Signatures.Should().Contain(diagnostic => diagnostic.Label == "void Console.WriteLine(string format, params object[] arg)");
                }
        }