5 // Marek Sieradzki (marek.sieradzki@gmail.com)
7 // (C) 2005 Marek Sieradzki
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:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
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.
30 using Microsoft.Build.BuildEngine;
31 using NUnit.Framework;
33 namespace MonoTests.Microsoft.Build.BuildEngine {
35 public class ProjectTest {
42 binPath = "../../tools/xbuild/xbuild";
45 // Clones a project by reloading from original.Xml
46 private Project CloneProject (Project original)
50 clone = original.ParentEngine.CreateNewProject ();
51 clone.LoadXml (original.Xml);
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 ()
66 string documentString =
67 "<Project></Project>";
69 engine = new Engine (binPath);
70 project = engine.CreateNewProject ();
71 project.LoadXml (documentString);
75 public void TestDefaultTargets ()
80 string documentString = @"
81 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" DefaultTargets=""Build;Compile"">
85 engine = new Engine (binPath);
86 proj = engine.CreateNewProject ();
87 Assert.AreEqual (String.Empty, proj.FullFileName, "A1");
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");
98 public void TestProperties ()
100 Engine engine = new Engine (binPath);
101 Project proj = engine.CreateNewProject ();
103 string documentString = @"
104 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
106 <Config>debug</Config>
107 <ExpProp>$(Config)-$(Config)</ExpProp>
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");
118 // Get all items with a specific name, separated by ;
119 private string GetItems (Project proj, string name)
121 BuildItemGroup big = proj.GetEvaluatedItemsByName (name);
122 string str = String.Empty;
126 foreach (BuildItem bi in big) {
127 if (str == String.Empty) {
128 str = bi.FinalItemSpec;
130 str += ";" + bi.FinalItemSpec;
137 public void TestItems ()
139 Engine engine = new Engine (binPath);
140 Project proj = engine.CreateNewProject ();
142 string documentString = @"
143 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
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)"" />
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)')"" />
161 <ItemS1 Include=""@(Item1,'-')"" />
162 <ItemS2 Include=""@(Item1,'xx')"" />
163 <ItemS3 Include=""@(Item1, '-')"" />
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");
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");
184 Assert.AreEqual ("A-B-C", GetItems (proj, "ItemS1"), "A14");
185 Assert.AreEqual ("AxxBxxC", GetItems (proj, "ItemS2"), "A15");
187 Assert.AreEqual ("A-B-C", GetItems (proj, "ItemS3"), "A16");
191 public void TestDefaultTasks ()
193 Engine engine = new Engine (binPath);
194 Project project = engine.CreateNewProject ();
196 string documentString = @"
197 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
198 <Target Name=""Main"">
199 <Message Text='Text' />
204 project.LoadXml (documentString);
205 project.Build ("Main");