public void LogicalProjectWithWildcardImport() { string myTempDir = Path.Combine(Path.GetTempPath() + "MyTempDir"); try { // Create a new directory in the system temp folder. Directory.CreateDirectory(myTempDir); ProjectRootElement one = ProjectRootElement.Create(Path.Combine(myTempDir, "1.targets")); one.Save(); one.AddProperty("p", "1"); ProjectRootElement two = ProjectRootElement.Create(Path.Combine(myTempDir, "2.targets")); two.Save(); two.AddProperty("p", "2"); ProjectRootElement zero = ProjectRootElement.Create(Path.Combine(myTempDir, "0.targets")); zero.AddProperty("p", "0"); // Add a single import statement that would import both one and two. zero.AddImport(Path.Combine(myTempDir, "*.targets")); Project project = new Project(zero); List<ProjectElement> logicalProject = new List<ProjectElement>(project.GetLogicalProject()); Assert.Equal(6, logicalProject.Count); // 3 properties + 3 property groups Assert.Equal(true, Object.ReferenceEquals(zero, logicalProject[0].ContainingProject)); // PropertyGroup Assert.Equal(true, Object.ReferenceEquals(zero, logicalProject[1].ContainingProject)); // p = 0 Assert.Equal(true, Object.ReferenceEquals(one, logicalProject[2].ContainingProject)); // PropertyGroup Assert.Equal(true, Object.ReferenceEquals(one, logicalProject[3].ContainingProject)); // p = 1 Assert.Equal(true, Object.ReferenceEquals(two, logicalProject[4].ContainingProject)); // PropertyGroup Assert.Equal(true, Object.ReferenceEquals(two, logicalProject[5].ContainingProject)); // p = 2 // Clear the cache project.ProjectCollection.UnloadAllProjects(); } finally { // Delete the temp directory that was created above. if (Directory.Exists(myTempDir)) { Directory.Delete(myTempDir, true); } } }
public void BasicFromXmlFollowImport() { string importContent = ObjectModelHelpers.CleanupFileContents(@" <Project xmlns='msbuildnamespace'> <PropertyGroup> <p2>v3</p2> </PropertyGroup> <ItemGroup> <i Include='i4'/> </ItemGroup> <Target Name='t2'> <task/> </Target> </Project>"); string importPath = ObjectModelHelpers.CreateFileInTempProjectDirectory("import.targets", importContent); string projectFileContent = ObjectModelHelpers.CleanupFileContents(@" <Project xmlns='msbuildnamespace'> <PropertyGroup Condition=""'$(Configuration)'=='Foo'""> <p>v1</p> </PropertyGroup> <PropertyGroup Condition=""'$(Configuration)'!='Foo'""> <p>v2</p> </PropertyGroup> <PropertyGroup> <p2>X$(p)</p2> </PropertyGroup> <ItemGroup> <i Condition=""'$(Configuration)'=='Foo'"" Include='i0'/> <i Include='i1'/> <i Include='$(p)X;i3'/> </ItemGroup> <Target Name='t'> <task/> </Target> <Import Project='{0}'/> </Project>"); projectFileContent = String.Format(projectFileContent, importPath); ProjectRootElement xml = ProjectRootElement.Create(XmlReader.Create(new StringReader(projectFileContent))); Project project = new Project(xml); Assert.Equal("v3", project.GetPropertyValue("p2")); List<ProjectItem> items = Helpers.MakeList(project.GetItems("i")); Assert.Equal(4, items.Count); Assert.Equal("i1", items[0].EvaluatedInclude); Assert.Equal("v2X", items[1].EvaluatedInclude); Assert.Equal("i3", items[2].EvaluatedInclude); Assert.Equal("i4", items[3].EvaluatedInclude); IList<ResolvedImport> imports = project.Imports; Assert.Equal(1, imports.Count); Assert.Equal(true, Object.ReferenceEquals(imports.First().ImportingElement, xml.Imports.ElementAt(0))); // We can take advantage of the fact that we will get the same ProjectRootElement from the cache if we try to // open it with a path; get that and then compare it to what project.Imports gave us. Assert.Equal(true, Object.ReferenceEquals(imports.First().ImportedProject, ProjectRootElement.Open(importPath))); // Test the logical project iterator List<ProjectElement> logicalElements = new List<ProjectElement>(project.GetLogicalProject()); Assert.Equal(18, logicalElements.Count); ObjectModelHelpers.DeleteTempProjectDirectory(); }
public void VariousImports() { ProjectRootElement one = ProjectRootElement.Create("c:\\1.targets"); one.AddProperty("p", "1"); ProjectRootElement two = ProjectRootElement.Create("c:\\2.targets"); two.AddProperty("p", "2"); ProjectRootElement zero = ProjectRootElement.Create("c:\\foo\\0.targets"); zero.AddProperty("p", "0"); zero.AddImport(one.FullPath); zero.AddImport(two.FullPath); zero.AddImport(two.FullPath); // Duplicated import: only the first one should be entered zero.AddImport(zero.FullPath); // Ignored self import ProjectRootElement three = ProjectRootElement.Create("c:\\3.targets"); three.AddProperty("p", "3"); one.AddImport(three.FullPath); ProjectRootElement four = ProjectRootElement.Create("c:\\4.targets"); four.AddProperty("p", "4"); one.AddImport(four.FullPath).Condition = "false"; // False condition; should not be entered Project project = new Project(zero); List<ProjectElement> logicalProject = new List<ProjectElement>(project.GetLogicalProject()); Assert.Equal(8, logicalProject.Count); // 4 properties + 4 property groups Assert.Equal(true, Object.ReferenceEquals(zero, logicalProject[0].ContainingProject)); Assert.Equal(true, Object.ReferenceEquals(zero, logicalProject[1].ContainingProject)); Assert.Equal(true, Object.ReferenceEquals(one, logicalProject[2].ContainingProject)); Assert.Equal(true, Object.ReferenceEquals(one, logicalProject[3].ContainingProject)); Assert.Equal(true, Object.ReferenceEquals(three, logicalProject[4].ContainingProject)); Assert.Equal(true, Object.ReferenceEquals(three, logicalProject[5].ContainingProject)); Assert.Equal(true, Object.ReferenceEquals(two, logicalProject[6].ContainingProject)); Assert.Equal(true, Object.ReferenceEquals(two, logicalProject[7].ContainingProject)); // Clear the cache project.ProjectCollection.UnloadAllProjects(); }