File: SolutionUtilities.cs
Web Access
Project: src\src\Workspaces\CoreTestUtilities\Microsoft.CodeAnalysis.Workspaces.Test.Utilities.csproj (Microsoft.CodeAnalysis.Workspaces.Test.Utilities)
// 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.
 
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Test.Utilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.UnitTests
{
    public class SolutionUtilities
    {
        public static ProjectChanges GetSingleChangedProjectChanges(Solution oldSolution, Solution newSolution)
        {
            var solutionDifferences = newSolution.GetChanges(oldSolution);
            var projectChanges = solutionDifferences.GetProjectChanges();
 
            Assert.NotNull(projectChanges);
            Assert.NotEmpty(projectChanges);
 
            var projectId = projectChanges.Single().ProjectId;
 
            var oldProject = oldSolution.GetRequiredProject(projectId);
            var newProject = newSolution.GetRequiredProject(projectId);
 
            return newProject.GetChanges(oldProject);
        }
 
        private static IEnumerable<ProjectChanges> GetChangedProjectChanges(Solution oldSolution, Solution newSolution)
        {
            var solutionDifferences = newSolution.GetChanges(oldSolution);
            return solutionDifferences.GetProjectChanges().Select(n => n.NewProject.GetChanges(n.OldProject));
        }
 
        public static Document GetSingleChangedDocument(Solution oldSolution, Solution newSolution)
        {
            var projectDifferences = GetSingleChangedProjectChanges(oldSolution, newSolution);
            var documentId = projectDifferences.GetChangedDocuments().Single();
 
            return newSolution.GetDocument(documentId)!;
        }
 
        public static TextDocument GetSingleChangedAdditionalDocument(Solution oldSolution, Solution newSolution)
        {
            var projectDifferences = GetSingleChangedProjectChanges(oldSolution, newSolution);
            var documentId = projectDifferences.GetChangedAdditionalDocuments().Single();
 
            return newSolution.GetAdditionalDocument(documentId)!;
        }
 
        public static IEnumerable<DocumentId> GetChangedDocuments(Solution oldSolution, Solution newSolution)
        {
            var changedDocuments = new List<DocumentId>();
            var projectsDifference = GetChangedProjectChanges(oldSolution, newSolution);
            foreach (var projectDifference in projectsDifference)
            {
                changedDocuments.AddRange(projectDifference.GetChangedDocuments());
            }
 
            return changedDocuments;
        }
 
        public static Document GetSingleAddedDocument(Solution oldSolution, Solution newSolution)
        {
            var projectDifferences = GetSingleChangedProjectChanges(oldSolution, newSolution);
            var documentId = projectDifferences.GetAddedDocuments().Single();
 
            return newSolution.GetDocument(documentId)!;
        }
 
        public static IEnumerable<DocumentId> GetTextChangedDocuments(Solution oldSolution, Solution newSolution)
        {
            var changedDocuments = new List<DocumentId>();
            var projectsDifference = GetChangedProjectChanges(oldSolution, newSolution);
            foreach (var projectDifference in projectsDifference)
            {
                changedDocuments.AddRange(projectDifference.GetChangedDocuments(onlyGetDocumentsWithTextChanges: true));
            }
 
            return changedDocuments;
        }
 
        public static IEnumerable<DocumentId> GetAddedDocuments(Solution oldSolution, Solution newSolution)
        {
            var addedDocuments = new List<DocumentId>();
            var projectsDifference = GetChangedProjectChanges(oldSolution, newSolution);
            foreach (var projectDifference in projectsDifference)
            {
                addedDocuments.AddRange(projectDifference.GetAddedDocuments());
            }
 
            return addedDocuments;
        }
 
        public static Tuple<Project, ProjectReference> GetSingleAddedProjectReference(Solution oldSolution, Solution newSolution)
        {
            var projectChanges = GetSingleChangedProjectChanges(oldSolution, newSolution);
            return Tuple.Create(projectChanges.NewProject, projectChanges.GetAddedProjectReferences().Single());
        }
 
        public static Project AddEmptyProject(Solution solution, string languageName = LanguageNames.CSharp, string name = "TestProject")
        {
            var id = ProjectId.CreateNewId();
            return solution.AddProject(
                ProjectInfo.Create(
                    id,
                    VersionStamp.Default,
                    name: name,
                    assemblyName: name,
                    language: languageName)
                    .WithCompilationOutputInfo(new CompilationOutputInfo(
                        assemblyPath: Path.Combine(TempRoot.Root, name),
                        generatedFilesOutputDirectory: null)))
                .GetRequiredProject(id);
        }
    }
}