File: CommandLineProject\CommandLineProjectTests.cs
Web Access
Project: src\src\Workspaces\CoreTest\Microsoft.CodeAnalysis.Workspaces.UnitTests.csproj (Microsoft.CodeAnalysis.Workspaces.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
#nullable disable
 
using System;
using System.Composition.Hosting;
using System.IO;
using System.Linq;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.Test.Utilities;
using Roslyn.Test.Utilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.UnitTests;
 
[UseExportProvider]
public sealed class CommandLineProjectTests : TestBase
{
    [Fact, Trait(Traits.Feature, Traits.Features.Workspace)]
    public void TestCommandLineProjectWithRelativePathOutsideProjectCone()
    {
        var commandLine = @"..\goo.cs";
        var info = CommandLineProject.CreateProjectInfo("TestProject", LanguageNames.CSharp, commandLine, @"C:\ProjectDirectory");
 
        var docInfo = info.Documents.First();
        Assert.Equal(0, docInfo.Folders.Count);
        Assert.Equal("goo.cs", docInfo.Name);
    }
 
    [Fact]
    public void TestCreateWithoutRequiredServices()
    {
        var commandLine = @"goo.cs";
 
        Assert.Throws<InvalidOperationException>(delegate
        {
            var ws = new AdhocWorkspace(new MefHostServices(new ContainerConfiguration().CreateContainer())); // no services
            var info = CommandLineProject.CreateProjectInfo("TestProject", LanguageNames.CSharp, commandLine, @"C:\ProjectDirectory", ws);
        });
    }
 
    [Fact]
    public void TestCreateWithRequiredServices()
    {
        var commandLine = @"goo.cs";
        var ws = new AdhocWorkspace();
        _ = CommandLineProject.CreateProjectInfo("TestProject", LanguageNames.CSharp, commandLine, @"C:\ProjectDirectory", ws);
    }
 
    [Fact]
    public void TestUnrootedPathInsideProjectCone()
    {
        var commandLine = @"goo.cs";
        var info = CommandLineProject.CreateProjectInfo("TestProject", LanguageNames.CSharp, commandLine, @"C:\ProjectDirectory");
 
        var docInfo = info.Documents.First();
        Assert.Equal(0, docInfo.Folders.Count);
        Assert.Equal("goo.cs", docInfo.Name);
    }
 
    [Fact]
    public void TestUnrootedSubPathInsideProjectCone()
    {
        var commandLine = @"subdir\goo.cs";
        var info = CommandLineProject.CreateProjectInfo("TestProject", LanguageNames.CSharp, commandLine, @"C:\ProjectDirectory");
 
        var docInfo = info.Documents.First();
        Assert.Equal(1, docInfo.Folders.Count);
        Assert.Equal("subdir", docInfo.Folders[0]);
        Assert.Equal("goo.cs", docInfo.Name);
    }
 
    [Fact]
    public void TestRootedPathInsideProjectCone()
    {
        var commandLine = @"c:\ProjectDirectory\goo.cs";
        var info = CommandLineProject.CreateProjectInfo("TestProject", LanguageNames.CSharp, commandLine, @"C:\ProjectDirectory");
 
        var docInfo = info.Documents.First();
        Assert.Equal(0, docInfo.Folders.Count);
        Assert.Equal("goo.cs", docInfo.Name);
    }
 
    [Fact]
    public void TestRootedSubPathInsideProjectCone()
    {
        var commandLine = @"c:\projectDirectory\subdir\goo.cs";
        var info = CommandLineProject.CreateProjectInfo("TestProject", LanguageNames.CSharp, commandLine, @"C:\ProjectDirectory");
 
        var docInfo = info.Documents.First();
        Assert.Equal(1, docInfo.Folders.Count);
        Assert.Equal("subdir", docInfo.Folders[0]);
        Assert.Equal("goo.cs", docInfo.Name);
    }
 
    [Fact]
    public void TestRootedPathOutsideProjectCone()
    {
        var commandLine = @"C:\SomeDirectory\goo.cs";
        var info = CommandLineProject.CreateProjectInfo("TestProject", LanguageNames.CSharp, commandLine, @"C:\ProjectDirectory");
 
        var docInfo = info.Documents.First();
        Assert.Equal(0, docInfo.Folders.Count);
        Assert.Equal("goo.cs", docInfo.Name);
    }
 
    [Fact]
    public void TestUnrootedPathOutsideProjectCone()
    {
        var commandLine = @"..\goo.cs";
        var info = CommandLineProject.CreateProjectInfo("TestProject", LanguageNames.CSharp, commandLine, @"C:\ProjectDirectory");
 
        var docInfo = info.Documents.First();
        Assert.Equal(0, docInfo.Folders.Count);
        Assert.Equal("goo.cs", docInfo.Name);
    }
 
    [Fact]
    public void TestAdditionalFiles()
    {
        var commandLine = @"goo.cs /additionalfile:bar.cs";
        var info = CommandLineProject.CreateProjectInfo("TestProject", LanguageNames.CSharp, commandLine, @"C:\ProjectDirectory");
 
        var firstDoc = info.Documents.Single();
        var secondDoc = info.AdditionalDocuments.Single();
        Assert.Equal("goo.cs", firstDoc.Name);
        Assert.Equal("bar.cs", secondDoc.Name);
    }
 
    [Fact]
    public void TestAnalyzerConfigFiles()
    {
        var commandLine = @"/analyzerconfig:.editorconfig";
        var info = CommandLineProject.CreateProjectInfo("TestProject", LanguageNames.CSharp, commandLine, @"C:\ProjectDirectory");
 
        var document = Assert.Single(info.AnalyzerConfigDocuments);
        Assert.Equal(".editorconfig", document.Name);
        Assert.Equal(Path.Combine(@"C:\ProjectDirectory", ".editorconfig"), document.FilePath);
    }
 
    [Fact]
    public void TestAnalyzerReferences()
    {
        var pathToAssembly = typeof(object).Assembly.Location;
        var assemblyBaseDir = Path.GetDirectoryName(pathToAssembly);
        var relativePath = Path.Combine(".", Path.GetFileName(pathToAssembly));
        var commandLine = @"goo.cs /a:" + relativePath;
        var info = CommandLineProject.CreateProjectInfo("TestProject", LanguageNames.CSharp, commandLine, assemblyBaseDir);
 
        var firstDoc = info.Documents.Single();
        var analyzerRef = info.AnalyzerReferences.Single();
        Assert.Equal("goo.cs", firstDoc.Name);
        Assert.Equal(pathToAssembly, analyzerRef.FullPath);
    }
 
    [Fact]
    public void TestDuplicateAnalyzerReferences()
    {
        var pathToAssembly = typeof(object).Assembly.Location;
        var assemblyBaseDir = Path.GetDirectoryName(pathToAssembly);
        var relativePath = Path.Combine(".", Path.GetFileName(pathToAssembly));
        var commandLine = $@"goo.cs /a:{relativePath} /a:{relativePath}";
        var info = CommandLineProject.CreateProjectInfo("TestProject", LanguageNames.CSharp, commandLine, assemblyBaseDir);
 
        var analyzerRef = info.AnalyzerReferences.Single();
        Assert.Equal(pathToAssembly, analyzerRef.FullPath);
    }
 
    [Fact]
    public void TestDuplicateReferenceInVisualBasic()
    {
        var pathToAssembly = typeof(object).Assembly.Location;
        var quotedPathToAssembly = '"' + pathToAssembly + '"';
        var commandLine = $"goo.vb /r:{quotedPathToAssembly},{quotedPathToAssembly}";
        var info = CommandLineProject.CreateProjectInfo("TestProject", LanguageNames.VisualBasic, commandLine, baseDirectory: @"C:\ProjectDirectory");
 
        // The compiler may add other references automatically, so we'll only assert a single reference for the one we're interested in
        Assert.Single(info.MetadataReferences.OfType<PortableExecutableReference>(), r => r.FilePath == pathToAssembly);
    }
 
    [Fact]
    public void TestDuplicateReferenceInVisualBasicWithVbRuntimeFlag()
    {
        var pathToAssembly = typeof(object).Assembly.Location;
        var quotedPathToAssembly = '"' + pathToAssembly + '"';
        var commandLine = $"goo.vb /r:{quotedPathToAssembly} /vbruntime:{quotedPathToAssembly}";
        var info = CommandLineProject.CreateProjectInfo("TestProject", LanguageNames.VisualBasic, commandLine, baseDirectory: @"C:\ProjectDirectory");
 
        // The compiler may add other references automatically, so we'll only assert a single reference for the one we're interested in
        Assert.Single(info.MetadataReferences.OfType<PortableExecutableReference>(), r => r.FilePath == pathToAssembly);
    }
}