5 using Microsoft.Build.Construction;
6 using Microsoft.Build.Evaluation;
7 using Microsoft.Build.Execution;
9 using System.Collections.Generic;
11 namespace MonoTests.Microsoft.Build.Evaluation
14 public class ProjectItemTest
17 public void SetUnevaluatedInclude ()
19 string project_xml = @"<Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
21 <Foo Include='foo/bar.txt' />
24 var xml = XmlReader.Create (new StringReader (project_xml));
25 var root = ProjectRootElement.Create (xml);
26 Assert.AreEqual (1, root.ItemGroups.Count, "#1");
27 var g = root.ItemGroups.First ();
28 Assert.AreEqual (1, g.Items.Count, "#2");
29 var xitem = g.Items.First ();
30 var proj = new Project (root);
31 var item = proj.ItemsIgnoringCondition.First ();
32 string inc = "foo/bar.txt";
33 Assert.AreEqual (inc, xitem.Include, "#3");
34 Assert.AreEqual (inc, item.UnevaluatedInclude, "#4");
35 string inc2 = "foo/bar.ext.txt";
36 item.UnevaluatedInclude = inc2;
37 Assert.AreEqual (inc2, xitem.Include, "#5");
38 Assert.AreEqual (inc2, item.UnevaluatedInclude, "#6");
41 void SetupTemporaryDirectoriesAndFiles ()
43 Directory.CreateDirectory ("Test/ProjectItemTestTemporary");
44 Directory.CreateDirectory ("Test/ProjectItemTestTemporary/parent");
45 Directory.CreateDirectory ("Test/ProjectItemTestTemporary/parent/dir1");
46 Directory.CreateDirectory ("Test/ProjectItemTestTemporary/parent/dir2");
47 File.CreateText ("Test/ProjectItemTestTemporary/x.cs").Close ();
48 File.CreateText ("Test/ProjectItemTestTemporary/parent/dir1/a.cs").Close ();
49 File.CreateText ("Test/ProjectItemTestTemporary/parent/dir1/a1.cs").Close ();
50 File.CreateText ("Test/ProjectItemTestTemporary/parent/dir1/b.cs").Close ();
51 File.CreateText ("Test/ProjectItemTestTemporary/parent/dir2/a2.cs").Close ();
52 File.CreateText ("Test/ProjectItemTestTemporary/parent/dir2/a.cs").Close ();
53 File.CreateText ("Test/ProjectItemTestTemporary/parent/dir2/b.cs").Close ();
56 void CleanupTemporaryDirectories ()
58 Directory.Delete ("Test/ProjectItemTestTemporary", true);
62 public void WildcardExpansion ()
64 string project_xml = @"<Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
66 <Foo Include='Test/ProjectItemTestTemporary/parent/dir*/a*.cs;Test/ProjectItemTestTemporary/x.cs' />
70 SetupTemporaryDirectoriesAndFiles ();
71 WildcardExpansionCommon (project_xml);
73 CleanupTemporaryDirectories ();
78 [Category ("NotWorking")] // it looks like DirectoryScanner bug.
79 public void WildcardExpansionRecursive ()
81 string project_xml = @"<Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
83 <Foo Include='Test/ProjectItemTestTemporary/parent/**/a*.cs;Test/ProjectItemTestTemporary/x.cs' />
87 SetupTemporaryDirectoriesAndFiles ();
88 WildcardExpansionCommon (project_xml);
90 CleanupTemporaryDirectories ();
94 void WildcardExpansionCommon (string xmlString)
96 var xml = XmlReader.Create (new StringReader (xmlString));
97 var root = ProjectRootElement.Create (xml);
98 var proj = new Project (root);
99 var xitem = proj.Xml.Items.First ();
100 var items = proj.Items.ToArray ();
101 Assert.AreEqual (5, items.Length, "#1");
102 Assert.AreEqual (string.Format ("Test/ProjectItemTestTemporary/parent/dir1{0}a.cs", Path.DirectorySeparatorChar), items [0].EvaluatedInclude, "#2");
103 Assert.AreEqual ("a", items [0].GetMetadataValue ("Filename"), "#3");
104 Assert.AreEqual (string.Format ("Test/ProjectItemTestTemporary/parent/dir1{0}a1.cs", Path.DirectorySeparatorChar), items [1].EvaluatedInclude, "#4");
105 Assert.AreEqual ("a1", items [1].GetMetadataValue ("Filename"), "#5");
106 // note that Items are *sorted*
107 Assert.AreEqual (string.Format ("Test/ProjectItemTestTemporary/parent/dir2{0}a.cs", Path.DirectorySeparatorChar), items [2].EvaluatedInclude, "#6");
108 Assert.AreEqual ("a", items [2].GetMetadataValue ("Filename"), "#7");
109 Assert.AreEqual (string.Format ("Test/ProjectItemTestTemporary/parent/dir2{0}a2.cs", Path.DirectorySeparatorChar), items [3].EvaluatedInclude, "#8");
110 Assert.AreEqual ("a2", items [3].GetMetadataValue ("Filename"), "#9");
111 Assert.AreEqual ("Test/ProjectItemTestTemporary/x.cs", items [4].EvaluatedInclude, "#10");
112 for (int i = 0; i < items.Length; i++)
113 Assert.AreEqual (xitem, items [i].Xml, "#11:" + i);
117 public void Metadata ()
119 string project_xml = @"<Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
120 <ItemDefinitionGroup>
122 <prop1>value1</prop1>
124 </ItemDefinitionGroup>
126 <Foo Include='foo/bar.txt'>
127 <prop1>valueX1</prop1>
131 var xml = XmlReader.Create (new StringReader (project_xml));
132 var root = ProjectRootElement.Create (xml);
133 Assert.AreEqual (1, root.ItemGroups.Count, "#1");
134 var g = root.ItemGroups.First ();
135 Assert.AreEqual (1, g.Items.Count, "#2");
136 var proj = new Project (root);
137 var item = proj.ItemsIgnoringCondition.First ();
138 var meta = item.GetMetadata ("prop1");
139 Assert.IsNotNull (meta, "#3");
140 Assert.AreEqual ("valueX1", meta.UnevaluatedValue, "#4");
141 Assert.IsNotNull (meta.Predecessor, "#5");
142 Assert.AreEqual ("value1", meta.Predecessor.UnevaluatedValue, "#6");
144 // Well-known metadata don't show up via GetMetadata(), but does show up via GetMetadataValue().
145 Assert.AreEqual (null, item.GetMetadata ("Filename"), "#7");
146 Assert.AreEqual ("bar", item.GetMetadataValue ("Filename"), "#8");