public void PortablePdb_DeterministicCompilation(CSharpCompilationOptions compilationOptions, EmitOptions emitOptions, CSharpParseOptions parseOptions)
        {
            var sourceOne = Parse(@"
using System;

class MainType
{
    public static void Main()
    {
        Console.WriteLine();
    }
}
", filename: "a.cs", options: parseOptions, encoding: Encoding.UTF8);

            var sourceTwo = Parse(@"
class TypeTwo
{
}", filename: "b.cs", options: parseOptions, encoding: new UTF8Encoding(encoderShouldEmitUTF8Identifier: false));

            var sourceThree = Parse(@"
class TypeThree
{
}", filename: "c.cs", options: parseOptions, encoding: Encoding.Unicode);

            var referenceOneCompilation = CreateCompilation(
                @"public struct StructWithReference
{
    string PrivateData;
}
public struct StructWithValue
{
    int PrivateData;
}", options: TestOptions.DebugDll);

            var referenceTwoCompilation = CreateCompilation(
                @"public class ReferenceTwo
{
}", options: TestOptions.DebugDll);

            using var referenceOne = TestMetadataReferenceInfo.Create(
                      referenceOneCompilation,
                      fullPath: "abcd.dll",
                      emitOptions: emitOptions);

            using var referenceTwo = TestMetadataReferenceInfo.Create(
                      referenceTwoCompilation,
                      fullPath: "efgh.dll",
                      emitOptions: emitOptions);

            var testSource = new[] { sourceOne, sourceTwo, sourceThree };

            TestDeterministicCompilationCSharp(
                parseOptions.LanguageVersion.MapSpecifiedToEffectiveVersion().ToDisplayString(),
                testSource,
                compilationOptions,
                emitOptions,
                new[] { referenceOne, referenceTwo });
        }
        public void PortablePdb_DeterministicCompilation_DuplicateFilePaths(CSharpCompilationOptions compilationOptions, EmitOptions emitOptions, CSharpParseOptions parseOptions)
        {
            var sourceOne = Parse(@"
using System;

class MainType
{
    public static void Main()
    {
        Console.WriteLine();
    }
}
", filename: "a.cs", options: parseOptions, encoding: Encoding.UTF8);

            var sourceTwo = Parse(@"
class TypeTwo
{
}", filename: "b.cs", options: parseOptions, encoding: new UTF8Encoding(encoderShouldEmitUTF8Identifier: false));

            var sourceThree = Parse(@"
class TypeThree
{
}", filename: "a.cs", options: parseOptions, encoding: Encoding.Unicode);

            var referenceOneCompilation = CreateCompilation(
                @"public struct StructWithReference
{
    string PrivateData;
}
public struct StructWithValue
{
    int PrivateData;
}", options: TestOptions.DebugDll);

            var referenceTwoCompilation = CreateCompilation(
                @"public class ReferenceTwo
{
}", options: TestOptions.DebugDll);

            using var referenceOne = TestMetadataReferenceInfo.Create(
                      referenceOneCompilation,
                      fullPath: "abcd.dll",
                      emitOptions: emitOptions);

            using var referenceTwo = TestMetadataReferenceInfo.Create(
                      referenceTwoCompilation,
                      fullPath: "efgh.dll",
                      emitOptions: emitOptions);

            var testSource = new[] { sourceOne, sourceTwo, sourceThree };

            // Note that only one debug document can be present for each distinct source path.
            // So if more than one syntax tree has the same file path, it won't be possible to do a rebuild from the DLL+PDB.
            TestDeterministicCompilationCSharp(
                parseOptions.LanguageVersion.MapSpecifiedToEffectiveVersion().ToDisplayString(),
                testSource,
                compilationOptions,
                emitOptions,
                new[] { referenceOne, referenceTwo },
                debugDocumentsCount: 2);
        }