コード例 #1
0
 public static ITestEnvironment Empty()
 {
     return(TestEnvironment.Create(ctx => { }));
 }
コード例 #2
0
        public void SdkImportsAreInPreprocessedOutput()
        {
            using (TestEnvironment env = TestEnvironment.Create())
            {
                string testSdkDirectory = env.CreateFolder().FolderPath;

                env.WithTransientTestState(new TransientSdkResolution(new Dictionary <string, string>
                {
                    { "MSBuildUnitTestSdk", testSdkDirectory }
                }));


                string sdkPropsPath   = Path.Combine(testSdkDirectory, "Sdk.props");
                string sdkTargetsPath = Path.Combine(testSdkDirectory, "Sdk.targets");

                File.WriteAllText(sdkPropsPath, @"<Project>
    <PropertyGroup>
        <SdkPropsImported>true</SdkPropsImported>
    </PropertyGroup>
</Project>");
                File.WriteAllText(sdkTargetsPath, @"<Project>
    <PropertyGroup>
        <SdkTargetsImported>true</SdkTargetsImported>
    </PropertyGroup>
</Project>");


                string content = @"<Project Sdk='MSBuildUnitTestSdk'>
  <PropertyGroup>
    <p>v1</p>
  </PropertyGroup>
</Project>";

                Project project = new Project(ProjectRootElement.Create(XmlReader.Create(new StringReader(content))));

                StringWriter writer = new StringWriter();

                project.SaveLogicalProject(writer);

                string expected = ObjectModelHelpers.CleanupFileContents(
                    $@"<?xml version=""1.0"" encoding=""utf-16""?>
<Project>
  <!--
============================================================================================================================================
  <Import Project=""Sdk.props"" Sdk=""MSBuildUnitTestSdk"">
  This import was added implicitly because of the Project element's Sdk attribute specified ""MSBuildUnitTestSdk"".

{sdkPropsPath}
============================================================================================================================================
-->
  <PropertyGroup>
    <SdkPropsImported>true</SdkPropsImported>
  </PropertyGroup>
  <!--
============================================================================================================================================
  </Import>


============================================================================================================================================
-->
  <PropertyGroup>
    <p>v1</p>
  </PropertyGroup>
  <!--
============================================================================================================================================
  <Import Project=""Sdk.targets"" Sdk=""MSBuildUnitTestSdk"">
  This import was added implicitly because of the Project element's Sdk attribute specified ""MSBuildUnitTestSdk"".

{sdkTargetsPath}
============================================================================================================================================
-->
  <PropertyGroup>
    <SdkTargetsImported>true</SdkTargetsImported>
  </PropertyGroup>
  <!--
============================================================================================================================================
  </Import>


============================================================================================================================================
-->
</Project>");
                Helpers.VerifyAssertLineByLine(expected, writer.ToString());
            }
        }
コード例 #3
0
        public void ImportedProjectsSdkImportsAreInPreprocessedOutput()
        {
            using (TestEnvironment env = TestEnvironment.Create())
            {
                string sdk1 = env.CreateFolder().Path;
                string sdk2 = env.CreateFolder().Path;

                var projectOptions = SdkUtilities.CreateProjectOptionsWithResolver(new SdkUtilities.FileBasedMockSdkResolver(new Dictionary <string, string>
                {
                    { "MSBuildUnitTestSdk1", sdk1 },
                    { "MSBuildUnitTestSdk2", sdk2 },
                }));

                string sdkPropsPath1   = Path.Combine(sdk1, "Sdk.props");
                string sdkTargetsPath1 = Path.Combine(sdk1, "Sdk.targets");

                File.WriteAllText(sdkPropsPath1, @"<Project>
    <PropertyGroup>
        <SdkProps1Imported>true</SdkProps1Imported>
    </PropertyGroup>
</Project>");
                File.WriteAllText(sdkTargetsPath1, @"<Project>
    <PropertyGroup>
        <SdkTargets1Imported>true</SdkTargets1Imported>
    </PropertyGroup>
</Project>");

                string sdkPropsPath2   = Path.Combine(sdk2, "Sdk.props");
                string sdkTargetsPath2 = Path.Combine(sdk2, "Sdk.targets");

                File.WriteAllText(sdkPropsPath2, @"<Project>
    <PropertyGroup>
        <SdkProps2Imported>true</SdkProps2Imported>
    </PropertyGroup>
</Project>");
                File.WriteAllText(sdkTargetsPath2, @"<Project>
    <PropertyGroup>
        <SdkTargets2Imported>true</SdkTargets2Imported>
    </PropertyGroup>
</Project>");


                TransientTestProjectWithFiles import = env.CreateTestProjectWithFiles(@"<Project Sdk='MSBuildUnitTestSdk2'>
    <PropertyGroup>
        <MyImportWasImported>true</MyImportWasImported>
    </PropertyGroup>
</Project>");
                string importPath = Path.GetFullPath(import.ProjectFile);
                string content    = $@"<Project Sdk='MSBuildUnitTestSdk1'>
  <Import Project='{importPath}' />
  <PropertyGroup>
    <p>v1</p>
  </PropertyGroup>
</Project>";

                Project project = Project.FromProjectRootElement(
                    ProjectRootElement.Create(XmlReader.Create(new StringReader(content))),
                    projectOptions);

                StringWriter writer = new StringWriter();

                project.SaveLogicalProject(writer);

                string expected = ObjectModelHelpers.CleanupFileContents(
                    $@"<?xml version=""1.0"" encoding=""utf-16""?>
<Project>
  <!--
============================================================================================================================================
  <Import Project=""Sdk.props"" Sdk=""MSBuildUnitTestSdk1"">
  This import was added implicitly because the Project element's Sdk attribute specified ""MSBuildUnitTestSdk1"".

{sdkPropsPath1.Replace("--", "__")}
============================================================================================================================================
-->
  <PropertyGroup>
    <SdkProps1Imported>true</SdkProps1Imported>
  </PropertyGroup>
  <!--
============================================================================================================================================
  </Import>


============================================================================================================================================
-->
  <!--
============================================================================================================================================
  <Import Project=""{importPath.Replace("--", "__")}"">

{importPath.Replace("--", "__")}
============================================================================================================================================
-->
  <!--
============================================================================================================================================
  <Import Project=""Sdk.props"" Sdk=""MSBuildUnitTestSdk2"">
  This import was added implicitly because the Project element's Sdk attribute specified ""MSBuildUnitTestSdk2"".

{sdkPropsPath2.Replace("--", "__")}
============================================================================================================================================
-->
  <PropertyGroup>
    <SdkProps2Imported>true</SdkProps2Imported>
  </PropertyGroup>
  <!--
============================================================================================================================================
  </Import>

{importPath.Replace("--", "__")}
============================================================================================================================================
-->
  <PropertyGroup>
    <MyImportWasImported>true</MyImportWasImported>
  </PropertyGroup>
  <!--
============================================================================================================================================
  <Import Project=""Sdk.targets"" Sdk=""MSBuildUnitTestSdk2"">
  This import was added implicitly because the Project element's Sdk attribute specified ""MSBuildUnitTestSdk2"".

{sdkTargetsPath2.Replace("--", "__")}
============================================================================================================================================
-->
  <PropertyGroup>
    <SdkTargets2Imported>true</SdkTargets2Imported>
  </PropertyGroup>
  <!--
============================================================================================================================================
  </Import>

{importPath.Replace("--", "__")}
============================================================================================================================================
-->
  <!--
============================================================================================================================================
  </Import>


============================================================================================================================================
-->
  <PropertyGroup>
    <p>v1</p>
  </PropertyGroup>
  <!--
============================================================================================================================================
  <Import Project=""Sdk.targets"" Sdk=""MSBuildUnitTestSdk1"">
  This import was added implicitly because the Project element's Sdk attribute specified ""MSBuildUnitTestSdk1"".

{sdkTargetsPath1.Replace("--", "__")}
============================================================================================================================================
-->
  <PropertyGroup>
    <SdkTargets1Imported>true</SdkTargets1Imported>
  </PropertyGroup>
  <!--
============================================================================================================================================
  </Import>


============================================================================================================================================
-->
</Project>");
                Helpers.VerifyAssertLineByLine(expected, writer.ToString());
            }
        }
コード例 #4
0
 public ResultCacheBasedBuilds_Tests(ITestOutputHelper output)
 {
     _output = output;
     _env    = TestEnvironment.Create(_output);
     _logger = new MockLogger(_output);
 }
コード例 #5
0
        public void SolutionFilterFiltersProjects(bool graphBuild)
        {
            using (TestEnvironment testEnvironment = TestEnvironment.Create())
            {
                TransientTestFolder folder            = testEnvironment.CreateFolder(createFolder: true);
                TransientTestFolder classLibFolder    = testEnvironment.CreateFolder(Path.Combine(folder.Path, "ClassLibrary"), createFolder: true);
                TransientTestFolder classLibSubFolder = testEnvironment.CreateFolder(Path.Combine(classLibFolder.Path, "ClassLibrary"), createFolder: true);
                TransientTestFile   classLibrary      = testEnvironment.CreateFile(classLibSubFolder, "ClassLibrary.csproj",
                                                                                   @"<Project>
                  <Target Name=""ClassLibraryTarget"">
                      <Message Text=""ClassLibraryBuilt""/>
                  </Target>
                  </Project>
                    ");

                TransientTestFolder simpleProjectFolder    = testEnvironment.CreateFolder(Path.Combine(folder.Path, "SimpleProject"), createFolder: true);
                TransientTestFolder simpleProjectSubFolder = testEnvironment.CreateFolder(Path.Combine(simpleProjectFolder.Path, "SimpleProject"), createFolder: true);
                TransientTestFile   simpleProject          = testEnvironment.CreateFile(simpleProjectSubFolder, "SimpleProject.csproj",
                                                                                        @"<Project DefaultTargets=""SimpleProjectTarget"">
                  <Target Name=""SimpleProjectTarget"">
                      <Message Text=""SimpleProjectBuilt""/>
                  </Target>
                  </Project>
                    ");
                // Slashes here (and in the .slnf) are hardcoded as backslashes intentionally to support the common case.
                TransientTestFile solutionFile = testEnvironment.CreateFile(simpleProjectFolder, "SimpleProject.sln",
                                                                            @"
                    Microsoft Visual Studio Solution File, Format Version 12.00
                    # Visual Studio Version 16
                    VisualStudioVersion = 16.0.29326.124
                    MinimumVisualStudioVersion = 10.0.40219.1
                    Project(""{9A19103F-16F7-4668-BE54-9A1E7A4F7556}"") = ""SimpleProject"", ""SimpleProject\SimpleProject.csproj"", ""{79B5EBA6-5D27-4976-BC31-14422245A59A}""
                    EndProject
                    Project(""{9A19103F-16F7-4668-BE54-9A1E7A4F7556}"") = ""ClassLibrary"", ""..\ClassLibrary\ClassLibrary\ClassLibrary.csproj"", ""{8EFCCA22-9D51-4268-90F7-A595E11FCB2D}""
                    EndProject
                    Global
                        GlobalSection(SolutionConfigurationPlatforms) = preSolution
                            Debug|Any CPU = Debug|Any CPU
                            Release|Any CPU = Release|Any CPU
                            EndGlobalSection
                        GlobalSection(ProjectConfigurationPlatforms) = postSolution
                            {79B5EBA6-5D27-4976-BC31-14422245A59A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
                            {79B5EBA6-5D27-4976-BC31-14422245A59A}.Debug|Any CPU.Build.0 = Debug|Any CPU
                            {79B5EBA6-5D27-4976-BC31-14422245A59A}.Release|Any CPU.ActiveCfg = Release|Any CPU
                            {79B5EBA6-5D27-4976-BC31-14422245A59A}.Release|Any CPU.Build.0 = Release|Any CPU
                            {8EFCCA22-9D51-4268-90F7-A595E11FCB2D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
                            {8EFCCA22-9D51-4268-90F7-A595E11FCB2D}.Debug|Any CPU.Build.0 = Debug|Any CPU
                            {8EFCCA22-9D51-4268-90F7-A595E11FCB2D}.Release|Any CPU.ActiveCfg = Release|Any CPU
                            {8EFCCA22-9D51-4268-90F7-A595E11FCB2D}.Release|Any CPU.Build.0 = Release|Any CPU
                            {06A4DD1B-5027-41EF-B72F-F586A5A83EA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
                            {06A4DD1B-5027-41EF-B72F-F586A5A83EA5}.Debug|Any CPU.Build.0 = Debug|Any CPU
                            {06A4DD1B-5027-41EF-B72F-F586A5A83EA5}.Release|Any CPU.ActiveCfg = Release|Any CPU
                            {06A4DD1B-5027-41EF-B72F-F586A5A83EA5}.Release|Any CPU.Build.0 = Release|Any CPU
                        EndGlobalSection
                        GlobalSection(SolutionProperties) = preSolution
                            HideSolutionNode = FALSE
                        EndGlobalSection
                        GlobalSection(ExtensibilityGlobals) = postSolution
                            SolutionGuid = {DE7234EC-0C4D-4070-B66A-DCF1B4F0CFEF}
                        EndGlobalSection
                    EndGlobal
                ");
                TransientTestFile filterFile = testEnvironment.CreateFile(folder, "solutionFilter.slnf",
                                                                          @"
                {
                  ""solution"": {
                    // I'm a comment
                    ""path"": "".\\SimpleProject\\SimpleProject.sln"",
                    ""projects"": [
                    /* ""..\\ClassLibrary\\ClassLibrary\\ClassLibrary.csproj"", */
                      ""SimpleProject\\SimpleProject.csproj"",
                    ]
                    }
                }
                ");
                Directory.GetCurrentDirectory().ShouldNotBe(Path.GetDirectoryName(filterFile.Path));
                if (graphBuild)
                {
                    ProjectCollection projectCollection = testEnvironment.CreateProjectCollection().Collection;
                    MockLogger        logger            = new();
                    projectCollection.RegisterLogger(logger);
                    ProjectGraphEntryPoint entryPoint = new(filterFile.Path, new Dictionary <string, string>());

                    // We only need to construct the graph, since that tells us what would build if we were to build it.
                    ProjectGraph graphFromSolution = new(entryPoint, projectCollection);
                    logger.AssertNoErrors();
                    graphFromSolution.ProjectNodes.ShouldHaveSingleItem();
                    graphFromSolution.ProjectNodes.Single().ProjectInstance.ProjectFileLocation.LocationString.ShouldBe(simpleProject.Path);
                }
                else
                {
                    SolutionFile      solution   = SolutionFile.Parse(filterFile.Path);
                    ILoggingService   mockLogger = CreateMockLoggingService();
                    ProjectInstance[] instances  = SolutionProjectGenerator.Generate(solution, null, null, _buildEventContext, mockLogger);
                    instances.ShouldHaveSingleItem();

                    // Check that dependencies are built, and non-dependencies in the .sln are not.
                    MockLogger logger = new(output);
                    instances[0].Build(targets: null, new List <ILogger> {
                        logger
                    }).ShouldBeTrue();
                    logger.AssertLogContains(new string[] { "SimpleProjectBuilt" });
                    logger.AssertLogDoesntContain("ClassLibraryBuilt");
                }
            }
        }
コード例 #6
0
        private static void AssertLoggingEvents(
            Action <Project, MockLogger> loggingTest             = null,
            MockLogger firstEvaluationLogger                     = null,
            Func <Project, MockLogger> reevaluationLoggerFactory = null)
        {
            var projectImportContents =
                @"<Project>
                    <Target Name=`Foo`
                            AfterTargets=`X`
                            BeforeTargets=`Y`
                    >
                    </Target>

                    <PropertyGroup>
                      <P>Bar</P>
                      <P2>$(NonExisting)</P2>
                    </PropertyGroup>
                  </Project>".Cleanup();

            var projectContents =
                @"<Project>
                    <Target Name=`Foo`>
                    </Target>

                    <PropertyGroup>
                      <P>Foo</P>
                    </PropertyGroup>

                    <Import Project=`{0}`/>
                    <Import Project=`{0}`/>
                  </Project>".Cleanup();

            using (var env = TestEnvironment.Create())
            {
                var collection = env.CreateProjectCollection().Collection;

                var importFile = env.CreateFile().Path;
                File.WriteAllText(importFile, projectImportContents);

                projectContents = string.Format(projectContents, importFile);

                var projectFile = env.CreateFile().Path;
                File.WriteAllText(projectFile, projectContents);

                firstEvaluationLogger ??= new MockLogger();
                collection.RegisterLogger(firstEvaluationLogger);

                var project = new Project(projectFile, null, null, collection);

                firstEvaluationLogger.AllBuildEvents.ShouldNotBeEmpty();

                if (reevaluationLoggerFactory != null)
                {
                    var reevaluationLogger = reevaluationLoggerFactory.Invoke(project);
                    collection.RegisterLogger(reevaluationLogger);

                    project.SetProperty("aProperty", "Value");
                    project.ReevaluateIfNecessary();

                    reevaluationLogger.AllBuildEvents.ShouldNotBeEmpty();
                }

                loggingTest?.Invoke(project, firstEvaluationLogger);
            }
        }
コード例 #7
0
        public void LazyWildcardExpansionDoesNotEvaluateWildCardsIfNotReferenced()
        {
            var content = @"
<Project>
   <Import Project=`foo/*.props`/>
   <ItemGroup>
      <i Include=`**/foo/**/*.cs`/>
      <i2 Include=`**/bar/**/*.cs`/>
   </ItemGroup>

   <ItemGroup>
      <ItemReference Include=`@(i)`/>
      <FullPath Include=`@(i->'%(FullPath)')`/>
      <Identity Include=`@(i->'%(Identity)')`/>
      <RecursiveDir Include=`@(i->'%(RecursiveDir)')`/>
   </ItemGroup>
</Project>
".Cleanup();

            var import = @"
<Project>
   <PropertyGroup>
      <FromImport>true</FromImport>
   </PropertyGroup>
</Project>
".Cleanup();

            using (var env = TestEnvironment.Create())
            {
                var projectFiles = env.CreateTestProjectWithFiles(content, new[] { "foo/extra.props", "foo/a.cs", "foo/b.cs", "bar/c.cs", "bar/d.cs" });

                File.WriteAllText(projectFiles.CreatedFiles[0], import);

                env.SetEnvironmentVariable("MsBuildSkipEagerWildCardEvaluationRegexes", ".*foo.*");

                EngineFileUtilities.CaptureLazyWildcardRegexes();

                var project = new Project(projectFiles.ProjectFile);

                Assert.Equal("true", project.GetPropertyValue("FromImport"));
                Assert.Equal("**/foo/**/*.cs", project.GetConcatenatedItemsOfType("i"));

                var expectedItems = "bar\\c.cs;bar\\d.cs";

                if (!NativeMethodsShared.IsWindows)
                {
                    expectedItems = expectedItems.ToSlash();
                }

                Assert.Equal(expectedItems, project.GetConcatenatedItemsOfType("i2"));

                var fullPathItems = project.GetConcatenatedItemsOfType("FullPath");
                Assert.Contains("a.cs", fullPathItems);
                Assert.Contains("b.cs", fullPathItems);

                var identityItems = project.GetConcatenatedItemsOfType("Identity");
                Assert.Contains("a.cs", identityItems);
                Assert.Contains("b.cs", identityItems);

                // direct item references do not expand the lazy wildcard
                Assert.Equal("**/foo/**/*.cs", project.GetConcatenatedItemsOfType("ItemReference"));

                // recursive dir does not work with lazy wildcards
                Assert.Equal(string.Empty, project.GetConcatenatedItemsOfType("RecursiveDir"));
            }
        }
コード例 #8
0
ファイル: Preprocessor_Tests.cs プロジェクト: enricosada/sln
        public void SdkImportsAreInPreprocessedOutput()
        {
            var testSdkRoot      = Path.Combine(Path.GetTempPath(), "MSBuildUnitTest");
            var testSdkDirectory = Path.Combine(testSdkRoot, "MSBuildUnitTestSdk", "Sdk");

            try
            {
                Directory.CreateDirectory(testSdkDirectory);

                string sdkPropsPath   = Path.Combine(testSdkDirectory, "Sdk.props");
                string sdkTargetsPath = Path.Combine(testSdkDirectory, "Sdk.targets");

                File.WriteAllText(sdkPropsPath, @"<Project>
    <PropertyGroup>
        <SdkPropsImported>true</SdkPropsImported>
    </PropertyGroup>
</Project>");
                File.WriteAllText(sdkTargetsPath, @"<Project>
    <PropertyGroup>
        <SdkTargetsImported>true</SdkTargetsImported>
    </PropertyGroup>
</Project>");

                using (var env = TestEnvironment.Create())
                {
                    env.SetEnvironmentVariable("MSBuildSDKsPath", testSdkRoot);
                    string content = @"<Project Sdk='MSBuildUnitTestSdk'>
  <PropertyGroup>
    <p>v1</p>
  </PropertyGroup>
</Project>";

                    var project = new  Project(ProjectRootElement.Create(XmlReader.Create(new StringReader(content))));

                    StringWriter writer = new StringWriter();

                    project.SaveLogicalProject(writer);

                    string expected = ObjectModelHelpers.CleanupFileContents(
                        $@"<?xml version=""1.0"" encoding=""utf-16""?>
<Project>
  <!--
============================================================================================================================================
  <Import Project=""Sdk.props"" Sdk=""MSBuildUnitTestSdk"">
  This import was added implicitly because of the Project element's Sdk attribute specified ""MSBuildUnitTestSdk"".

{sdkPropsPath}
============================================================================================================================================
-->
  <PropertyGroup>
    <SdkPropsImported>true</SdkPropsImported>
  </PropertyGroup>
  <!--
============================================================================================================================================
  </Import>


============================================================================================================================================
-->
  <PropertyGroup>
    <p>v1</p>
  </PropertyGroup>
  <!--
============================================================================================================================================
  <Import Project=""Sdk.targets"" Sdk=""MSBuildUnitTestSdk"">
  This import was added implicitly because of the Project element's Sdk attribute specified ""MSBuildUnitTestSdk"".

{sdkTargetsPath}
============================================================================================================================================
-->
  <PropertyGroup>
    <SdkTargetsImported>true</SdkTargetsImported>
  </PropertyGroup>
  <!--
============================================================================================================================================
  </Import>


============================================================================================================================================
-->
</Project>");
                    Helpers.VerifyAssertLineByLine(expected, writer.ToString());
                }
            }
            finally
            {
                if (Directory.Exists(testSdkDirectory))
                {
                    FileUtilities.DeleteWithoutTrailingBackslash(testSdkDirectory, true);
                }
            }
        }
コード例 #9
0
        public void ProjectEvaluationShouldRespectConditionsIfProjectLoadSettingsSaysSo()
        {
            var projectContents = @"
<Project>   
   <ItemDefinitionGroup Condition=`1 == 2`>
     <I>
       <m>v</m>
     </I>
   </ItemDefinitionGroup>
   
   <PropertyGroup Condition=`1 == 2`>
     <P1>v</P1>
   </PropertyGroup>

   <PropertyGroup>
     <P2 Condition=`1 == 2`>v</P2>
   </PropertyGroup>

   <ItemGroup Condition=`1 == 2`>
     <I1 Include=`i`/>
   </ItemGroup>

   <ItemGroup>
     <I2 Condition=`1 == 2` Include=`i`/>
   </ItemGroup>
</Project>".Cleanup();

            using (var env = TestEnvironment.Create())
            {
                var projectCollection = env.CreateProjectCollection().Collection;

                var project = new Project(XmlReader.Create(new StringReader(projectContents)), new Dictionary <string, string>(), MSBuildConstants.CurrentToolsVersion, projectCollection, ProjectLoadSettings.DoNotEvaluateElementsWithFalseCondition);

                var data = project.TestOnlyGetPrivateData;

                project.GetProperty("P1").ShouldBeNull();
                project.GetProperty("P2").ShouldBeNull();
                project.Items.ShouldBeEmpty();
                project.ItemDefinitions.ShouldBeEmpty();

                data.ConditionedProperties.ShouldBeEmpty();
                data.ItemsIgnoringCondition.ShouldBeEmpty();
                data.AllEvaluatedItemDefinitionMetadata.ShouldBeEmpty();
                data.AllEvaluatedItems.ShouldBeEmpty();

                Should.Throw <InvalidOperationException>(() =>
                {
                    var c = project.ConditionedProperties;
                });

                Should.Throw <InvalidOperationException>(() =>
                {
                    var c = project.ItemsIgnoringCondition;
                });

                Should.Throw <InvalidOperationException>(() =>
                {
                    var c = project.AllEvaluatedItemDefinitionMetadata;
                });

                Should.Throw <InvalidOperationException>(() =>
                {
                    var c = project.AllEvaluatedItems;
                });
            }
        }
コード例 #10
0
 public GraphLoadedFromSolutionTests(ITestOutputHelper output)
 {
     _env = TestEnvironment.Create(output);
 }
コード例 #11
0
 public MSBuildTestEnvironmentFixture()
 {
     _testEnvironment = TestEnvironment.Create();
 }
コード例 #12
0
        public void SdkReferenceIsCorrect_CreatedInMemory()
        {
            using (var env = TestEnvironment.Create())
            {
                ProjectRootElement rootElement = ProjectRootElement.Create(NewProjectFileOptions.None);

                ProjectImportElement importElement = rootElement.AddImport("Sdk.props");

                SetPropertyAndExpectProjectXmlChangedEventToFire(rootElement, () => importElement.Sdk    = "My.Sdk", "Set Import Sdk My.Sdk");
                SetPropertyAndExpectProjectXmlChangedEventToNotFire(rootElement, () => importElement.Sdk = "My.Sdk");

                importElement.SdkReference.Name.ShouldBe("My.Sdk");
                importElement.SdkReference.Version.ShouldBeNull();
                importElement.SdkReference.MinimumVersion.ShouldBeNull();

                SetPropertyAndExpectProjectXmlChangedEventToFire(rootElement, () => importElement.Version    = "1.2.0", "Set Import Version 1.2.0");
                SetPropertyAndExpectProjectXmlChangedEventToNotFire(rootElement, () => importElement.Version = "1.2.0");

                importElement.SdkReference.Name.ShouldBe("My.Sdk");
                importElement.SdkReference.Version.ShouldBe("1.2.0");
                importElement.SdkReference.MinimumVersion.ShouldBeNull();

                SetPropertyAndExpectProjectXmlChangedEventToFire(rootElement, () => importElement.MinimumVersion    = "1.0.0", "Set Import Minimum Version 1.0.0");
                SetPropertyAndExpectProjectXmlChangedEventToNotFire(rootElement, () => importElement.MinimumVersion = "1.0.0");

                importElement.SdkReference.Name.ShouldBe("My.Sdk");
                importElement.SdkReference.Version.ShouldBe("1.2.0");
                importElement.SdkReference.MinimumVersion.ShouldBe("1.0.0");

                rootElement.Save(env.GetTempFile(".csproj").Path);

                SetPropertyAndExpectProjectXmlChangedEventToNotFire(rootElement, () => importElement.Sdk = "My.Sdk");

                SetPropertyAndExpectProjectXmlChangedEventToFire(rootElement, () => importElement.Sdk = "Some.Other.Sdk", "Set Import Sdk Some.Other.Sdk");

                importElement.SdkReference.Name.ShouldBe("Some.Other.Sdk");
                importElement.SdkReference.Version.ShouldBe("1.2.0");
                importElement.SdkReference.MinimumVersion.ShouldBe("1.0.0");

                rootElement.Save();

                SetPropertyAndExpectProjectXmlChangedEventToFire(rootElement, () => importElement.Version = "4.0.0", "Set Import Version 4.0.0");

                importElement.SdkReference.Name.ShouldBe("Some.Other.Sdk");
                importElement.SdkReference.Version.ShouldBe("4.0.0");
                importElement.SdkReference.MinimumVersion.ShouldBe("1.0.0");

                rootElement.Save();

                SetPropertyAndExpectProjectXmlChangedEventToFire(rootElement, () => importElement.MinimumVersion = "2.0.0", "Set Import Minimum Version 2.0.0");

                importElement.SdkReference.Name.ShouldBe("Some.Other.Sdk");
                importElement.SdkReference.Version.ShouldBe("4.0.0");
                importElement.SdkReference.MinimumVersion.ShouldBe("2.0.0");

                SetPropertyAndExpectProjectXmlChangedEventToFire(rootElement, () => importElement.Version = null, "Set Import Version ");

                importElement.SdkReference.Name.ShouldBe("Some.Other.Sdk");
                importElement.SdkReference.Version.ShouldBeNull();
                importElement.SdkReference.MinimumVersion.ShouldBe("2.0.0");

                SetPropertyAndExpectProjectXmlChangedEventToFire(rootElement, () => importElement.MinimumVersion = null, "Set Import Minimum Version ");

                importElement.SdkReference.Name.ShouldBe("Some.Other.Sdk");
                importElement.SdkReference.Version.ShouldBeNull();
                importElement.SdkReference.MinimumVersion.ShouldBeNull();
            }
        }
コード例 #13
0
 public HintPathResolver_Tests(ITestOutputHelper testOutput)
 {
     _env = TestEnvironment.Create(testOutput);
 }
コード例 #14
0
 public BuildRequestConfiguration_Tests(ITestOutputHelper testOutput)
 {
     _env = TestEnvironment.Create(testOutput);
 }
コード例 #15
0
        private void AssertBuild(
            string[] targets,
            Action <BuildResult, MockLogger> assert,
            bool buildDeclaredReference   = false,
            bool buildUndeclaredReference = false,
            bool addContinueOnError       = false,
            Func <string, string> projectReferenceModifier           = null,
            Func <string, string> msbuildOnDeclaredReferenceModifier = null)
        {
            using (var env = TestEnvironment.Create())
                using (var buildManager = new BuildManager())
                {
                    if (NativeMethodsShared.IsOSX)
                    {
                        // OSX links /var into /private, which makes Path.GetTempPath() to return "/var..." but Directory.GetCurrentDirectory to return "/private/var..."
                        // this discrepancy fails the msbuild task enforcements due to failed path equality checks
                        env.SetTempPath(Path.Combine(Directory.GetCurrentDirectory(), Guid.NewGuid().ToString("N")), deleteTempDirectory: true);
                    }

                    var projectFile             = env.CreateFile().Path;
                    var declaredReferenceFile   = env.CreateFile().Path;
                    var undeclaredReferenceFile = env.CreateFile().Path;

                    File.WriteAllText(
                        projectFile,
                        string.Format(
                            _project,
                            projectReferenceModifier?.Invoke(declaredReferenceFile) ?? declaredReferenceFile,
                            msbuildOnDeclaredReferenceModifier?.Invoke(declaredReferenceFile) ?? declaredReferenceFile,
                            undeclaredReferenceFile,
                            addContinueOnError ? "ContinueOnError='WarnAndContinue'" : string.Empty));

                    File.WriteAllText(declaredReferenceFile, _declaredReference);
                    File.WriteAllText(undeclaredReferenceFile, _undeclaredReference);

                    var logger = new MockLogger(_testOutput);

                    // todo investigate why out of proc builds fail on macos https://github.com/Microsoft/msbuild/issues/3915
                    var disableInProcNode = !NativeMethodsShared.IsOSX;

                    var buildParameters = new BuildParameters
                    {
                        IsolateProjects   = true,
                        Loggers           = new ILogger[] { logger },
                        EnableNodeReuse   = false,
                        DisableInProcNode = disableInProcNode
                    };

                    var rootRequest = new BuildRequestData(
                        projectFile,
                        new Dictionary <string, string>(),
                        MSBuildConstants.CurrentToolsVersion,
                        targets,
                        null);

                    try
                    {
                        buildManager.BeginBuild(buildParameters);

                        if (buildDeclaredReference)
                        {
                            buildManager.BuildRequest(
                                new BuildRequestData(
                                    declaredReferenceFile,
                                    new Dictionary <string, string>(),
                                    MSBuildConstants.CurrentToolsVersion,
                                    new[] { "DeclaredReferenceTarget" },
                                    null))
                            .OverallResult.ShouldBe(BuildResultCode.Success);
                        }

                        if (buildUndeclaredReference)
                        {
                            buildManager.BuildRequest(
                                new BuildRequestData(
                                    undeclaredReferenceFile,
                                    new Dictionary <string, string>(),
                                    MSBuildConstants.CurrentToolsVersion,
                                    new[] { "UndeclaredReferenceTarget" },
                                    null))
                            .OverallResult.ShouldBe(BuildResultCode.Success);
                        }

                        var result = buildManager.BuildRequest(rootRequest);

                        assert(result, logger);
                    }
                    finally
                    {
                        buildManager.EndBuild();
                    }
                }
        }
コード例 #16
0
 public GenerateBindingRedirectsTests(ITestOutputHelper output)
 {
     _output = output;
     _env    = TestEnvironment.Create(output);
 }
コード例 #17
0
 public BuildRequestConfiguration_Tests(ITestOutputHelper testOutput)
 {
     _env = TestEnvironment.Create(testOutput);
     _env.DoNotLaunchDebugger();
 }