implement item wildcard support, except for "**" which looks buggy at DirectoryScanner.
[mono.git] / mcs / class / Microsoft.Build / Test / Microsoft.Build.Evaluation / ProjectItemTest.cs
1 using System;
2 using System.IO;
3 using System.Linq;
4 using System.Xml;
5 using Microsoft.Build.Construction;
6 using Microsoft.Build.Evaluation;
7 using Microsoft.Build.Execution;
8 using NUnit.Framework;
9 using System.Collections.Generic;
10
11 namespace MonoTests.Microsoft.Build.Evaluation
12 {
13         [TestFixture]
14         public class ProjectItemTest
15         {
16                 [Test]
17                 public void SetUnevaluatedInclude ()
18                 {
19                         string project_xml = @"<Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
20   <ItemGroup>
21     <Foo Include='foo/bar.txt' />
22   </ItemGroup>
23 </Project>";
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");
39                 }
40                 
41                 void SetupTemporaryDirectoriesAndFiles ()
42                 {
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 ();
54                 }
55                 
56                 void CleanupTemporaryDirectories ()
57                 {
58                         Directory.Delete ("Test/ProjectItemTestTemporary", true);
59                 }
60                 
61                 [Test]
62                 public void WildcardExpansion ()
63                 {
64                         string project_xml = @"<Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
65   <ItemGroup>
66     <Foo Include='Test/ProjectItemTestTemporary/parent/dir*/a*.cs;Test/ProjectItemTestTemporary/x.cs' />
67   </ItemGroup>
68 </Project>";
69                         try {
70                                 SetupTemporaryDirectoriesAndFiles ();
71                                 WildcardExpansionCommon (project_xml);
72                         } finally {
73                                 CleanupTemporaryDirectories ();
74                         }
75                 }
76                 
77                 [Test]
78                 [Category ("NotWorking")] // it looks like DirectoryScanner bug.
79                 public void WildcardExpansionRecursive ()
80                 {
81                         string project_xml = @"<Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
82   <ItemGroup>
83     <Foo Include='Test/ProjectItemTestTemporary/parent/**/a*.cs;Test/ProjectItemTestTemporary/x.cs' />
84   </ItemGroup>
85 </Project>";
86                         try {
87                                 SetupTemporaryDirectoriesAndFiles ();
88                                 WildcardExpansionCommon (project_xml);
89                         } finally {
90                                 CleanupTemporaryDirectories ();
91                         }
92                 }
93                 
94                 void WildcardExpansionCommon (string xmlString)
95                 {
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);
114                 }
115                 
116                 [Test]
117                 public void Metadata ()
118                 {
119                         string project_xml = @"<Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
120   <ItemDefinitionGroup>
121     <Foo>
122       <prop1>value1</prop1>
123     </Foo>
124   </ItemDefinitionGroup>
125   <ItemGroup>
126     <Foo Include='foo/bar.txt'>
127       <prop1>valueX1</prop1>
128     </Foo>
129   </ItemGroup>
130 </Project>";
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");
143                         
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");
147                 }
148         }
149 }
150