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 {
47 public void TestFromXml1 ()
49 string documentString = @"
50 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
51 <Target Name='Target'>
56 engine = new Engine (Consts.BinPath);
58 project = engine.CreateNewProject ();
59 project.LoadXml (documentString);
61 Target[] t = new Target [1];
62 project.Targets.CopyTo (t, 0);
64 Assert.AreEqual (String.Empty, t [0].Condition, "A1");
65 Assert.AreEqual (String.Empty, t [0].DependsOnTargets, "A2");
66 Assert.IsFalse (t [0].IsImported, "A3");
67 Assert.AreEqual ("Target", t [0].Name, "A4");
71 public void TestFromXml2 ()
73 string documentString = @"
74 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
75 <Target Name='Target' Condition='false' DependsOnTargets='X' >
80 engine = new Engine (Consts.BinPath);
82 project = engine.CreateNewProject ();
83 project.LoadXml (documentString);
85 Target[] t = new Target [1];
86 project.Targets.CopyTo (t, 0);
88 Assert.AreEqual ("false", t [0].Condition, "A1");
89 Assert.AreEqual ("X", t [0].DependsOnTargets, "A2");
91 t [0].Condition = "true";
92 t [0].DependsOnTargets = "A;B";
94 Assert.AreEqual ("true", t [0].Condition, "A3");
95 Assert.AreEqual ("A;B", t [0].DependsOnTargets, "A4");
99 public void TestAddNewTask1 ()
101 string documentString = @"
102 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
103 <Target Name='Target' >
108 engine = new Engine (Consts.BinPath);
110 project = engine.CreateNewProject ();
111 project.LoadXml (documentString);
113 Target[] t = new Target [1];
114 project.Targets.CopyTo (t, 0);
116 BuildTask bt = t [0].AddNewTask ("Message");
118 Assert.AreEqual ("Message", bt.Name, "A1");
122 [ExpectedException (typeof (ArgumentNullException))]
123 public void TestAddNewTask2 ()
125 string documentString = @"
126 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
127 <Target Name='Target' >
132 engine = new Engine (Consts.BinPath);
134 project = engine.CreateNewProject ();
135 project.LoadXml (documentString);
137 Target[] t = new Target [1];
138 project.Targets.CopyTo (t, 0);
140 t [0].AddNewTask (null);
144 public void TestGetEnumerator ()
146 string documentString = @"
147 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
148 <Target Name='Target' >
149 <Message Text='text' />
150 <Warning Text='text' />
155 engine = new Engine (Consts.BinPath);
157 project = engine.CreateNewProject ();
158 project.LoadXml (documentString);
160 Target[] t = new Target [1];
161 project.Targets.CopyTo (t, 0);
163 IEnumerator e = t [0].GetEnumerator ();
165 Assert.AreEqual ("Message", ((BuildTask) e.Current).Name, "A1");
167 Assert.AreEqual ("Warning", ((BuildTask) e.Current).Name, "A2");
168 Assert.IsFalse (e.MoveNext (), "A3");
172 public void TestOutOfRangeElementsOfTheEnumerator()
174 string documentString =
176 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
178 <Message Text='text' />
182 engine = new Engine (Consts.BinPath);
184 project = engine.CreateNewProject ();
185 project.LoadXml (documentString);
187 Assert.IsFalse (project.Targets == null, "A1");
188 Assert.AreEqual (1, project.Targets.Count, "A2");
190 Target target = project.Targets ["A"];
191 Assert.IsFalse (target == null, "A3");
193 IEnumerator e = target.GetEnumerator ();
197 var name = ((BuildTask)e.Current).Name;
198 } catch (InvalidOperationException) { // "Enumeration has not started. Call MoveNext"
202 Assert.Fail ("A4: Should have thrown IOE");
205 Assert.AreEqual (true, e.MoveNext (), "A5");
206 Assert.AreEqual ("Message", ((BuildTask)e.Current).Name, "A6");
207 Assert.AreEqual (false, e.MoveNext (), "A7");
209 var name = ((BuildTask) e.Current).Name;
210 } catch (InvalidOperationException) { //"Enumeration already finished."
213 Assert.Fail ("A8: Should have thrown IOE, because there's only one buidTask");
217 [ExpectedException (typeof (InvalidProjectFileException))]
218 public void TestOnError1 ()
223 string documentString = @"
224 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
226 <OnError ExecuteTargets='B' />
227 <Error Text='text' />
232 engine = new Engine (Consts.BinPath);
233 project = engine.CreateNewProject ();
234 project.LoadXml (documentString);
238 public void TestRemoveTask1 ()
240 string documentString = @"
241 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
242 <Target Name='Target' >
243 <Message Text='text' />
244 <Warning Text='text' />
249 engine = new Engine (Consts.BinPath);
251 project = engine.CreateNewProject ();
252 project.LoadXml (documentString);
254 Target[] t = new Target [1];
255 project.Targets.CopyTo (t, 0);
257 IEnumerator e = t [0].GetEnumerator ();
259 t [0].RemoveTask ((BuildTask) e.Current);
260 e = t [0].GetEnumerator ();
262 Assert.AreEqual ("Warning", ((BuildTask) e.Current).Name, "A1");
263 Assert.IsFalse (e.MoveNext (), "A2");
267 [ExpectedException (typeof (ArgumentNullException))]
268 public void TestRemoveTask2 ()
270 string documentString = @"
271 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
272 <Target Name='Target' >
277 engine = new Engine (Consts.BinPath);
279 project = engine.CreateNewProject ();
280 project.LoadXml (documentString);
282 Target[] t = new Target [1];
283 project.Targets.CopyTo (t, 0);
284 t [0].RemoveTask (null);
288 public void TestTargetOutputs1 ()
293 string documentString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
295 <fruit Include=""apple""/>
296 <fruit Include=""rhubarb""/>
297 <fruit Include=""apricot""/>
300 <Target Name=""Main"">
301 <CallTarget Targets=""foo"">
302 <Output TaskParameter=""TargetOutputs"" ItemName=""AllOut""/>
305 <CallTarget Targets=""foo"">
306 <Output TaskParameter=""TargetOutputs"" ItemName=""AllOut""/>
308 <Message Text=""AllOut: @(AllOut)""/>
311 <Target Name=""foo"" Outputs=""@(FooItem)"">
312 <Message Text=""foo called""/>
313 <CreateItem Include=""%(fruit.Identity)"">
314 <Output TaskParameter=""Include"" ItemName=""FooItem""/>
316 <Message Text=""FooItem: @(FooItem)""/>
320 engine = new Engine (Consts.BinPath);
321 project = engine.CreateNewProject ();
322 project.LoadXml (documentString);
324 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
325 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
326 engine.RegisterLogger (logger);
328 bool result = project.Build ("Main");
330 logger.DumpMessages ();
331 Assert.Fail ("Build failed");
335 Assert.AreEqual (3, logger.NormalMessageCount, "Expected number of messages");
336 logger.CheckLoggedMessageHead ("foo called", "A1");
337 logger.CheckLoggedMessageHead ("FooItem: apple;rhubarb;apricot", "A2");
338 logger.CheckLoggedMessageHead ("AllOut: apple;rhubarb;apricot;apple;rhubarb;apricot", "A3");
339 Assert.AreEqual (0, logger.NormalMessageCount, "Extra messages found");
341 Assert.AreEqual (2, logger.TargetStarted, "TargetStarted count");
342 Assert.AreEqual (2, logger.TargetFinished, "TargetFinished count");
343 Assert.AreEqual (8, logger.TaskStarted, "TaskStarted count");
344 Assert.AreEqual (8, logger.TaskFinished, "TaskFinished count");
346 } catch (AssertionException) {
347 logger.DumpMessages ();
353 bool Build (string projectXml, ILogger logger)
355 if (Environment.OSVersion.Platform == PlatformID.Win32NT) {
356 var reader = new StringReader (projectXml);
357 var xml = XmlReader.Create (reader);
358 return BuildOnWindows (xml, logger);
360 return BuildOnLinux (projectXml, logger);
364 bool BuildOnWindows (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 BuildOnLinux (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");
792 public void TestTargetOutputsIncludingMetadata ()
797 string documentString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
799 <fruit Include=""apple""><md>a</md></fruit>
800 <fruit Include=""rhubarb""><md>b</md></fruit>
801 <fruit Include=""apricot""><md>c</md></fruit>
804 <Target Name=""Main"">
805 <CallTarget Targets=""foo"">
806 <Output TaskParameter=""TargetOutputs"" ItemName=""AllOut""/>
809 <CallTarget Targets=""foo"">
810 <Output TaskParameter=""TargetOutputs"" ItemName=""AllOut""/>
812 <Message Text=""AllOut: @(AllOut) metadata: %(AllOut.md)""/>
815 <Target Name=""foo"" Outputs=""@(FooItem)"">
816 <Message Text=""foo called""/>
817 <CreateItem Include=""@(fruit)"">
818 <Output TaskParameter=""Include"" ItemName=""FooItem""/>
820 <Message Text=""FooItem: @(FooItem) metadata: %(FooItem.md)""/>
824 engine = new Engine (Consts.BinPath);
825 project = engine.CreateNewProject ();
826 project.LoadXml (documentString);
828 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
829 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
830 engine.RegisterLogger (logger);
832 bool result = project.Build ("Main");
834 logger.DumpMessages ();
835 Assert.Fail ("Build failed");
839 logger.CheckLoggedMessageHead ("foo called", "A1");
840 logger.CheckLoggedMessageHead ("FooItem: apple metadata: a", "A2");
841 logger.CheckLoggedMessageHead ("FooItem: rhubarb metadata: b", "A3");
842 logger.CheckLoggedMessageHead ("FooItem: apricot metadata: c", "A4");
844 logger.CheckLoggedMessageHead ("AllOut: apple;apple metadata: a", "A5");
845 logger.CheckLoggedMessageHead ("AllOut: rhubarb;rhubarb metadata: b", "A6");
846 logger.CheckLoggedMessageHead ("AllOut: apricot;apricot metadata: c", "A7");
848 Assert.AreEqual (0, logger.NormalMessageCount, "Extra messages found");
850 Assert.AreEqual (2, logger.TargetStarted, "TargetStarted count");
851 Assert.AreEqual (2, logger.TargetFinished, "TargetFinished count");
852 Assert.AreEqual (10, logger.TaskStarted, "TaskStarted count");
853 Assert.AreEqual (10, logger.TaskFinished, "TaskFinished count");
855 } catch (AssertionException) {
856 logger.DumpMessages ();
862 public void TestOverridingTargets ()
867 string second = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
868 <Target Name='BeforeBuild'/>
869 <Target Name='AfterBuild'/>
870 <Target Name='Build' DependsOnTargets='BeforeBuild'>
871 <Message Text='Build executing'/>
872 <CallTarget Targets='AfterBuild'/>
875 using (StreamWriter sw = new StreamWriter (Path.Combine ("Test", Path.Combine ("resources", "second.proj")))) {
879 string documentString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
880 <Target Name='AfterBuild'>
881 <Message Text='Overriding AfterBuild'/>
884 <Import Project='Test/resources/second.proj'/>
885 <Target Name='BeforeBuild'>
886 <Message Text='Overriding BeforeBuild'/>
890 engine = new Engine (Consts.BinPath);
891 project = engine.CreateNewProject ();
892 project.LoadXml (documentString);
894 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
895 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
896 engine.RegisterLogger (logger);
898 bool result = project.Build ("Build");
900 logger.DumpMessages ();
901 Assert.Fail ("Build failed");
904 logger.CheckLoggedMessageHead ("Overriding BeforeBuild", "A1");
905 logger.CheckLoggedMessageHead ("Build executing", "A1");
907 Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected extra messages found");
912 [Category ("NotDotNet")]
913 public void TestBeforeAndAfterTargets ()
918 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""4.0"">
919 <Target Name=""DefaultBeforeTarget1"" BeforeTargets=""Default"">
920 <Message Text=""Hello from DefaultBeforeTarget1""/>
923 <Target Name=""DefaultBeforeTarget2"" BeforeTargets=""Default;Default;NonExistant"">
924 <Message Text=""Hello from DefaultBeforeTarget2""/>
928 <Target Name=""DefaultAfterTarget"" AfterTargets=""Default ; Foo"">
929 <Message Text=""Hello from DefaultAfterTarget""/>
932 <Target Name=""Default"" DependsOnTargets=""DefaultDependsOn"">
933 <Message Text=""Hello from Default""/>
936 <Target Name=""DefaultDependsOn"">
937 <Message Text=""Hello from DefaultDependsOn""/>
941 engine = new Engine ();
942 project = engine.CreateNewProject ();
943 project.LoadXml (projectString);
945 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
946 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
947 engine.RegisterLogger (logger);
949 if (!project.Build ("Default")) {
950 logger.DumpMessages ();
951 Assert.Fail ("Build failed");
954 logger.CheckLoggedMessageHead ("Hello from DefaultDependsOn", "A1");
955 logger.CheckLoggedMessageHead ("Hello from DefaultBeforeTarget1", "A1");
956 logger.CheckLoggedMessageHead ("Hello from DefaultBeforeTarget2", "A1");
957 logger.CheckLoggedMessageHead ("Hello from Default", "A1");
958 logger.CheckLoggedMessageHead ("Hello from DefaultAfterTarget", "A1");
960 Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected messages found");
962 //warnings for referencing unknown targets: NonExistant and Foo
963 Assert.AreEqual (2, logger.WarningsCount, "Expected warnings not raised");
968 public void TestTargetReturns ()
970 engine = new Engine (Consts.BinPath);
971 project = engine.CreateNewProject ();
972 project.Load (Path.Combine ("Test", Path.Combine ("resources", "TestReturns.csproj")));
974 var logger = new TestMessageLogger ();
975 engine.RegisterLogger (logger);
977 bool result = project.Build ("Main");
979 logger.DumpMessages ();
980 Assert.Fail ("Build failed");
983 logger.CheckLoggedMessageHead ("Result: Bar", "A1");
985 Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected extra messages found");