5 // Marek Sieradzki (marek.sieradzki@gmail.com)
6 // Andres G. Aragoneses (knocte@gmail.com)
8 // (C) 2006 Marek Sieradzki
9 // (C) 2012 Andres G. Aragoneses
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using System.Collections;
31 using Microsoft.Build.BuildEngine;
32 using Microsoft.Build.Framework;
33 using Microsoft.Build.Utilities;
34 using MonoTests.Microsoft.Build.Tasks;
35 using NUnit.Framework;
39 namespace MonoTests.Microsoft.Build.BuildEngine {
41 public class TargetTest {
43 static bool isMono = Type.GetType ("Mono.Runtime", false) != null;
48 public void TestFromXml1 ()
50 string documentString = @"
51 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
52 <Target Name='Target'>
57 engine = new Engine (Consts.BinPath);
59 project = engine.CreateNewProject ();
60 project.LoadXml (documentString);
62 Target[] t = new Target [1];
63 project.Targets.CopyTo (t, 0);
65 Assert.AreEqual (String.Empty, t [0].Condition, "A1");
66 Assert.AreEqual (String.Empty, t [0].DependsOnTargets, "A2");
67 Assert.IsFalse (t [0].IsImported, "A3");
68 Assert.AreEqual ("Target", t [0].Name, "A4");
72 public void TestFromXml2 ()
74 string documentString = @"
75 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
76 <Target Name='Target' Condition='false' DependsOnTargets='X' >
81 engine = new Engine (Consts.BinPath);
83 project = engine.CreateNewProject ();
84 project.LoadXml (documentString);
86 Target[] t = new Target [1];
87 project.Targets.CopyTo (t, 0);
89 Assert.AreEqual ("false", t [0].Condition, "A1");
90 Assert.AreEqual ("X", t [0].DependsOnTargets, "A2");
92 t [0].Condition = "true";
93 t [0].DependsOnTargets = "A;B";
95 Assert.AreEqual ("true", t [0].Condition, "A3");
96 Assert.AreEqual ("A;B", t [0].DependsOnTargets, "A4");
100 public void TestAddNewTask1 ()
102 string documentString = @"
103 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
104 <Target Name='Target' >
109 engine = new Engine (Consts.BinPath);
111 project = engine.CreateNewProject ();
112 project.LoadXml (documentString);
114 Target[] t = new Target [1];
115 project.Targets.CopyTo (t, 0);
117 BuildTask bt = t [0].AddNewTask ("Message");
119 Assert.AreEqual ("Message", bt.Name, "A1");
123 [ExpectedException (typeof (ArgumentNullException))]
124 public void TestAddNewTask2 ()
126 string documentString = @"
127 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
128 <Target Name='Target' >
133 engine = new Engine (Consts.BinPath);
135 project = engine.CreateNewProject ();
136 project.LoadXml (documentString);
138 Target[] t = new Target [1];
139 project.Targets.CopyTo (t, 0);
141 t [0].AddNewTask (null);
145 public void TestGetEnumerator ()
147 string documentString = @"
148 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
149 <Target Name='Target' >
150 <Message Text='text' />
151 <Warning Text='text' />
156 engine = new Engine (Consts.BinPath);
158 project = engine.CreateNewProject ();
159 project.LoadXml (documentString);
161 Target[] t = new Target [1];
162 project.Targets.CopyTo (t, 0);
164 IEnumerator e = t [0].GetEnumerator ();
166 Assert.AreEqual ("Message", ((BuildTask) e.Current).Name, "A1");
168 Assert.AreEqual ("Warning", ((BuildTask) e.Current).Name, "A2");
169 Assert.IsFalse (e.MoveNext (), "A3");
173 public void TestOutOfRangeElementsOfTheEnumerator()
175 string documentString =
177 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
179 <Message Text='text' />
183 engine = new Engine (Consts.BinPath);
185 project = engine.CreateNewProject ();
186 project.LoadXml (documentString);
188 Assert.IsFalse (project.Targets == null, "A1");
189 Assert.AreEqual (1, project.Targets.Count, "A2");
191 Target target = project.Targets ["A"];
192 Assert.IsFalse (target == null, "A3");
194 IEnumerator e = target.GetEnumerator ();
198 var name = ((BuildTask)e.Current).Name;
199 } catch (InvalidOperationException) { // "Enumeration has not started. Call MoveNext"
203 Assert.Fail ("A4: Should have thrown IOE");
206 Assert.AreEqual (true, e.MoveNext (), "A5");
207 Assert.AreEqual ("Message", ((BuildTask)e.Current).Name, "A6");
208 Assert.AreEqual (false, e.MoveNext (), "A7");
210 var name = ((BuildTask) e.Current).Name;
211 } catch (InvalidOperationException) { //"Enumeration already finished."
214 Assert.Fail ("A8: Should have thrown IOE, because there's only one buidTask");
218 [ExpectedException (typeof (InvalidProjectFileException))]
219 public void TestOnError1 ()
224 string documentString = @"
225 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
227 <OnError ExecuteTargets='B' />
228 <Error Text='text' />
233 engine = new Engine (Consts.BinPath);
234 project = engine.CreateNewProject ();
235 project.LoadXml (documentString);
239 public void TestRemoveTask1 ()
241 string documentString = @"
242 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
243 <Target Name='Target' >
244 <Message Text='text' />
245 <Warning Text='text' />
250 engine = new Engine (Consts.BinPath);
252 project = engine.CreateNewProject ();
253 project.LoadXml (documentString);
255 Target[] t = new Target [1];
256 project.Targets.CopyTo (t, 0);
258 IEnumerator e = t [0].GetEnumerator ();
260 t [0].RemoveTask ((BuildTask) e.Current);
261 e = t [0].GetEnumerator ();
263 Assert.AreEqual ("Warning", ((BuildTask) e.Current).Name, "A1");
264 Assert.IsFalse (e.MoveNext (), "A2");
268 [ExpectedException (typeof (ArgumentNullException))]
269 public void TestRemoveTask2 ()
271 string documentString = @"
272 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
273 <Target Name='Target' >
278 engine = new Engine (Consts.BinPath);
280 project = engine.CreateNewProject ();
281 project.LoadXml (documentString);
283 Target[] t = new Target [1];
284 project.Targets.CopyTo (t, 0);
285 t [0].RemoveTask (null);
289 public void TestTargetOutputs1 ()
294 string documentString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
296 <fruit Include=""apple""/>
297 <fruit Include=""rhubarb""/>
298 <fruit Include=""apricot""/>
301 <Target Name=""Main"">
302 <CallTarget Targets=""foo"">
303 <Output TaskParameter=""TargetOutputs"" ItemName=""AllOut""/>
306 <CallTarget Targets=""foo"">
307 <Output TaskParameter=""TargetOutputs"" ItemName=""AllOut""/>
309 <Message Text=""AllOut: @(AllOut)""/>
312 <Target Name=""foo"" Outputs=""@(FooItem)"">
313 <Message Text=""foo called""/>
314 <CreateItem Include=""%(fruit.Identity)"">
315 <Output TaskParameter=""Include"" ItemName=""FooItem""/>
317 <Message Text=""FooItem: @(FooItem)""/>
321 engine = new Engine (Consts.BinPath);
322 project = engine.CreateNewProject ();
323 project.LoadXml (documentString);
325 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
326 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
327 engine.RegisterLogger (logger);
329 bool result = project.Build ("Main");
331 logger.DumpMessages ();
332 Assert.Fail ("Build failed");
336 Assert.AreEqual (3, logger.NormalMessageCount, "Expected number of messages");
337 logger.CheckLoggedMessageHead ("foo called", "A1");
338 logger.CheckLoggedMessageHead ("FooItem: apple;rhubarb;apricot", "A2");
339 logger.CheckLoggedMessageHead ("AllOut: apple;rhubarb;apricot;apple;rhubarb;apricot", "A3");
340 Assert.AreEqual (0, logger.NormalMessageCount, "Extra messages found");
342 Assert.AreEqual (2, logger.TargetStarted, "TargetStarted count");
343 Assert.AreEqual (2, logger.TargetFinished, "TargetFinished count");
344 Assert.AreEqual (8, logger.TaskStarted, "TaskStarted count");
345 Assert.AreEqual (8, logger.TaskFinished, "TaskFinished count");
347 } catch (AssertionException) {
348 logger.DumpMessages ();
353 bool Build (string projectXml, ILogger logger)
356 var reader = new StringReader (projectXml);
357 var xml = XmlReader.Create (reader);
358 return BuildOnDotNet (xml, logger);
360 return BuildOnMono (projectXml, logger);
364 bool BuildOnDotNet (XmlReader reader, ILogger logger)
366 var type = Type.GetType ("Microsoft.Build.Evaluation.ProjectCollection, Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
368 var prop = type.GetProperty ("GlobalProjectCollection");
369 var coll = prop.GetValue (null, null);
371 var loadProject = coll.GetType ().GetMethod (
372 "LoadProject", new Type[] { typeof (XmlReader), typeof (string) });
373 var proj = loadProject.Invoke (coll, new object[] { reader, "4.0" });
375 var build = proj.GetType ().GetMethod ("Build", new Type[] { typeof (string), typeof (ILogger[]) });
376 var ret = (bool)build.Invoke (proj, new object[] { "Main", new ILogger[] { logger }});
380 bool BuildOnMono (string projectXml, ILogger logger)
382 var engine = new Engine (Consts.BinPath);
383 var project = engine.CreateNewProject ();
384 project.LoadXml (projectXml);
386 engine.RegisterLogger (logger);
388 return project.Build ("Main");
391 TestMessageLogger CreateLogger (string projectXml)
393 var logger = new TestMessageLogger ();
394 var result = Build (projectXml, logger);
397 logger.DumpMessages ();
398 Assert.Fail ("Build failed");
404 void ItemGroupInsideTarget (string xml, params string[] messages)
406 ItemGroupInsideTarget (xml, 1, messages);
409 void ItemGroupInsideTarget (string xml, int expectedTargetCount, params string[] messages)
411 var logger = CreateLogger (xml);
415 Assert.AreEqual(messages.Length, logger.NormalMessageCount, "Expected number of messages");
416 for (int i = 0; i < messages.Length; i++)
417 logger.CheckLoggedMessageHead (messages [i], i.ToString ());
418 Assert.AreEqual(0, logger.NormalMessageCount, "Extra messages found");
419 Assert.AreEqual(0, logger.WarningMessageCount, "Extra warningmessages found");
421 Assert.AreEqual(expectedTargetCount, logger.TargetStarted, "TargetStarted count");
422 Assert.AreEqual(expectedTargetCount, logger.TargetFinished, "TargetFinished count");
423 Assert.AreEqual(messages.Length, logger.TaskStarted, "TaskStarted count");
424 Assert.AreEqual(messages.Length, logger.TaskFinished, "TaskFinished count");
426 catch (AssertionException)
428 logger.DumpMessages();
434 public void BuildProjectWithItemGroupInsideTarget ()
436 ItemGroupInsideTarget (
437 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
439 <fruit Include=""apple""/>
440 <fruit Include=""apricot""/>
443 <Target Name=""Main"">
445 <fruit Include=""raspberry"" />
447 <Message Text=""%(fruit.Identity)""/>
449 </Project>", "apple", "apricot", "raspberry");
453 public void BuildProjectWithItemGroupInsideTarget2 ()
455 ItemGroupInsideTarget (
456 @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""4.0"">
469 <Sub>$(Foo);Hello</Sub>
473 <Message Text='@(A)' />
474 <Message Text='%(A.Sub)' />
476 </Project>", "1;2", "Foo", "Bar;Hello");
480 public void BuildProjectWithPropertyGroupInsideTarget ()
482 ItemGroupInsideTarget (
483 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
489 <Target Name=""Main"">
490 <Message Text='$(A)' />
494 <Message Text='$(A)' />
496 </Project>", "Foo", "Bar");
500 public void BuildProjectWithPropertyGroupInsideTarget2 ()
502 ItemGroupInsideTarget (
503 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
509 <Target Name=""Main"">
510 <Message Text='$(A)' />
511 <PropertyGroup Condition='true'>
512 <B Condition='false'>False</B>
514 <PropertyGroup Condition='true'>
517 <Message Text='$(A)' />
518 <Message Text='$(B)' />
520 <A Condition='$(A) == $(B)'>Equal</A>
522 <Message Text='$(A)' />
524 </Project>", "Foo", "Bar", "Bar", "Equal");
528 public void ItemGroupInsideTarget_ModifyMetadata ()
530 ItemGroupInsideTarget (
531 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
533 <Server Include='Server1'>
534 <AdminContact>Mono</AdminContact>
536 <Server Include='Server2'>
537 <AdminContact>Mono</AdminContact>
539 <Server Include='Server3'>
540 <AdminContact>Root</AdminContact>
546 <Server Condition=""'%(Server.AdminContact)' == 'Mono'"">
547 <AdminContact>Monkey</AdminContact>
551 <Message Text='%(Server.Identity) : %(Server.AdminContact)' />
553 </Project>", "Server1 : Monkey", "Server2 : Monkey", "Server3 : Root");
557 public void ItemGroupInsideTarget_RemoveItem ()
559 ItemGroupInsideTarget (
560 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
562 <Foo Include='A;B;C;D' />
570 <Message Text='@(Foo)' />
572 </Project>", "A;C;D");
576 public void ItemGroupInsideTarget_DontKeepDuplicates ()
578 ItemGroupInsideTarget (
579 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
581 <Foo Include='A;B' />
586 <Hello>Boston</Hello>
592 <Foo Include='B;C;D' KeepDuplicates='false'>
593 <Hello>Boston</Hello>
597 <Message Text='@(Foo)' />
599 </Project>", "A;B;C;D;B;C");
603 public void ItemGroupInsideTarget_RemoveMetadata ()
605 ItemGroupInsideTarget (
606 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
613 <Hello>Boston</Hello>
625 <Bar Include='@(Foo)' RemoveMetadata='$(Foo)' />
627 <Hello>Monkey</Hello>
631 <Message Text='%(Bar.Identity)' Condition=""'%(Bar.Hello)' != ''""/>
637 public void ItemGroupInsideTarget_RemoveMetadata2 ()
639 ItemGroupInsideTarget (
640 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
647 <Hello>Boston</Hello>
659 <Foo RemoveMetadata='$(Foo)' />
661 <Hello>Monkey</Hello>
665 <Message Text='%(Foo.Identity)' Condition=""'%(Foo.Hello)' != ''""/>
671 public void ItemGroupInsideTarget_KeepMetadata ()
673 ItemGroupInsideTarget (
674 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
681 <Hello>Boston</Hello>
690 <Foo KeepMetadata='Test' />
692 <Hello>Monkey</Hello>
696 <Message Text='%(Foo.Identity)' Condition=""'%(Foo.Test)' != ''""/>
702 public void ItemGroupInsideTarget_Batching ()
704 ItemGroupInsideTarget (
705 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
708 <Foo Include='A;B' />
709 <All Include='%(Foo.Identity)' />
711 <Message Text='%(All.Identity)' />
713 </Project>", "A", "B");
717 public void ItemGroupInsideTarget_Condition ()
719 ItemGroupInsideTarget (
720 @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""4.0"">
722 <Summer>true</Summer>
725 <Weather Include='Sun;Rain' />
729 <ItemGroup Condition=""'$(Summer)' != 'true'"">
730 <Weather Include='Snow' />
732 <Message Text='%(Weather.Identity)' />
734 </Project>", "Sun", "Rain");
738 public void PropertyGroupInsideTarget_Condition ()
740 ItemGroupInsideTarget (
741 @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""4.0"">
743 <Shells Include=""/bin/sh;/bin/bash;/bin/false"" />
748 <HasBash Condition=""'%(Shells.Filename)' == 'bash'"">true</HasBash>
751 <ItemGroup Condition=""'$(HasBash)' == 'true'"">
752 <Weather Include='Rain' />
754 <Message Text='%(Weather.Identity)' />
756 </Project>", "Rain");
761 public void ItemGroupInsideTarget_Expression_in_Metadata ()
763 ItemGroupInsideTarget (
764 @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""4.0"">
766 <Foo Include='output1'>
767 <Inputs>input1a;input1b</Inputs>
769 <Foo Include='output2'>
770 <Inputs>input2a;input2b</Inputs>
774 <Target Name='Main' DependsOnTargets='_PrepareItems' Inputs='@(_Foo)' Outputs='%(Result)'>
775 <Message Text='COMPILE: @(_Foo) - %(_Foo.Result)' />
778 <Target Name='_PrepareItems'>
780 <_Foo Include='%(Foo.Inputs)'>
781 <Result>%(Foo.Identity)</Result>
786 3, "COMPILE: input1a;input1b - output1", "COMPILE: input2a;input2b - output2");
791 public void TestTargetOutputsIncludingMetadata ()
796 string documentString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
798 <fruit Include=""apple""><md>a</md></fruit>
799 <fruit Include=""rhubarb""><md>b</md></fruit>
800 <fruit Include=""apricot""><md>c</md></fruit>
803 <Target Name=""Main"">
804 <CallTarget Targets=""foo"">
805 <Output TaskParameter=""TargetOutputs"" ItemName=""AllOut""/>
808 <CallTarget Targets=""foo"">
809 <Output TaskParameter=""TargetOutputs"" ItemName=""AllOut""/>
811 <Message Text=""AllOut: @(AllOut) metadata: %(AllOut.md)""/>
814 <Target Name=""foo"" Outputs=""@(FooItem)"">
815 <Message Text=""foo called""/>
816 <CreateItem Include=""@(fruit)"">
817 <Output TaskParameter=""Include"" ItemName=""FooItem""/>
819 <Message Text=""FooItem: @(FooItem) metadata: %(FooItem.md)""/>
823 engine = new Engine (Consts.BinPath);
824 project = engine.CreateNewProject ();
825 project.LoadXml (documentString);
827 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
828 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
829 engine.RegisterLogger (logger);
831 bool result = project.Build ("Main");
833 logger.DumpMessages ();
834 Assert.Fail ("Build failed");
838 logger.CheckLoggedMessageHead ("foo called", "A1");
839 logger.CheckLoggedMessageHead ("FooItem: apple metadata: a", "A2");
840 logger.CheckLoggedMessageHead ("FooItem: rhubarb metadata: b", "A3");
841 logger.CheckLoggedMessageHead ("FooItem: apricot metadata: c", "A4");
843 logger.CheckLoggedMessageHead ("AllOut: apple;apple metadata: a", "A5");
844 logger.CheckLoggedMessageHead ("AllOut: rhubarb;rhubarb metadata: b", "A6");
845 logger.CheckLoggedMessageHead ("AllOut: apricot;apricot metadata: c", "A7");
847 Assert.AreEqual (0, logger.NormalMessageCount, "Extra messages found");
849 Assert.AreEqual (2, logger.TargetStarted, "TargetStarted count");
850 Assert.AreEqual (2, logger.TargetFinished, "TargetFinished count");
851 Assert.AreEqual (10, logger.TaskStarted, "TaskStarted count");
852 Assert.AreEqual (10, logger.TaskFinished, "TaskFinished count");
854 } catch (AssertionException) {
855 logger.DumpMessages ();
861 public void TestOverridingTargets ()
866 string second = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
867 <Target Name='BeforeBuild'/>
868 <Target Name='AfterBuild'/>
869 <Target Name='Build' DependsOnTargets='BeforeBuild'>
870 <Message Text='Build executing'/>
871 <CallTarget Targets='AfterBuild'/>
874 using (StreamWriter sw = new StreamWriter (Path.Combine ("Test", Path.Combine ("resources", "second.proj")))) {
878 string documentString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
879 <Target Name='AfterBuild'>
880 <Message Text='Overriding AfterBuild'/>
883 <Import Project='Test/resources/second.proj'/>
884 <Target Name='BeforeBuild'>
885 <Message Text='Overriding BeforeBuild'/>
889 engine = new Engine (Consts.BinPath);
890 project = engine.CreateNewProject ();
891 project.LoadXml (documentString);
893 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
894 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
895 engine.RegisterLogger (logger);
897 bool result = project.Build ("Build");
899 logger.DumpMessages ();
900 Assert.Fail ("Build failed");
903 logger.CheckLoggedMessageHead ("Overriding BeforeBuild", "A1");
904 logger.CheckLoggedMessageHead ("Build executing", "A1");
906 Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected extra messages found");
910 [Category ("NotDotNet")]
911 public void TestBeforeAndAfterTargets ()
916 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""4.0"">
917 <Target Name=""DefaultBeforeTarget1"" BeforeTargets=""Default"">
918 <Message Text=""Hello from DefaultBeforeTarget1""/>
921 <Target Name=""DefaultBeforeTarget2"" BeforeTargets=""Default;Default;NonExistant"">
922 <Message Text=""Hello from DefaultBeforeTarget2""/>
926 <Target Name=""DefaultAfterTarget"" AfterTargets=""Default ; Foo"">
927 <Message Text=""Hello from DefaultAfterTarget""/>
930 <Target Name=""Default"" DependsOnTargets=""DefaultDependsOn"">
931 <Message Text=""Hello from Default""/>
934 <Target Name=""DefaultDependsOn"">
935 <Message Text=""Hello from DefaultDependsOn""/>
939 engine = new Engine ();
940 project = engine.CreateNewProject ();
941 project.LoadXml (projectString);
943 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
944 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
945 engine.RegisterLogger (logger);
947 if (!project.Build ("Default")) {
948 logger.DumpMessages ();
949 Assert.Fail ("Build failed");
952 logger.CheckLoggedMessageHead ("Hello from DefaultDependsOn", "A1");
953 logger.CheckLoggedMessageHead ("Hello from DefaultBeforeTarget1", "A1");
954 logger.CheckLoggedMessageHead ("Hello from DefaultBeforeTarget2", "A1");
955 logger.CheckLoggedMessageHead ("Hello from Default", "A1");
956 logger.CheckLoggedMessageHead ("Hello from DefaultAfterTarget", "A1");
958 Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected messages found");
960 //warnings for referencing unknown targets: NonExistant and Foo
961 Assert.AreEqual (2, logger.WarningsCount, "Expected warnings not raised");
965 public void TestTargetReturns ()
967 engine = new Engine (Consts.BinPath);
968 project = engine.CreateNewProject ();
969 project.Load (Path.Combine ("Test", Path.Combine ("resources", "TestReturns.csproj")));
971 var logger = new TestMessageLogger ();
972 engine.RegisterLogger (logger);
974 bool result = project.Build ("Main");
976 logger.DumpMessages ();
977 Assert.Fail ("Build failed");
980 logger.CheckLoggedMessageHead ("Result: Bar", "A1");
982 Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected extra messages found");