File: Microsoft.NetCore.Analyzers\Runtime\PreferStreamAsyncMemoryOverloadsTestBase.cs
Web Access
Project: ..\..\..\src\Microsoft.CodeAnalysis.NetAnalyzers\tests\Microsoft.CodeAnalysis.NetAnalyzers.UnitTests\Microsoft.CodeAnalysis.NetAnalyzers.UnitTests.csproj (Microsoft.CodeAnalysis.NetAnalyzers.UnitTests)
// Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the MIT license.  See License.txt in the project root for license information.
 
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Testing;
using VerifyCS = Test.Utilities.CSharpCodeFixVerifier<
    Microsoft.NetCore.Analyzers.Runtime.PreferStreamAsyncMemoryOverloads,
    Microsoft.NetCore.CSharp.Analyzers.Runtime.CSharpPreferStreamAsyncMemoryOverloadsFixer>;
using VerifyVB = Test.Utilities.VisualBasicCodeFixVerifier<
    Microsoft.NetCore.Analyzers.Runtime.PreferStreamAsyncMemoryOverloads,
    Microsoft.NetCore.VisualBasic.Analyzers.Runtime.BasicPreferStreamAsyncMemoryOverloadsFixer>;
 
namespace Microsoft.NetCore.Analyzers.Runtime.UnitTests
{
    public class PreferStreamAsyncMemoryOverloadsTestBase
    {
        // Verifies that the analyzer generates the specified C# diagnostic results, if any.
        protected Task CSharpVerifyAnalyzerAsync(string source, params DiagnosticResult[] expected) =>
            CSharpVerifyForVersionAsync(source, null, ReferenceAssemblies.Net.Net50, CodeAnalysis.CSharp.LanguageVersion.CSharp7_3, expected);
 
        // Verifies that the analyzer generates the specified VB diagnostic results, if any.
        protected Task VisualBasicVerifyAnalyzerAsync(string source, params DiagnosticResult[] expected) =>
            VisualBasicVerifyForVersionAsync(source, null, ReferenceAssemblies.Net.Net50, expected);
 
        // Verifies that the analyzer generates the specified C# diagnostic results, if any, in an unsupported .NET version.
        protected Task CSharpVerifyAnalyzerForUnsupportedVersionAsync(string source, params DiagnosticResult[] expected) =>
            CSharpVerifyForVersionAsync(source, null, ReferenceAssemblies.NetCore.NetCoreApp20, CodeAnalysis.CSharp.LanguageVersion.CSharp7_3, expected);
 
        // Verifies that the analyzer generates the specified VB diagnostic results, if any, in an unsupported .NET version.
        protected Task VisualBasicVerifyAnalyzerForUnsupportedVersionAsync(string source, params DiagnosticResult[] expected) =>
            VisualBasicVerifyForVersionAsync(source, null, ReferenceAssemblies.NetCore.NetCoreApp20, expected);
 
        // Verifies that the fixer generates the fixes for the specified C# diagnostic results, if any.
        protected Task CSharpVerifyExpectedCodeFixDiagnosticsAsync(string originalSource, string fixedSource, params DiagnosticResult[] expected) =>
            CSharpVerifyForVersionAsync(originalSource, fixedSource, ReferenceAssemblies.Net.Net50, CodeAnalysis.CSharp.LanguageVersion.CSharp7_3, expected);
 
        // Verifies that the fixer generates the fixes for the specified VB diagnostic results, if any.
        protected Task VisualBasicVerifyExpectedCodeFixDiagnosticsAsync(string originalSource, string fixedSource, params DiagnosticResult[] expected) =>
            VisualBasicVerifyForVersionAsync(originalSource, fixedSource, ReferenceAssemblies.Net.Net50, expected);
 
        // Verifies that the analyzer generates the specified C# diagnostic results, if any, for the specified originalSource.
        // If fixedSource is provided, also verifies that the fixer generates the fixes for the verified diagnostic results, if any.
        protected Task CSharpVerifyForVersionAsync(string originalSource, string fixedSource, ReferenceAssemblies version, CodeAnalysis.CSharp.LanguageVersion languageVersion, params DiagnosticResult[] expected)
        {
            var test = new VerifyCS.Test
            {
                TestCode = originalSource,
                ReferenceAssemblies = version,
                LanguageVersion = languageVersion
            };
 
            if (!string.IsNullOrEmpty(fixedSource))
            {
                test.FixedCode = fixedSource;
            }
 
            test.ExpectedDiagnostics.AddRange(expected);
 
            return test.RunAsync();
        }
 
        // Verifies that the analyzer generates the specified VB diagnostic results, if any, for the specified originalSource.
        // If fixedSource is provided, also verifies that the fixer generates the fixes for the verified diagnostic results, if any.
        private Task VisualBasicVerifyForVersionAsync(string originalSource, string fixedSource, ReferenceAssemblies version, params DiagnosticResult[] expected)
        {
            var test = new VerifyVB.Test
            {
                TestCode = originalSource,
                ReferenceAssemblies = version,
            };
 
            if (!string.IsNullOrEmpty(fixedSource))
            {
                test.FixedCode = fixedSource;
            }
 
            test.ExpectedDiagnostics.AddRange(expected);
 
            return test.RunAsync();
        }
 
        // Retrieves the C# diagnostic for the specified rule, lines, columns, method and preferred method.
        protected DiagnosticResult GetCSResultForRule(int startLine, int startColumn, int endLine, int endColumn, DiagnosticDescriptor rule, string methodName, string methodPreferredName)
            => VerifyCS.Diagnostic(rule)
                .WithSpan(startLine, startColumn, endLine, endColumn)
                .WithArguments(methodName, methodPreferredName);
 
        // Retrieves the VB diagnostic for the specified rule, lines, columns, method and preferred method.
        protected DiagnosticResult GetVBResultForRule(int startLine, int startColumn, int endLine, int endColumn, DiagnosticDescriptor rule, string methodName, string methodPreferredName)
            => VerifyVB.Diagnostic(rule)
                .WithSpan(startLine, startColumn, endLine, endColumn)
                .WithArguments(methodName, methodPreferredName);
 
        protected string GetByteArrayWithDataCSharp(bool isEmpty) => isEmpty ? "" : @"byte[] buffer = { 0xBA, 0x5E, 0xBA, 0x11, 0xF0, 0x07, 0xBA, 0x11 };";
 
        protected string GetByteArrayWithDataVisualBasic(bool isEmpty) => isEmpty ? "" : @"Dim buffer As Byte() = {&HBA, &H5E, &HBA, &H11, &HF0, &H07, &HBA, &H11}";
 
        protected string GetByteArrayWithoutDataCSharp(bool isEmpty) => isEmpty ? "" : @"byte[] buffer = new byte[s.Length];";
 
        protected string GetByteArrayWithoutDataVisualBasic(bool isEmpty) => isEmpty ? "" : @"Dim buffer As Byte() = New Byte(s.Length - 1) {}";
 
        protected string GetConfigureAwaitCSharp(bool isEmpty) => isEmpty ? "" : @".ConfigureAwait(false)";
 
        protected string GetConfigureAwaitVisualBasic(bool isEmpty) => isEmpty ? "" : @".ConfigureAwait(False)";
 
        public static IEnumerable<object[]> UnnamedArgumentsFullBufferTestData()
        {
            yield return new object[] { "buffer, 0, buffer.Length",
                                        "buffer" };
            yield return new object[] { "buffer, 0, buffer.Length, CancellationToken.None",
                                        "buffer, CancellationToken.None" };
        }
 
        public static IEnumerable<object[]> CSharpUnnamedArgumentsPartialBufferTestData()
        {
            yield return new object[] { "buffer, 1, buffer.Length",
                                        "buffer.AsMemory(1, buffer.Length)" };
            yield return new object[] { "buffer, 1, buffer.Length, new CancellationToken()",
                                        "buffer.AsMemory(1, buffer.Length), new CancellationToken()" };
            yield return new object[] { "buffer, 1, 2",
                                        "buffer.AsMemory(1, 2)" };
            yield return new object[] { "buffer, 1, 2, default(CancellationToken)",
                                        "buffer.AsMemory(1, 2), default(CancellationToken)" };
        }
 
        public static IEnumerable<object[]> CSharpNamedArgumentsFullBufferTestData()
        {
            // Normal argument order is: (byte[] buffer, int offset, int count)
            yield return new object[] { "buffer, offset: 0, count: buffer.Length",
                                        "buffer" };
            yield return new object[] { "buffer: buffer, offset: 0, count: buffer.Length",
                                        "buffer: buffer" };
            yield return new object[] { "buffer: buffer, count: buffer.Length, offset: 0",
                                        "buffer: buffer" };
            yield return new object[] { "count: buffer.Length, offset: 0, buffer: buffer",
                                        "buffer: buffer" };
            yield return new object[] { "count: buffer.Length, buffer: buffer, offset: 0",
                                        "buffer: buffer" };
            yield return new object[] { "offset: 0, buffer: buffer, count: buffer.Length",
                                        "buffer: buffer" };
            yield return new object[] { "offset: 0, count: buffer.Length, buffer: buffer",
                                        "buffer: buffer" };
            // Skipping naming
            yield return new object[] { "buffer: buffer, 0, buffer.Length",
                                        "buffer: buffer" };
            yield return new object[] { "buffer, offset: 0, buffer.Length",
                                        "buffer" };
            yield return new object[] { "buffer, 0, count: buffer.Length",
                                        "buffer" };
            yield return new object[] { "buffer: buffer, 0, count: buffer.Length",
                                        "buffer: buffer" };
        }
 
        public static IEnumerable<object[]> CSharpNamedArgumentsPartialBufferTestData()
        {
            // Normal argument order is: (byte[] buffer, int offset, int count)
            yield return new object[] { "buffer, offset: 1, count: buffer.Length",
                                        "buffer.AsMemory(start: 1, length: buffer.Length)" };
            yield return new object[] { "buffer: buffer, offset: 1, count: buffer.Length",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length)" };
            yield return new object[] { "buffer: buffer, count: buffer.Length, offset: 1",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length)" };
            yield return new object[] { "count: buffer.Length, offset: 1, buffer: buffer",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length)" };
            yield return new object[] { "count: buffer.Length, buffer: buffer, offset: 1",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length)" };
            yield return new object[] { "offset: 1, buffer: buffer, count: buffer.Length",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length)" };
            yield return new object[] { "offset: 1, count: buffer.Length, buffer: buffer",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length)" };
            // Skipping naming
            yield return new object[] { "buffer: buffer, 1, buffer.Length",
                                        "buffer: buffer.AsMemory(1, buffer.Length)" };
            yield return new object[] { "buffer, offset: 1, buffer.Length",
                                        "buffer.AsMemory(start: 1, buffer.Length)" };
            yield return new object[] { "buffer, 1, count: buffer.Length",
                                        "buffer.AsMemory(1, length: buffer.Length)" };
            yield return new object[] { "buffer: buffer, 1, count: buffer.Length",
                                        "buffer: buffer.AsMemory(1, length: buffer.Length)" };
        }
 
        public static IEnumerable<object[]> CSharpNamedArgumentsWithCancellationTokenPartialBufferTestData()
        {
            // Normal argument order is: (byte[] buffer, int offset, int count, CancellationToken cancellationToken)
            // Cancellation token as fourth argument
            yield return new object[] { "buffer, offset: 1, count: buffer.Length, cancellationToken: new CancellationToken()",
                                        "buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "buffer: buffer, offset: 1, count: buffer.Length, cancellationToken: new CancellationToken()",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "buffer: buffer, count: buffer.Length, offset: 1, cancellationToken: new CancellationToken()",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "count: buffer.Length, offset: 1, buffer: buffer, cancellationToken: new CancellationToken()",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "count: buffer.Length, buffer: buffer, offset: 1, cancellationToken: new CancellationToken()",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "offset: 1, buffer: buffer, count: buffer.Length, cancellationToken: new CancellationToken()",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "offset: 1, count: buffer.Length, buffer: buffer, cancellationToken: new CancellationToken()",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            // Cancellation token as third argument
            yield return new object[] { "buffer, offset: 1, cancellationToken: new CancellationToken(), count: buffer.Length",
                                        "buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "buffer: buffer, offset: 1, cancellationToken: new CancellationToken(), count: buffer.Length",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "buffer: buffer, count: buffer.Length, cancellationToken: new CancellationToken(), offset: 1",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "count: buffer.Length, offset: 1, cancellationToken: new CancellationToken(), buffer: buffer",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "count: buffer.Length, buffer: buffer, cancellationToken: new CancellationToken(), offset: 1",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "offset: 1, buffer: buffer, cancellationToken: new CancellationToken(), count: buffer.Length",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "offset: 1, count: buffer.Length, cancellationToken: new CancellationToken(), buffer: buffer",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            // Cancellation token as second argument
            yield return new object[] { "buffer, cancellationToken: new CancellationToken(), offset: 1, count: buffer.Length",
                                        "buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "buffer: buffer, cancellationToken: new CancellationToken(), offset: 1, count: buffer.Length",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "buffer: buffer, cancellationToken: new CancellationToken(), count: buffer.Length, offset: 1",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "count: buffer.Length, cancellationToken: new CancellationToken(), offset: 1, buffer: buffer",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "count: buffer.Length, cancellationToken: new CancellationToken(), buffer: buffer, offset: 1",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "offset: 1, cancellationToken: new CancellationToken(), buffer: buffer, count: buffer.Length",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "offset: 1, cancellationToken: new CancellationToken(), count: buffer.Length, buffer: buffer",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            // Cancellation token as first argument
            yield return new object[] { "cancellationToken: new CancellationToken(), buffer: buffer, offset: 1, count: buffer.Length",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "cancellationToken: new CancellationToken(), buffer: buffer, count: buffer.Length, offset: 1",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "cancellationToken: new CancellationToken(), count: buffer.Length, offset: 1, buffer: buffer",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "cancellationToken: new CancellationToken(), count: buffer.Length, buffer: buffer, offset: 1",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "cancellationToken: new CancellationToken(), offset: 1, buffer: buffer, count: buffer.Length",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
            yield return new object[] { "cancellationToken: new CancellationToken(), offset: 1, count: buffer.Length, buffer: buffer",
                                        "buffer: buffer.AsMemory(start: 1, length: buffer.Length), cancellationToken: new CancellationToken()" };
        }
 
        public static IEnumerable<object[]> CSharpNamedArgumentsWithCancellationTokenFullBufferTestData()
        {
            // Normal argument order is: (byte[] buffer, int offset, int count, CancellationToken cancellationToken)
            // Cancellation token as fourth argument
            yield return new object[] { "buffer, offset: 0, count: buffer.Length, cancellationToken: CancellationToken.None",
                                        "buffer, cancellationToken: CancellationToken.None" };
            yield return new object[] { "buffer: buffer, offset: 0, count: buffer.Length, cancellationToken: CancellationToken.None",
                                        "buffer: buffer, cancellationToken: CancellationToken.None" };
            yield return new object[] { "buffer: buffer, count: buffer.Length, offset: 0, cancellationToken: CancellationToken.None",
                                        "buffer: buffer, cancellationToken: CancellationToken.None" };
            yield return new object[] { "count: buffer.Length, offset: 0, buffer: buffer, cancellationToken: CancellationToken.None",
                                        "buffer: buffer, cancellationToken: CancellationToken.None" };
            yield return new object[] { "count: buffer.Length, buffer: buffer, offset: 0, cancellationToken: CancellationToken.None",
                                        "buffer: buffer, cancellationToken: CancellationToken.None" };
            yield return new object[] { "offset: 0, buffer: buffer, count: buffer.Length, cancellationToken: CancellationToken.None",
                                        "buffer: buffer, cancellationToken: CancellationToken.None" };
            yield return new object[] { "offset: 0, count: buffer.Length, buffer: buffer, cancellationToken: CancellationToken.None",
                                        "buffer: buffer, cancellationToken: CancellationToken.None" };
            // Cancellation token as third argument
            yield return new object[] { "buffer, offset: 0, cancellationToken: default(CancellationToken), count: buffer.Length",
                                        "buffer, cancellationToken: default(CancellationToken)" };
            yield return new object[] { "buffer: buffer, offset: 0, cancellationToken: default(CancellationToken), count: buffer.Length",
                                        "buffer: buffer, cancellationToken: default(CancellationToken)" };
            yield return new object[] { "buffer: buffer, count: buffer.Length, cancellationToken: default(CancellationToken), offset: 0",
                                        "buffer: buffer, cancellationToken: default(CancellationToken)" };
            yield return new object[] { "count: buffer.Length, offset: 0, cancellationToken: default(CancellationToken), buffer: buffer",
                                        "buffer: buffer, cancellationToken: default(CancellationToken)" };
            yield return new object[] { "count: buffer.Length, buffer: buffer, cancellationToken: default(CancellationToken), offset: 0",
                                        "buffer: buffer, cancellationToken: default(CancellationToken)" };
            yield return new object[] { "offset: 0, buffer: buffer, cancellationToken: default(CancellationToken), count: buffer.Length",
                                        "buffer: buffer, cancellationToken: default(CancellationToken)" };
            yield return new object[] { "offset: 0, count: buffer.Length, cancellationToken: default(CancellationToken), buffer: buffer",
                                        "buffer: buffer, cancellationToken: default(CancellationToken)" };
            // Cancellation token as second argument
            yield return new object[] { "buffer, cancellationToken: default(CancellationToken), offset: 0, count: buffer.Length",
                                        "buffer, cancellationToken: default(CancellationToken)" };
            yield return new object[] { "buffer: buffer, cancellationToken: default(CancellationToken), offset: 0, count: buffer.Length",
                                        "buffer: buffer, cancellationToken: default(CancellationToken)" };
            yield return new object[] { "buffer: buffer, cancellationToken: default(CancellationToken), count: buffer.Length, offset: 0",
                                        "buffer: buffer, cancellationToken: default(CancellationToken)" };
            yield return new object[] { "count: buffer.Length, cancellationToken: default(CancellationToken), offset: 0, buffer: buffer",
                                        "buffer: buffer, cancellationToken: default(CancellationToken)" };
            yield return new object[] { "count: buffer.Length, cancellationToken: default(CancellationToken), buffer: buffer, offset: 0",
                                        "buffer: buffer, cancellationToken: default(CancellationToken)" };
            yield return new object[] { "offset: 0, cancellationToken: default(CancellationToken), buffer: buffer, count: buffer.Length",
                                        "buffer: buffer, cancellationToken: default(CancellationToken)" };
            yield return new object[] { "offset: 0, cancellationToken: default(CancellationToken), count: buffer.Length, buffer: buffer",
                                        "buffer: buffer, cancellationToken: default(CancellationToken)" };
            // Cancellation token as first argument
            yield return new object[] { "cancellationToken: default(CancellationToken), buffer: buffer, offset: 0, count: buffer.Length",
                                        "buffer: buffer, cancellationToken: default(CancellationToken)" };
            yield return new object[] { "cancellationToken: default(CancellationToken), buffer: buffer, count: buffer.Length, offset: 0",
                                        "buffer: buffer, cancellationToken: default(CancellationToken)" };
            yield return new object[] { "cancellationToken: default(CancellationToken), count: buffer.Length, offset: 0, buffer: buffer",
                                        "buffer: buffer, cancellationToken: default(CancellationToken)" };
            yield return new object[] { "cancellationToken: default(CancellationToken), count: buffer.Length, buffer: buffer, offset: 0",
                                        "buffer: buffer, cancellationToken: default(CancellationToken)" };
            yield return new object[] { "cancellationToken: default(CancellationToken), offset: 0, buffer: buffer, count: buffer.Length",
                                        "buffer: buffer, cancellationToken: default(CancellationToken)" };
            yield return new object[] { "cancellationToken: default(CancellationToken), offset: 0, count: buffer.Length, buffer: buffer",
                                        "buffer: buffer, cancellationToken: default(CancellationToken)" };
        }
 
        public static IEnumerable<object[]> VisualBasicUnnamedArgumentsPartialBufferTestData()
        {
            yield return new object[] { "buffer, 1, buffer.Length",
                                        "buffer.AsMemory(1, buffer.Length)" };
            yield return new object[] { "buffer, 1, buffer.Length, New CancellationToken()",
                                        "buffer.AsMemory(1, buffer.Length), New CancellationToken()" };
        }
 
        public static IEnumerable<object[]> VisualBasicNamedArgumentsPartialBufferTestData()
        {
            // Normal argument order is: (byte[] buffer, int offset, int count)
            yield return new object[] { "buffer, offset:=1, count:=buffer.Length",
                                        "buffer.AsMemory(start:=1, length:=buffer.Length)" };
            yield return new object[] { "buffer:=buffer, offset:=1, count:=buffer.Length",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length)" };
            yield return new object[] { "buffer:=buffer, count:=buffer.Length, offset:=1",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length)" };
            yield return new object[] { "count:=buffer.Length, offset:=1, buffer:=buffer",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length)" };
            yield return new object[] { "count:=buffer.Length, buffer:=buffer, offset:=1",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length)" };
            yield return new object[] { "offset:=1, buffer:=buffer, count:=buffer.Length",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length)" };
            yield return new object[] { "offset:=1, count:=buffer.Length, buffer:=buffer",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length)" };
        }
 
        public static IEnumerable<object[]> VisualBasicNamedArgumentsFullBufferTestData()
        {
            // Normal argument order is: (byte[] buffer, int offset, int count)
            yield return new object[] { "buffer, offset:=0, count:=buffer.Length",
                                        "buffer" };
            yield return new object[] { "buffer:=buffer, offset:=0, count:=buffer.Length",
                                        "buffer:=buffer" };
            yield return new object[] { "buffer:=buffer, count:=buffer.Length, offset:=0",
                                        "buffer:=buffer" };
            yield return new object[] { "count:=buffer.Length, offset:=0, buffer:=buffer",
                                        "buffer:=buffer" };
            yield return new object[] { "count:=buffer.Length, buffer:=buffer, offset:=0",
                                        "buffer:=buffer" };
            yield return new object[] { "offset:=0, buffer:=buffer, count:=buffer.Length",
                                        "buffer:=buffer" };
            yield return new object[] { "offset:=0, count:=buffer.Length, buffer:=buffer",
                                        "buffer:=buffer" };
        }
 
        public static IEnumerable<object[]> VisualBasicNamedArgumentsWithCancellationTokenPartialBufferTestData()
        {
            // Normal argument order is: (byte[] buffer, int offset, int count, CancellationToken cancellationToken)
            // Cancellation token as fourth argument
            yield return new object[] { "buffer, offset:=1, count:=buffer.Length, cancellationToken:=New CancellationToken()",
                                        "buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "buffer:=buffer, offset:=1, count:=buffer.Length, cancellationToken:=New CancellationToken()",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "buffer:=buffer, count:=buffer.Length, offset:=1, cancellationToken:=New CancellationToken()",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "count:=buffer.Length, offset:=1, buffer:=buffer, cancellationToken:=New CancellationToken()",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "count:=buffer.Length, buffer:=buffer, offset:=1, cancellationToken:=New CancellationToken()",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "offset:=1, buffer:=buffer, count:=buffer.Length, cancellationToken:=New CancellationToken()",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "offset:=1, count:=buffer.Length, buffer:=buffer, cancellationToken:=New CancellationToken()",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            // Cancellation token as third argument
            yield return new object[] { "buffer, offset:=1, cancellationToken:=New CancellationToken(), count:=buffer.Length",
                                        "buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "buffer:=buffer, offset:=1, cancellationToken:=New CancellationToken(), count:=buffer.Length",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "buffer:=buffer, count:=buffer.Length, cancellationToken:=New CancellationToken(), offset:=1",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "count:=buffer.Length, offset:=1, cancellationToken:=New CancellationToken(), buffer:=buffer",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "count:=buffer.Length, buffer:=buffer, cancellationToken:=New CancellationToken(), offset:=1",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "offset:=1, buffer:=buffer, cancellationToken:=New CancellationToken(), count:=buffer.Length",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "offset:=1, count:=buffer.Length, cancellationToken:=New CancellationToken(), buffer:=buffer",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            // Cancellation token as second argument
            yield return new object[] { "buffer, cancellationToken:=New CancellationToken(), offset:=1, count:=buffer.Length",
                                        "buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "buffer:=buffer, cancellationToken:=New CancellationToken(), offset:=1, count:=buffer.Length",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "buffer:=buffer, cancellationToken:=New CancellationToken(), count:=buffer.Length, offset:=1",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "count:=buffer.Length, cancellationToken:=New CancellationToken(), offset:=1, buffer:=buffer",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "count:=buffer.Length, cancellationToken:=New CancellationToken(), buffer:=buffer, offset:=1",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "offset:=1, cancellationToken:=New CancellationToken(), buffer:=buffer, count:=buffer.Length",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "offset:=1, cancellationToken:=New CancellationToken(), count:=buffer.Length, buffer:=buffer",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            // Cancellation token as first argument
            yield return new object[] { "cancellationToken:=New CancellationToken(), buffer:=buffer, offset:=1, count:=buffer.Length",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "cancellationToken:=New CancellationToken(), buffer:=buffer, count:=buffer.Length, offset:=1",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "cancellationToken:=New CancellationToken(), count:=buffer.Length, offset:=1, buffer:=buffer",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "cancellationToken:=New CancellationToken(), count:=buffer.Length, buffer:=buffer, offset:=1",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "cancellationToken:=New CancellationToken(), offset:=1, buffer:=buffer, count:=buffer.Length",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "cancellationToken:=New CancellationToken(), offset:=1, count:=buffer.Length, buffer:=buffer",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
        }
 
        public static IEnumerable<object[]> VisualBasicNamedArgumentsWithCancellationTokenFullBufferTestData()
        {
            // Normal argument order is: (byte[] buffer, int offset, int count, CancellationToken cancellationToken)
            // Cancellation token as fourth argument
            yield return new object[] { "buffer, offset:=0, count:=buffer.Length, cancellationToken:=CancellationToken.None",
                                        "buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "buffer:=buffer, offset:=0, count:=buffer.Length, cancellationToken:=CancellationToken.None",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "buffer:=buffer, count:=buffer.Length, offset:=0, cancellationToken:=CancellationToken.None",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "count:=buffer.Length, offset:=0, buffer:=buffer, cancellationToken:=CancellationToken.None",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "count:=buffer.Length, buffer:=buffer, offset:=0, cancellationToken:=CancellationToken.None",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "offset:=0, buffer:=buffer, count:=buffer.Length, cancellationToken:=CancellationToken.None",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "offset:=0, count:=buffer.Length, buffer:=buffer, cancellationToken:=CancellationToken.None",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            // Cancellation token as third argument
            yield return new object[] { "buffer, offset:=0, cancellationToken:=CancellationToken.None, count:=buffer.Length",
                                        "buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "buffer:=buffer, offset:=0, cancellationToken:=CancellationToken.None, count:=buffer.Length",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "buffer:=buffer, count:=buffer.Length, cancellationToken:=CancellationToken.None, offset:=0",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "count:=buffer.Length, offset:=0, cancellationToken:=CancellationToken.None, buffer:=buffer",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "count:=buffer.Length, buffer:=buffer, cancellationToken:=CancellationToken.None, offset:=0",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "offset:=0, buffer:=buffer, cancellationToken:=CancellationToken.None, count:=buffer.Length",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "offset:=0, count:=buffer.Length, cancellationToken:=CancellationToken.None, buffer:=buffer",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            // Cancellation token as second argument
            yield return new object[] { "buffer, cancellationToken:=CancellationToken.None, offset:=0, count:=buffer.Length",
                                        "buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "buffer:=buffer, cancellationToken:=CancellationToken.None, offset:=0, count:=buffer.Length",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "buffer:=buffer, cancellationToken:=CancellationToken.None, count:=buffer.Length, offset:=0",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "count:=buffer.Length, cancellationToken:=CancellationToken.None, offset:=0, buffer:=buffer",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "count:=buffer.Length, cancellationToken:=CancellationToken.None, buffer:=buffer, offset:=0",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "offset:=0, cancellationToken:=CancellationToken.None, buffer:=buffer, count:=buffer.Length",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "offset:=0, cancellationToken:=CancellationToken.None, count:=buffer.Length, buffer:=buffer",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            // Cancellation token as first argument
            yield return new object[] { "cancellationToken:=CancellationToken.None, buffer:=buffer, offset:=0, count:=buffer.Length",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "cancellationToken:=CancellationToken.None, buffer:=buffer, count:=buffer.Length, offset:=0",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "cancellationToken:=CancellationToken.None, count:=buffer.Length, offset:=0, buffer:=buffer",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "cancellationToken:=CancellationToken.None, count:=buffer.Length, buffer:=buffer, offset:=0",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "cancellationToken:=CancellationToken.None, offset:=0, buffer:=buffer, count:=buffer.Length",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
            yield return new object[] { "cancellationToken:=CancellationToken.None, offset:=0, count:=buffer.Length, buffer:=buffer",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
        }
 
        public static IEnumerable<object[]> VisualBasicNamedArgumentsWrongCaseTestData()
        {
            yield return new object[] { "cOUnt:=buffer.Length, BUFFER:=buffer, offSET:=1",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length)" };
            yield return new object[] { "OffSet:=0, cOUNT:=buffer.Length, BuFfEr:=buffer",
                                        "buffer:=buffer" };
            yield return new object[] { "COUNT:=buffer.Length, oFFSeT:=1, bUffEr:=buffer, CANCELlationtOKEN:=New CancellationToken()",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "CANCELLATIONTOKEN:=New CancellationToken(), OffsEt:=1, BUFFEr:=buffer, cOUnt:=buffer.Length",
                                        "buffer:=buffer.AsMemory(start:=1, length:=buffer.Length), cancellationToken:=New CancellationToken()" };
            yield return new object[] { "COUNT:=buffer.Length, BUFFER:=buffer, CANCELLATIONTOKEN:=CancellationToken.None, OFFSET:=0",
                                        "buffer:=buffer, cancellationToken:=CancellationToken.None" };
        }
    }
}