public async void DisposeServiceProvider_DisposesServiceProvider()
        {
            // Arrange
            StaticPrismService.Configure <OutOfProcessNodeJSServiceOptions>(options => options.TimeoutMS = 0);
            // Highlight once to ensure that an initial PrismService is created.
            try
            {
                await StaticPrismService.IsValidLanguageAliasAsync("csharp").ConfigureAwait(false); // Throws since TimeoutMS == 0
            }
            catch
            {
                // Do nothing
            }

            // Act
            StaticPrismService.DisposeServiceProvider(); // Dispose, the next call should not be affected by TimeoutMS = 0
            string result = await StaticPrismService.HighlightAsync(@"public string ExampleFunction(string arg)
{
    // Example comment
    return arg + ""dummyString"";
}", "csharp").ConfigureAwait(false);

            // Assert
            Assert.Equal(@"<span class=""token keyword"">public</span> <span class=""token keyword"">string</span> <span class=""token function"">ExampleFunction</span><span class=""token punctuation"">(</span><span class=""token keyword"">string</span> arg<span class=""token punctuation"">)</span>
<span class=""token punctuation"">{</span>
    <span class=""token comment"">// Example comment</span>
    <span class=""token keyword"">return</span> arg <span class=""token operator"">+</span> <span class=""token string"">""dummyString""</span><span class=""token punctuation"">;</span>
<span class=""token punctuation"">}</span>", result);
        }
        public async Task HighlightAsync_HighlightsCode(string dummyCode, string dummyLanguageAlias, string expectedResult)
        {
            // Act
            string result = await StaticPrismService.HighlightAsync(dummyCode, dummyLanguageAlias).ConfigureAwait(false);

            // Assert
            Assert.Equal(expectedResult, result);
        }
        public async Task IsValidLanguageAliasAsync_ChecksIfLanguageAliasIsValid(string dummyLanguageAlias, bool expectedResult)
        {
            // Act
            bool result = await StaticPrismService.IsValidLanguageAliasAsync(dummyLanguageAlias).ConfigureAwait(false);

            // Assert
            Assert.Equal(expectedResult, result);
        }
        public async void Configure_ConfiguresOptions()
        {
            // Act
            // Highlight once to ensure that an initial PrismService is created. The invocation after configuration should properly dispose of this initial instance and create a new one with the
            // specified options.
            await StaticPrismService.IsValidLanguageAliasAsync("csharp").ConfigureAwait(false);

            StaticPrismService.Configure <OutOfProcessNodeJSServiceOptions>(options => options.TimeoutMS = 0);

            // Assert
            // Since we set timeout to 0, the NodeJS invocation is gauranteed to timeout. The NodeJS connection attempt is likely to timeout. Both throw an InvocationException.
            await Assert.ThrowsAsync <InvocationException>(async() => await StaticPrismService.IsValidLanguageAliasAsync("csharp").ConfigureAwait(false)).ConfigureAwait(false);

            // Reset so other tests aren't affected
            StaticPrismService.Configure <OutOfProcessNodeJSServiceOptions>(options => options.TimeoutMS = 60000);
        }
        public void HighlightAsync_IsThreadSafe()
        {
            // Arrange
            const string dummyCode          = @"public string ExampleFunction(string arg)
{
    // Example comment
    return arg + ""dummyString"";
}";
            const string dummyLanguageAlias = "csharp";

            // Act
            var       results    = new ConcurrentQueue <string>();
            const int numThreads = 5;
            var       threads    = new List <Thread>();

            for (int i = 0; i < numThreads; i++)
            {
                var thread = new Thread(() => results.Enqueue(StaticPrismService.HighlightAsync(dummyCode, dummyLanguageAlias).GetAwaiter().GetResult()));
                threads.Add(thread);
                thread.Start();
            }
            foreach (Thread thread in threads)
            {
                thread.Join();
            }

            // Assert
            const string expectedResult = @"<span class=""token keyword"">public</span> <span class=""token keyword"">string</span> <span class=""token function"">ExampleFunction</span><span class=""token punctuation"">(</span><span class=""token keyword"">string</span> arg<span class=""token punctuation"">)</span>
<span class=""token punctuation"">{</span>
    <span class=""token comment"">// Example comment</span>
    <span class=""token keyword"">return</span> arg <span class=""token operator"">+</span> <span class=""token string"">""dummyString""</span><span class=""token punctuation"">;</span>
<span class=""token punctuation"">}</span>";

            Assert.Equal(numThreads, results.Count);
            foreach (string result in results)
            {
                Assert.Equal(expectedResult, result);
            }
        }