merge -r 60814:60815
[mono.git] / mcs / class / Microsoft.Build.Engine / Test / Microsoft.Build.BuildEngine / ProjectTest.cs
1 //
2 // ProjectTest.cs:
3 //
4 // Author:
5 //   Marek Sieradzki (marek.sieradzki@gmail.com)
6 //
7 // (C) 2005 Marek Sieradzki
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
28 using System;
29 using System.Xml;
30 using Microsoft.Build.BuildEngine;
31 using NUnit.Framework;
32
33 namespace MonoTests.Microsoft.Build.BuildEngine {
34         [TestFixture]
35         public class ProjectTest {
36
37                 string binPath;
38
39                 [SetUp]
40                 public void SetUp ()
41                 {
42                     binPath = "../../tools/xbuild/xbuild";
43                 }
44
45                 // Clones a project by reloading from original.Xml
46                 private Project CloneProject (Project original)
47                 {
48                         Project clone;
49                         
50                         clone = original.ParentEngine.CreateNewProject ();
51                         clone.LoadXml (original.Xml);
52
53                         return clone;
54                 }
55
56                 [Test]
57                 [ExpectedException (typeof (InvalidProjectFileException),
58                 @"The default XML namespace of the project must be the MSBuild XML namespace." + 
59                 " If the project is authored in the MSBuild 2003 format, please add " +
60                 "xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" to the <Project> element. " +
61                 "If the project has been authored in the old 1.0 or 1.2 format, please convert it to MSBuild 2003 format.  ")]
62                 public void TestAssignment ()
63                 {
64                         Engine engine;
65                         Project project;
66                         string documentString =
67                                 "<Project></Project>";
68                         
69                         engine = new Engine (binPath);
70                         project = engine.CreateNewProject ();
71                         project.LoadXml (documentString);
72                 }
73
74                 [Test]
75                 public void TestDefaultTargets ()
76                 {
77                         Engine engine;
78                         Project proj;
79                         Project cproj;
80                         string documentString = @"
81                         <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" DefaultTargets=""Build;Compile"">
82                         </Project>
83                         ";
84                         
85                         engine = new Engine (binPath);
86                         proj = engine.CreateNewProject ();
87                         Assert.AreEqual (String.Empty, proj.FullFileName, "A1");
88
89                         proj.LoadXml (documentString);
90                         Assert.AreEqual (String.Empty, proj.FullFileName, "A2");
91                         proj.DefaultTargets = "Build";
92                         Assert.AreEqual ("Build", proj.DefaultTargets, "A3");
93                         cproj = CloneProject (proj);
94                         Assert.AreEqual (proj.DefaultTargets, cproj.DefaultTargets, "A4");
95                 }
96
97                 [Test]
98                 public void TestProperties ()
99                 {
100                         Engine engine = new Engine (binPath);
101                         Project proj = engine.CreateNewProject ();
102
103                         string documentString = @"
104                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
105                                         <PropertyGroup>
106                                                 <Config>debug</Config>
107                                                 <ExpProp>$(Config)-$(Config)</ExpProp>
108                                         </PropertyGroup>
109                                 </Project>
110                         ";
111
112                         proj.LoadXml (documentString);
113                         Assert.AreEqual (1, proj.PropertyGroups.Count, "A1");
114                         Assert.AreEqual ("debug", proj.GetEvaluatedProperty ("Config"), "A2");
115                         Assert.AreEqual ("debug-debug", proj.GetEvaluatedProperty ("ExpProp"), "A3");
116                 }
117
118                 // Get all items with a specific name, separated by ;
119                 private string GetItems (Project proj, string name)
120                 {
121                         BuildItemGroup big = proj.GetEvaluatedItemsByName (name);
122                         string str = String.Empty;
123                         if (big == null) {
124                                 return str;
125                         }
126                         foreach (BuildItem bi in big) {
127                                 if (str == String.Empty) {
128                                         str = bi.FinalItemSpec;
129                                 } else {
130                                         str += ";" + bi.FinalItemSpec;
131                                 }
132                         }
133                         return str;
134                 }
135
136                 [Test]
137                 public void TestItems ()
138                 {
139                         Engine engine = new Engine (binPath);
140                         Project proj = engine.CreateNewProject ();
141
142                         string documentString = @"
143                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
144                                         <ItemGroup>
145                                                 <Item0 Include=""A"" />
146                                                 <Item1 Include=""A;B;C"" />
147                                                 <Item2 Include=""@(Item1);A;D"" />
148                                                 <Item3 Include=""@(Item2)"" Exclude=""A"" />
149                                                 <Item4 Include=""@(Item1);Q"" Exclude=""@(Item2)"" />
150                                                 <Item5 Include=""@(Item1)"" Exclude=""@(Item2)"" />
151                                                 <Item6 Include=""@(Item2)"" Exclude=""@(Item1)"" />
152
153                                                 <ItemOrig Include=""A\B.txt;A\C.txt;B\B.zip;B\C.zip"" />
154                                                 <ItemT1 Include=""@(Item1->'%(Identity)')"" />
155                                                 <ItemT2 Include=""@(Item1->'%(Identity)%(Identity)')"" />
156                                                 <ItemT3 Include=""@(Item1->'(-%(Identity)-)')"" />
157                                                 <ItemT4 Include=""@(ItemOrig->'%(Extension)')"" />
158                                                 <ItemT5 Include=""@(ItemOrig->'%(Filename)/%(Extension)')"" />
159                                                 <ItemT6 Include=""@(ItemOrig->'%(RelativeDir)X/%(Filename)')"" />
160                                                 
161                                                 <ItemS1 Include=""@(Item1,'-')"" />
162                                                 <ItemS2 Include=""@(Item1,'xx')"" />
163                                                 <ItemS3 Include=""@(Item1, '-')"" />
164                                         </ItemGroup>
165                                 </Project>
166                         ";
167
168                         proj.LoadXml (documentString);
169                         Assert.AreEqual ("A", GetItems (proj, "Item0"), "A1");
170                         Assert.AreEqual ("A;B;C", GetItems (proj, "Item1"), "A2");
171                         Assert.AreEqual ("A;B;C;A;D", GetItems (proj, "Item2"), "A3");
172                         Assert.AreEqual ("B;C;D", GetItems (proj, "Item3"), "A4");
173                         Assert.AreEqual ("Q", GetItems (proj, "Item4"), "A5");
174                         Assert.AreEqual ("", GetItems (proj, "Item5"), "A6");
175                         Assert.AreEqual ("D", GetItems (proj, "Item6"), "A7");
176
177                         Assert.AreEqual ("A;B;C", GetItems (proj, "ItemT1"), "A8");
178                         Assert.AreEqual ("AA;BB;CC", GetItems (proj, "ItemT2"), "A9");
179                         Assert.AreEqual ("(-A-);(-B-);(-C-)", GetItems (proj, "ItemT3"), "A10");
180                         Assert.AreEqual (".txt;.txt;.zip;.zip", GetItems (proj, "ItemT4"), "A11");
181                         Assert.AreEqual ("B/.txt;C/.txt;B/.zip;C/.zip", GetItems (proj, "ItemT5"), "A12");
182                         Assert.AreEqual (@"A\X/B;A\X/C;B\X/B;B\X/C", GetItems (proj, "ItemT6"), "A13");
183
184                         Assert.AreEqual ("A-B-C", GetItems (proj, "ItemS1"), "A14");
185                         Assert.AreEqual ("AxxBxxC", GetItems (proj, "ItemS2"), "A15");
186                         // Will fail.
187                         Assert.AreEqual ("A-B-C", GetItems (proj, "ItemS3"), "A16");
188                 }
189
190                 [Test]
191                 public void TestDefaultTasks ()
192                 {
193                         Engine engine = new Engine (binPath);
194                         Project project = engine.CreateNewProject ();
195
196                         string documentString = @"
197                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
198                                         <Target Name=""Main"">
199                                                 <Message Text='Text' />
200                                         </Target>
201                                 </Project>
202                         ";
203
204                         project.LoadXml (documentString);
205                         project.Build ("Main");
206                 }
207         }
208 }