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_UpdateMetadata ()
704 ItemGroupInsideTarget (
705 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
707 <ProjectReference Include='xyz'/>
710 <Target Name='Main' DependsOnTargets='CreateBar'>
711 <Message Text='Before: $(Bar)'/>
714 <AdditionalProperties>A=b</AdditionalProperties>
717 <Message Text='After: $(Bar)'/>
720 <Target Name='CreateBar'>
725 </Project>", 2, "Before: Bar01", "After: Bar01");
729 public void ItemGroupInsideTarget_Batching ()
731 ItemGroupInsideTarget (
732 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
735 <Foo Include='A;B' />
736 <All Include='%(Foo.Identity)' />
738 <Message Text='%(All.Identity)' />
740 </Project>", "A", "B");
744 public void ItemGroupInsideTarget_Condition ()
746 ItemGroupInsideTarget (
747 @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""4.0"">
749 <Summer>true</Summer>
752 <Weather Include='Sun;Rain' />
756 <ItemGroup Condition=""'$(Summer)' != 'true'"">
757 <Weather Include='Snow' />
759 <Message Text='%(Weather.Identity)' />
761 </Project>", "Sun", "Rain");
765 public void PropertyGroupInsideTarget_Condition ()
767 ItemGroupInsideTarget (
768 @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""4.0"">
770 <Shells Include=""/bin/sh;/bin/bash;/bin/false"" />
775 <HasBash Condition=""'%(Shells.Filename)' == 'bash'"">true</HasBash>
778 <ItemGroup Condition=""'$(HasBash)' == 'true'"">
779 <Weather Include='Rain' />
781 <Message Text='%(Weather.Identity)' />
783 </Project>", "Rain");
788 public void ItemGroupInsideTarget_Expression_in_Metadata ()
790 ItemGroupInsideTarget (
791 @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""4.0"">
793 <Foo Include='output1'>
794 <Inputs>input1a;input1b</Inputs>
796 <Foo Include='output2'>
797 <Inputs>input2a;input2b</Inputs>
801 <Target Name='Main' DependsOnTargets='_PrepareItems' Inputs='@(_Foo)' Outputs='%(Result)'>
802 <Message Text='COMPILE: @(_Foo) - %(_Foo.Result)' />
805 <Target Name='_PrepareItems'>
807 <_Foo Include='%(Foo.Inputs)'>
808 <Result>%(Foo.Identity)</Result>
813 3, "COMPILE: input1a;input1b - output1", "COMPILE: input2a;input2b - output2");
818 public void TestTargetOutputsIncludingMetadata ()
823 string documentString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
825 <fruit Include=""apple""><md>a</md></fruit>
826 <fruit Include=""rhubarb""><md>b</md></fruit>
827 <fruit Include=""apricot""><md>c</md></fruit>
830 <Target Name=""Main"">
831 <CallTarget Targets=""foo"">
832 <Output TaskParameter=""TargetOutputs"" ItemName=""AllOut""/>
835 <CallTarget Targets=""foo"">
836 <Output TaskParameter=""TargetOutputs"" ItemName=""AllOut""/>
838 <Message Text=""AllOut: @(AllOut) metadata: %(AllOut.md)""/>
841 <Target Name=""foo"" Outputs=""@(FooItem)"">
842 <Message Text=""foo called""/>
843 <CreateItem Include=""@(fruit)"">
844 <Output TaskParameter=""Include"" ItemName=""FooItem""/>
846 <Message Text=""FooItem: @(FooItem) metadata: %(FooItem.md)""/>
850 engine = new Engine (Consts.BinPath);
851 project = engine.CreateNewProject ();
852 project.LoadXml (documentString);
854 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
855 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
856 engine.RegisterLogger (logger);
858 bool result = project.Build ("Main");
860 logger.DumpMessages ();
861 Assert.Fail ("Build failed");
865 logger.CheckLoggedMessageHead ("foo called", "A1");
866 logger.CheckLoggedMessageHead ("FooItem: apple metadata: a", "A2");
867 logger.CheckLoggedMessageHead ("FooItem: rhubarb metadata: b", "A3");
868 logger.CheckLoggedMessageHead ("FooItem: apricot metadata: c", "A4");
870 logger.CheckLoggedMessageHead ("AllOut: apple;apple metadata: a", "A5");
871 logger.CheckLoggedMessageHead ("AllOut: rhubarb;rhubarb metadata: b", "A6");
872 logger.CheckLoggedMessageHead ("AllOut: apricot;apricot metadata: c", "A7");
874 Assert.AreEqual (0, logger.NormalMessageCount, "Extra messages found");
876 Assert.AreEqual (2, logger.TargetStarted, "TargetStarted count");
877 Assert.AreEqual (2, logger.TargetFinished, "TargetFinished count");
878 Assert.AreEqual (10, logger.TaskStarted, "TaskStarted count");
879 Assert.AreEqual (10, logger.TaskFinished, "TaskFinished count");
881 } catch (AssertionException) {
882 logger.DumpMessages ();
888 public void TestOverridingTargets ()
893 string second = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
894 <Target Name='BeforeBuild'/>
895 <Target Name='AfterBuild'/>
896 <Target Name='Build' DependsOnTargets='BeforeBuild'>
897 <Message Text='Build executing'/>
898 <CallTarget Targets='AfterBuild'/>
901 using (StreamWriter sw = new StreamWriter (Path.Combine ("Test", Path.Combine ("resources", "second.proj")))) {
905 string documentString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
906 <Target Name='AfterBuild'>
907 <Message Text='Overriding AfterBuild'/>
910 <Import Project='Test/resources/second.proj'/>
911 <Target Name='BeforeBuild'>
912 <Message Text='Overriding BeforeBuild'/>
916 engine = new Engine (Consts.BinPath);
917 project = engine.CreateNewProject ();
918 project.LoadXml (documentString);
920 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
921 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
922 engine.RegisterLogger (logger);
924 bool result = project.Build ("Build");
926 logger.DumpMessages ();
927 Assert.Fail ("Build failed");
930 logger.CheckLoggedMessageHead ("Overriding BeforeBuild", "A1");
931 logger.CheckLoggedMessageHead ("Build executing", "A1");
933 Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected extra messages found");
937 [Category ("NotDotNet")]
938 public void TestBeforeAndAfterTargets ()
943 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""4.0"">
944 <Target Name=""DefaultBeforeTarget1"" BeforeTargets=""Default"">
945 <Message Text=""Hello from DefaultBeforeTarget1""/>
948 <Target Name=""DefaultBeforeTarget2"" BeforeTargets=""Default;Default;NonExistant"">
949 <Message Text=""Hello from DefaultBeforeTarget2""/>
953 <Target Name=""DefaultAfterTarget"" AfterTargets=""Default ; Foo"">
954 <Message Text=""Hello from DefaultAfterTarget""/>
957 <Target Name=""Default"" DependsOnTargets=""DefaultDependsOn"">
958 <Message Text=""Hello from Default""/>
961 <Target Name=""DefaultDependsOn"">
962 <Message Text=""Hello from DefaultDependsOn""/>
966 engine = new Engine ();
967 project = engine.CreateNewProject ();
968 project.LoadXml (projectString);
970 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
971 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
972 engine.RegisterLogger (logger);
974 if (!project.Build ("Default")) {
975 logger.DumpMessages ();
976 Assert.Fail ("Build failed");
979 logger.CheckLoggedMessageHead ("Hello from DefaultDependsOn", "A1");
980 logger.CheckLoggedMessageHead ("Hello from DefaultBeforeTarget1", "A1");
981 logger.CheckLoggedMessageHead ("Hello from DefaultBeforeTarget2", "A1");
982 logger.CheckLoggedMessageHead ("Hello from Default", "A1");
983 logger.CheckLoggedMessageHead ("Hello from DefaultAfterTarget", "A1");
985 Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected messages found");
987 //warnings for referencing unknown targets: NonExistant and Foo
988 Assert.AreEqual (2, logger.WarningsCount, "Expected warnings not raised");
992 public void TestTargetReturns ()
994 engine = new Engine (Consts.BinPath);
995 project = engine.CreateNewProject ();
996 project.Load (Path.Combine ("Test", Path.Combine ("resources", "TestReturns.csproj")));
998 var logger = new TestMessageLogger ();
999 engine.RegisterLogger (logger);
1001 bool result = project.Build ("Main");
1003 logger.DumpMessages ();
1004 Assert.Fail ("Build failed");
1007 logger.CheckLoggedMessageHead ("Result: Bar", "A1");
1009 Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected extra messages found");