File: LoaderTestResources.cs
Web Access
Project: ..\..\..\test\Microsoft.NET.Sdk.Razor.Tool.Tests\Microsoft.NET.Sdk.Razor.Tool.Tests.csproj (Microsoft.NET.Sdk.Razor.Tool.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
 
namespace Microsoft.NET.Sdk.Razor.Tool.Tests
{
    internal static class LoaderTestResources
    {
        static LoaderTestResources()
        {
            Delta = CreateAssemblyBlob("Delta", Array.Empty<AssemblyBlob>(), @"
using System.Text;
 
namespace Delta
{
    public class D
    {
        public void Write(StringBuilder sb, string s)
        {
            sb.AppendLine(""Delta: "" + s);
        }
    }
}
");
 
            Gamma = CreateAssemblyBlob("Gamma", new[] { Delta, }, @"
using System.Text;
using Delta;
 
namespace Gamma
{
    public class G
    {
        public void Write(StringBuilder sb, string s)
        {
            D d = new D();
 
            d.Write(sb, ""Gamma: "" + s);
        }
    }
}
");
 
            Alpha = CreateAssemblyBlob("Alpha", new[] { Gamma, }, @"
using System.Text;
using Gamma;
 
namespace Alpha
{
    public class A
    {
        public void Write(StringBuilder sb, string s)
        {
            G g = new G();
 
            g.Write(sb, ""Alpha: "" + s);
        }
    }
}
");
 
            Beta = CreateAssemblyBlob("Beta", new[] { Gamma, }, @"
using System.Text;
using Gamma;
 
namespace Beta
{
    public class B
    {
        public void Write(StringBuilder sb, string s)
        {
            G g = new G();
 
            g.Write(sb, ""Beta: "" + s);
        }
    }
}
");
        }
 
        public static AssemblyBlob Alpha { get; }
 
        public static AssemblyBlob Beta { get; }
 
        public static AssemblyBlob Delta { get; }
 
        public static AssemblyBlob Gamma { get; }
 
        private static AssemblyBlob CreateAssemblyBlob(string assemblyName, AssemblyBlob[] references, string text)
        {
            var defaultReferences = new[]
            {
                MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
            };
 
            var compilation = CSharpCompilation.Create(
                assemblyName,
                new[] { CSharpSyntaxTree.ParseText(text) },
                references.Select(r => r.ToMetadataReference()).Concat(defaultReferences),
                new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
 
            using (var assemblyStream = new MemoryStream())
            using (var symbolStream = new MemoryStream())
            {
                var result = compilation.Emit(assemblyStream, symbolStream);
                Assert.Empty(result.Diagnostics);
 
                return new AssemblyBlob(assemblyName, assemblyStream.GetBuffer(), symbolStream.GetBuffer());
            }
        }
 
        public class AssemblyBlob
        {
            public AssemblyBlob(string assemblyName, byte[] assemblyBytes, byte[] symbolBytes)
            {
                AssemblyName = assemblyName;
                AssemblyBytes = assemblyBytes;
                SymbolBytes = symbolBytes;
            }
 
            public string AssemblyName { get; }
 
            public byte[] AssemblyBytes { get; }
 
            public byte[] SymbolBytes { get; }
 
            public MetadataReference ToMetadataReference()
            {
                return MetadataReference.CreateFromImage(AssemblyBytes);
            }
 
            internal string WriteToFile(string directoryPath, string fileName)
            {
                var filePath = Path.Combine(directoryPath, fileName);
                File.WriteAllBytes(filePath, AssemblyBytes);
                return filePath;
            }
        }
    }
}