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 TestRunTargetTwice ()
291 string documentString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
292 <Target Name=""Foo"">
293 <Message Text=""Foo ran""/>
295 <Target Name=""Main"">
296 <MSBuild Projects=""$(MSBuildProjectFile)"" Targets=""Foo;Foo"" />
301 var filepath = Path.GetTempFileName ();
303 File.WriteAllText (filepath, documentString);
305 var engine = new Engine (Consts.BinPath);
306 var project = engine.CreateNewProject ();
307 project.Load (filepath);
309 var logger = new TestMessageLogger ();
310 engine.RegisterLogger (logger);
312 var result = project.Build ("Main");
314 logger.DumpMessages ();
315 Assert.Fail ("Build failed, see the logs");
318 Assert.AreEqual(1, logger.NormalMessageCount, "Expected number of messages");
319 logger.CheckLoggedMessageHead ("Foo ran", "A1");
321 Assert.AreEqual(0, logger.NormalMessageCount, "Extra messages found");
322 Assert.AreEqual(0, logger.WarningMessageCount, "Extra warning messages found");
324 Assert.AreEqual(2, logger.TargetStarted, "TargetStarted count");
325 Assert.AreEqual(2, logger.TargetFinished, "TargetFinished count");
327 Assert.IsTrue (result);
329 File.Delete (filepath);
334 public void TestTargetOutputs1 ()
339 string documentString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
341 <fruit Include=""apple""/>
342 <fruit Include=""rhubarb""/>
343 <fruit Include=""apricot""/>
346 <Target Name=""Main"">
347 <CallTarget Targets=""foo"">
348 <Output TaskParameter=""TargetOutputs"" ItemName=""AllOut""/>
351 <CallTarget Targets=""foo"">
352 <Output TaskParameter=""TargetOutputs"" ItemName=""AllOut""/>
354 <Message Text=""AllOut: @(AllOut)""/>
357 <Target Name=""foo"" Outputs=""@(FooItem)"">
358 <Message Text=""foo called""/>
359 <CreateItem Include=""%(fruit.Identity)"">
360 <Output TaskParameter=""Include"" ItemName=""FooItem""/>
362 <Message Text=""FooItem: @(FooItem)""/>
366 engine = new Engine (Consts.BinPath);
367 project = engine.CreateNewProject ();
368 project.LoadXml (documentString);
370 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
371 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
372 engine.RegisterLogger (logger);
374 bool result = project.Build ("Main");
376 logger.DumpMessages ();
377 Assert.Fail ("Build failed");
381 Assert.AreEqual (3, logger.NormalMessageCount, "Expected number of messages");
382 logger.CheckLoggedMessageHead ("foo called", "A1");
383 logger.CheckLoggedMessageHead ("FooItem: apple;rhubarb;apricot", "A2");
384 logger.CheckLoggedMessageHead ("AllOut: apple;rhubarb;apricot;apple;rhubarb;apricot", "A3");
385 Assert.AreEqual (0, logger.NormalMessageCount, "Extra messages found");
387 Assert.AreEqual (2, logger.TargetStarted, "TargetStarted count");
388 Assert.AreEqual (2, logger.TargetFinished, "TargetFinished count");
389 Assert.AreEqual (8, logger.TaskStarted, "TaskStarted count");
390 Assert.AreEqual (8, logger.TaskFinished, "TaskFinished count");
392 } catch (AssertionException) {
393 logger.DumpMessages ();
398 bool Build (string projectXml, ILogger logger)
401 var reader = new StringReader (projectXml);
402 var xml = XmlReader.Create (reader);
403 return BuildOnDotNet (xml, logger);
405 return BuildOnMono (projectXml, logger);
409 bool BuildOnDotNet (XmlReader reader, ILogger logger)
411 var type = Type.GetType ("Microsoft.Build.Evaluation.ProjectCollection, Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
413 var prop = type.GetProperty ("GlobalProjectCollection");
414 var coll = prop.GetValue (null, null);
416 var loadProject = coll.GetType ().GetMethod (
417 "LoadProject", new Type[] { typeof (XmlReader), typeof (string) });
418 var proj = loadProject.Invoke (coll, new object[] { reader, "4.0" });
420 var build = proj.GetType ().GetMethod ("Build", new Type[] { typeof (string), typeof (ILogger[]) });
421 var ret = (bool)build.Invoke (proj, new object[] { "Main", new ILogger[] { logger }});
425 bool BuildOnMono (string projectXml, ILogger logger)
427 var engine = new Engine (Consts.BinPath);
428 var project = engine.CreateNewProject ();
429 project.LoadXml (projectXml);
431 engine.RegisterLogger (logger);
433 return project.Build ("Main");
436 TestMessageLogger CreateLogger (string projectXml)
438 var logger = new TestMessageLogger ();
439 var result = Build (projectXml, logger);
442 logger.DumpMessages ();
443 Assert.Fail ("Build failed");
449 void ItemGroupInsideTarget (string xml, params string[] messages)
451 ItemGroupInsideTarget (xml, 1, messages);
454 void ItemGroupInsideTarget (string xml, int expectedTargetCount, params string[] messages)
456 var logger = CreateLogger (xml);
460 Assert.AreEqual(messages.Length, logger.NormalMessageCount, "Expected number of messages");
461 for (int i = 0; i < messages.Length; i++)
462 logger.CheckLoggedMessageHead (messages [i], i.ToString ());
463 Assert.AreEqual(0, logger.NormalMessageCount, "Extra messages found");
464 Assert.AreEqual(0, logger.WarningMessageCount, "Extra warningmessages found");
466 Assert.AreEqual(expectedTargetCount, logger.TargetStarted, "TargetStarted count");
467 Assert.AreEqual(expectedTargetCount, logger.TargetFinished, "TargetFinished count");
468 Assert.AreEqual(messages.Length, logger.TaskStarted, "TaskStarted count");
469 Assert.AreEqual(messages.Length, logger.TaskFinished, "TaskFinished count");
471 catch (AssertionException)
473 logger.DumpMessages();
479 public void BuildProjectWithItemGroupInsideTarget ()
481 ItemGroupInsideTarget (
482 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
484 <fruit Include=""apple""/>
485 <fruit Include=""apricot""/>
488 <Target Name=""Main"">
490 <fruit Include=""raspberry"" />
492 <Message Text=""%(fruit.Identity)""/>
494 </Project>", "apple", "apricot", "raspberry");
498 public void BuildProjectWithItemGroupInsideTarget2 ()
500 ItemGroupInsideTarget (
501 @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""4.0"">
514 <Sub>$(Foo);Hello</Sub>
518 <Message Text='@(A)' />
519 <Message Text='%(A.Sub)' />
521 </Project>", "1;2", "Foo", "Bar;Hello");
525 public void BuildProjectWithPropertyGroupInsideTarget ()
527 ItemGroupInsideTarget (
528 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
534 <Target Name=""Main"">
535 <Message Text='$(A)' />
539 <Message Text='$(A)' />
541 </Project>", "Foo", "Bar");
545 public void BuildProjectWithPropertyGroupInsideTarget2 ()
547 ItemGroupInsideTarget (
548 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
554 <Target Name=""Main"">
555 <Message Text='$(A)' />
556 <PropertyGroup Condition='true'>
557 <B Condition='false'>False</B>
559 <PropertyGroup Condition='true'>
562 <Message Text='$(A)' />
563 <Message Text='$(B)' />
565 <A Condition='$(A) == $(B)'>Equal</A>
567 <Message Text='$(A)' />
569 </Project>", "Foo", "Bar", "Bar", "Equal");
573 public void ItemGroupInsideTarget_ModifyMetadata ()
575 ItemGroupInsideTarget (
576 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
578 <Server Include='Server1'>
579 <AdminContact>Mono</AdminContact>
581 <Server Include='Server2'>
582 <AdminContact>Mono</AdminContact>
584 <Server Include='Server3'>
585 <AdminContact>Root</AdminContact>
591 <Server Condition=""'%(Server.AdminContact)' == 'Mono'"">
592 <AdminContact>Monkey</AdminContact>
596 <Message Text='%(Server.Identity) : %(Server.AdminContact)' />
598 </Project>", "Server1 : Monkey", "Server2 : Monkey", "Server3 : Root");
602 public void ItemGroupInsideTarget_RemoveItem ()
604 ItemGroupInsideTarget (
605 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
607 <Foo Include='A;B;C;D' />
615 <Message Text='@(Foo)' />
617 </Project>", "A;C;D");
621 public void ItemGroupInsideTarget_DontKeepDuplicates ()
623 ItemGroupInsideTarget (
624 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
626 <Foo Include='A;B' />
631 <Hello>Boston</Hello>
637 <Foo Include='B;C;D' KeepDuplicates='false'>
638 <Hello>Boston</Hello>
642 <Message Text='@(Foo)' />
644 </Project>", "A;B;C;D;B;C");
648 public void ItemGroupInsideTarget_RemoveMetadata ()
650 ItemGroupInsideTarget (
651 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
658 <Hello>Boston</Hello>
670 <Bar Include='@(Foo)' RemoveMetadata='$(Foo)' />
672 <Hello>Monkey</Hello>
676 <Message Text='%(Bar.Identity)' Condition=""'%(Bar.Hello)' != ''""/>
682 public void ItemGroupInsideTarget_RemoveMetadata2 ()
684 ItemGroupInsideTarget (
685 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
692 <Hello>Boston</Hello>
704 <Foo RemoveMetadata='$(Foo)' />
706 <Hello>Monkey</Hello>
710 <Message Text='%(Foo.Identity)' Condition=""'%(Foo.Hello)' != ''""/>
716 public void ItemGroupInsideTarget_KeepMetadata ()
718 ItemGroupInsideTarget (
719 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
726 <Hello>Boston</Hello>
735 <Foo KeepMetadata='Test' />
737 <Hello>Monkey</Hello>
741 <Message Text='%(Foo.Identity)' Condition=""'%(Foo.Test)' != ''""/>
747 public void ItemGroupInsideTarget_UpdateMetadata ()
749 ItemGroupInsideTarget (
750 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
752 <ProjectReference Include='xyz'/>
755 <Target Name='Main' DependsOnTargets='CreateBar'>
756 <Message Text='Before: $(Bar)'/>
759 <AdditionalProperties>A=b</AdditionalProperties>
762 <Message Text='After: $(Bar)'/>
765 <Target Name='CreateBar'>
770 </Project>", 2, "Before: Bar01", "After: Bar01");
774 public void ItemGroupInsideTarget_Batching ()
776 ItemGroupInsideTarget (
777 @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
780 <Foo Include='A;B' />
781 <All Include='%(Foo.Identity)' />
783 <Message Text='%(All.Identity)' />
785 </Project>", "A", "B");
789 public void ItemGroupInsideTarget_Condition ()
791 ItemGroupInsideTarget (
792 @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""4.0"">
794 <Summer>true</Summer>
797 <Weather Include='Sun;Rain' />
801 <ItemGroup Condition=""'$(Summer)' != 'true'"">
802 <Weather Include='Snow' />
804 <Message Text='%(Weather.Identity)' />
806 </Project>", "Sun", "Rain");
810 public void PropertyGroupInsideTarget_Condition ()
812 ItemGroupInsideTarget (
813 @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""4.0"">
815 <Shells Include=""/bin/sh;/bin/bash;/bin/false"" />
820 <HasBash Condition=""'%(Shells.Filename)' == 'bash'"">true</HasBash>
823 <ItemGroup Condition=""'$(HasBash)' == 'true'"">
824 <Weather Include='Rain' />
826 <Message Text='%(Weather.Identity)' />
828 </Project>", "Rain");
833 public void ItemGroupInsideTarget_Expression_in_Metadata ()
835 ItemGroupInsideTarget (
836 @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""4.0"">
838 <Foo Include='output1'>
839 <Inputs>input1a;input1b</Inputs>
841 <Foo Include='output2'>
842 <Inputs>input2a;input2b</Inputs>
846 <Target Name='Main' DependsOnTargets='_PrepareItems' Inputs='@(_Foo)' Outputs='%(Result)'>
847 <Message Text='COMPILE: @(_Foo) - %(_Foo.Result)' />
850 <Target Name='_PrepareItems'>
852 <_Foo Include='%(Foo.Inputs)'>
853 <Result>%(Foo.Identity)</Result>
858 3, "COMPILE: input1a;input1b - output1", "COMPILE: input2a;input2b - output2");
863 public void TestTargetOutputsIncludingMetadata ()
868 string documentString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
870 <fruit Include=""apple""><md>a</md></fruit>
871 <fruit Include=""rhubarb""><md>b</md></fruit>
872 <fruit Include=""apricot""><md>c</md></fruit>
875 <Target Name=""Main"">
876 <CallTarget Targets=""foo"">
877 <Output TaskParameter=""TargetOutputs"" ItemName=""AllOut""/>
880 <CallTarget Targets=""foo"">
881 <Output TaskParameter=""TargetOutputs"" ItemName=""AllOut""/>
883 <Message Text=""AllOut: @(AllOut) metadata: %(AllOut.md)""/>
886 <Target Name=""foo"" Outputs=""@(FooItem)"">
887 <Message Text=""foo called""/>
888 <CreateItem Include=""@(fruit)"">
889 <Output TaskParameter=""Include"" ItemName=""FooItem""/>
891 <Message Text=""FooItem: @(FooItem) metadata: %(FooItem.md)""/>
895 engine = new Engine (Consts.BinPath);
896 project = engine.CreateNewProject ();
897 project.LoadXml (documentString);
899 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
900 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
901 engine.RegisterLogger (logger);
903 bool result = project.Build ("Main");
905 logger.DumpMessages ();
906 Assert.Fail ("Build failed");
910 logger.CheckLoggedMessageHead ("foo called", "A1");
911 logger.CheckLoggedMessageHead ("FooItem: apple metadata: a", "A2");
912 logger.CheckLoggedMessageHead ("FooItem: rhubarb metadata: b", "A3");
913 logger.CheckLoggedMessageHead ("FooItem: apricot metadata: c", "A4");
915 logger.CheckLoggedMessageHead ("AllOut: apple;apple metadata: a", "A5");
916 logger.CheckLoggedMessageHead ("AllOut: rhubarb;rhubarb metadata: b", "A6");
917 logger.CheckLoggedMessageHead ("AllOut: apricot;apricot metadata: c", "A7");
919 Assert.AreEqual (0, logger.NormalMessageCount, "Extra messages found");
921 Assert.AreEqual (2, logger.TargetStarted, "TargetStarted count");
922 Assert.AreEqual (2, logger.TargetFinished, "TargetFinished count");
923 Assert.AreEqual (10, logger.TaskStarted, "TaskStarted count");
924 Assert.AreEqual (10, logger.TaskFinished, "TaskFinished count");
926 } catch (AssertionException) {
927 logger.DumpMessages ();
933 public void TestOverridingTargets ()
938 string second = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
939 <Target Name='BeforeBuild'/>
940 <Target Name='AfterBuild'/>
941 <Target Name='Build' DependsOnTargets='BeforeBuild'>
942 <Message Text='Build executing'/>
943 <CallTarget Targets='AfterBuild'/>
946 using (StreamWriter sw = new StreamWriter (Path.Combine ("Test", Path.Combine ("resources", "second.proj")))) {
950 string documentString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
951 <Target Name='AfterBuild'>
952 <Message Text='Overriding AfterBuild'/>
955 <Import Project='Test/resources/second.proj'/>
956 <Target Name='BeforeBuild'>
957 <Message Text='Overriding BeforeBuild'/>
961 engine = new Engine (Consts.BinPath);
962 project = engine.CreateNewProject ();
963 project.LoadXml (documentString);
965 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
966 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
967 engine.RegisterLogger (logger);
969 bool result = project.Build ("Build");
971 logger.DumpMessages ();
972 Assert.Fail ("Build failed");
975 logger.CheckLoggedMessageHead ("Overriding BeforeBuild", "A1");
976 logger.CheckLoggedMessageHead ("Build executing", "A1");
978 Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected extra messages found");
982 [Category ("NotDotNet")]
983 public void TestBeforeAndAfterTargets ()
988 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""4.0"">
989 <Target Name=""DefaultBeforeTarget1"" BeforeTargets=""Default"">
990 <Message Text=""Hello from DefaultBeforeTarget1""/>
993 <Target Name=""DefaultBeforeTarget2"" BeforeTargets=""Default;Default;NonExistant"">
994 <Message Text=""Hello from DefaultBeforeTarget2""/>
998 <Target Name=""DefaultAfterTarget"" AfterTargets=""Default ; Foo"">
999 <Message Text=""Hello from DefaultAfterTarget""/>
1002 <Target Name=""Default"" DependsOnTargets=""DefaultDependsOn"">
1003 <Message Text=""Hello from Default""/>
1006 <Target Name=""DefaultDependsOn"">
1007 <Message Text=""Hello from DefaultDependsOn""/>
1011 engine = new Engine ();
1012 project = engine.CreateNewProject ();
1013 project.LoadXml (projectString);
1015 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
1016 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
1017 engine.RegisterLogger (logger);
1019 if (!project.Build ("Default")) {
1020 logger.DumpMessages ();
1021 Assert.Fail ("Build failed");
1024 logger.CheckLoggedMessageHead ("Hello from DefaultDependsOn", "A1");
1025 logger.CheckLoggedMessageHead ("Hello from DefaultBeforeTarget1", "A1");
1026 logger.CheckLoggedMessageHead ("Hello from DefaultBeforeTarget2", "A1");
1027 logger.CheckLoggedMessageHead ("Hello from Default", "A1");
1028 logger.CheckLoggedMessageHead ("Hello from DefaultAfterTarget", "A1");
1030 Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected messages found");
1032 //warnings for referencing unknown targets: NonExistant and Foo
1033 Assert.AreEqual (2, logger.WarningsCount, "Expected warnings not raised");
1037 public void TestTargetReturns ()
1039 engine = new Engine (Consts.BinPath);
1040 project = engine.CreateNewProject ();
1041 project.Load (Path.Combine ("Test", Path.Combine ("resources", "TestReturns.csproj")));
1043 var logger = new TestMessageLogger ();
1044 engine.RegisterLogger (logger);
1046 bool result = project.Build ("Main");
1048 logger.DumpMessages ();
1049 Assert.Fail ("Build failed");
1052 logger.CheckLoggedMessageHead ("Result: Bar", "A1");
1054 Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected extra messages found");