5 // Ankit Jain (jankit@novell.com)
7 // Copyright 2008 Novell, Inc (http://www.novell.com)
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 using System.Collections.Generic;
31 using NUnit.Framework;
32 using Microsoft.Build.BuildEngine;
33 using Microsoft.Build.Framework;
34 using Microsoft.Build.Tasks;
35 using Microsoft.Build.Utilities;
37 namespace MonoTests.Microsoft.Build.Tasks
40 public class TaskBatchingTest
45 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
47 <ResXFile Include=""Item1"">
50 <ResXFile Include=""Item2"">
53 <ResXFile Include=""Item3"">
56 <ResXFile Include=""Item4"">
59 <ResXFile Include=""Item5"">
62 <ResXFile Include=""Item6"">
67 <Target Name=""ShowMessage"">
69 Text = ""Culture: %(ResXFile.Culture) -- ResXFile: @(ResXFile)"" />
73 Engine engine = new Engine (Consts.BinPath);
74 Project project = engine.CreateNewProject ();
76 TestMessageLogger testLogger = new TestMessageLogger ();
77 engine.RegisterLogger (testLogger);
79 project.LoadXml (projectString);
80 Assert.IsTrue (project.Build ("ShowMessage"), "A1: Build failed");
82 CheckMessage (testLogger, "fr", "Item1;Item2;Item5", "A2");
83 CheckMessage (testLogger, "en", "Item3", "A3");
84 CheckMessage (testLogger, "gb", "Item4", "A4");
85 CheckMessage (testLogger, "it", "Item6", "A5");
87 CheckEngineEventCounts (testLogger, 1, 1, 4, 4);
90 // Test1 with unqualified %(Culture)
94 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
96 <ResXFile Include=""Item1"">
99 <ResXFile Include=""Item2"">
100 <Culture>fr</Culture>
102 <ResXFile Include=""Item3"">
103 <Culture>en</Culture>
105 <ResXFile Include=""Item4"">
106 <Culture>gb</Culture>
108 <ResXFile Include=""Item5"">
109 <Culture>fr</Culture>
111 <ResXFile Include=""Item6"">
112 <Culture>it</Culture>
116 <Target Name=""ShowMessage"">
118 Text = ""Culture: %(Culture) -- ResXFile: @(ResXFile)"" />
122 Engine engine = new Engine (Consts.BinPath);
123 Project project = engine.CreateNewProject ();
125 TestMessageLogger testLogger = new TestMessageLogger ();
126 engine.RegisterLogger (testLogger);
128 project.LoadXml (projectString);
129 Assert.IsTrue (project.Build ("ShowMessage"), "A1: Build failed");
131 CheckMessage (testLogger, "fr", "Item1;Item2;Item5", "A2");
132 CheckMessage (testLogger, "en", "Item3", "A3");
133 CheckMessage (testLogger, "gb", "Item4", "A4");
134 CheckMessage (testLogger, "it", "Item6", "A5");
136 CheckEngineEventCounts (testLogger, 1, 1, 4, 4);
140 public void TestUnqualifiedMetadataReference ()
142 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
144 <ResXFile Include=""Item1"">
145 <Culture>fr</Culture>
147 <ResXFile Include=""Item5"" />
148 <ResXFile Include=""Item6"">
149 <Culture>it</Culture>
153 <Target Name=""ShowMessage"">
155 Text = ""Culture: %(Culture) -- ResXFile: @(ResXFile)"" />
159 Engine engine = new Engine (Consts.BinPath);
160 Project project = engine.CreateNewProject ();
162 TestMessageLogger testLogger = new TestMessageLogger ();
163 engine.RegisterLogger (testLogger);
165 project.LoadXml (projectString);
167 //Fails as Culture is being referenced unqualified, and no Culture is
168 //specified for "Item5"
169 bool result = project.Build ("ShowMessage");
171 Assert.Fail ("A1: Build should have failed");
173 CheckEngineEventCounts (testLogger, 1, 1, 0, 0);
179 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
181 <ResXFile Include=""Item1"">
182 <Culture>fr</Culture>
184 <ResXFile Include=""Item5"" />
185 <ResXFile Include=""Item6"">
186 <Culture>it</Culture>
190 <Target Name=""ShowMessage"">
192 Text = ""Culture: %(ResXFile.Culture) -- ResXFile: @(ResXFile)"" />
196 Engine engine = new Engine (Consts.BinPath);
197 Project project = engine.CreateNewProject ();
199 TestMessageLogger testLogger = new TestMessageLogger ();
200 engine.RegisterLogger (testLogger);
202 project.LoadXml (projectString);
204 //no Culture is specified for "Item5", but
205 //Culture is being referenced __qualified__, so works
206 Assert.IsTrue (project.Build ("ShowMessage"), "A1: Build failed");
208 CheckMessage (testLogger, "fr", "Item1", "A2");
209 CheckMessage (testLogger, "", "Item5", "A3");
210 CheckMessage (testLogger, "it", "Item6", "A3");
211 CheckEngineEventCounts (testLogger, 1, 1, 3, 3);
215 public void TestMultiItemCollections ()
217 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
219 <ResXFile Include=""Item1"">
220 <Culture>fr</Culture>
222 <ResXFile Include=""Item2"">
223 <Culture>fr</Culture>
225 <ResXFile Include=""Item3"">
226 <Culture>en</Culture>
228 <ResXFile Include=""Item4"">
229 <Culture>gb</Culture>
231 <ResXFile Include=""Item6"">
232 <Culture>it</Culture>
235 <NonResXFile Include=""Item7"">
236 <Culture>it</Culture>
238 <NonResXFile Include=""Item8"">
239 <Culture>en</Culture>
241 <NonResXFile Include=""Item9"">
242 <Culture>en</Culture>
246 <Target Name=""ShowMessage"">
248 Text = ""Culture: %(Culture) -- ResXFiles: @(ResXFile) NonResXFiles: @(NonResXFile)"" />
252 Engine engine = new Engine (Consts.BinPath);
253 Project project = engine.CreateNewProject ();
255 TestMessageLogger testLogger = new TestMessageLogger ();
256 engine.RegisterLogger (testLogger);
258 project.LoadXml (projectString);
259 Assert.IsTrue (project.Build ("ShowMessage"), "A1: Build failed");
261 CheckMessage2 (testLogger, "fr", "Item1;Item2", string.Empty, "A2");
262 CheckMessage2 (testLogger, "en", "Item3", "Item8;Item9", "A3");
263 CheckMessage2 (testLogger, "gb", "Item4", string.Empty, "A4");
264 CheckMessage2 (testLogger, "it", "Item6", "Item7", "A6");
265 CheckEngineEventCounts (testLogger, 1, 1, 4, 4);
269 public void TestConditionalBatching ()
271 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
273 <ResXFile Include=""Item1"">
274 <Culture>fr</Culture>
276 <ResXFile Include=""Item2"">
277 <Culture>fr</Culture>
279 <ResXFile Include=""Item3"">
280 <Culture>en</Culture>
282 <ResXFile Include=""Item4"">
283 <Culture>gb</Culture>
285 <ResXFile Include=""Item6"">
286 <Culture>it</Culture>
289 <NonResXFile Include=""Item7"">
290 <Culture>it</Culture>
292 <NonResXFile Include=""Item8"">
293 <Culture>en</Culture>
295 <NonResXFile Include=""Item9"">
296 <Culture>en</Culture>
300 <Target Name=""ShowMessage"">
302 Text = ""ResXFiles: @(ResXFile) NonResXFiles: @(NonResXFile)""
303 Condition = ""'%(Culture)' == 'fr'""/>
307 Engine engine = new Engine (Consts.BinPath);
308 Project project = engine.CreateNewProject ();
310 TestMessageLogger testLogger = new TestMessageLogger ();
311 engine.RegisterLogger (testLogger);
313 project.LoadXml (projectString);
314 Assert.IsTrue (project.Build ("ShowMessage"), "A1: Build failed");
316 testLogger.CheckLoggedMessageHead ("ResXFiles: Item1;Item2 NonResXFiles: ", "A2");
317 CheckEngineEventCounts (testLogger, 1, 1, 1, 1);
321 public void TestMultipleMetadataReference ()
323 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
325 <ExampColl Include=""Item1"">
328 <ExampColl Include=""Item2"">
331 <ExampColl Include=""Item3"">
335 <ExampColl2 Include=""Item4"">
338 <ExampColl2 Include=""Item5"">
342 <ExampColl2 Include=""Item6"">
347 <Target Name=""ShowMessage"">
348 <Message Text = ""Number: %(Number) Color: %(ExampColl2.Color)-- Items in ExampColl: @(ExampColl) ExampColl2: @(ExampColl2)""/>
352 Engine engine = new Engine (Consts.BinPath);
353 Project project = engine.CreateNewProject ();
355 TestMessageLogger testLogger = new TestMessageLogger ();
356 engine.RegisterLogger (testLogger);
358 project.LoadXml (projectString);
359 Assert.IsTrue (project.Build ("ShowMessage"), "A1: Build failed");
361 CheckLoggedMessageAny (testLogger, "Number: 1 Color: -- Items in ExampColl: Item1;Item3 ExampColl2: Item4", "A2");
362 CheckLoggedMessageAny (testLogger, "Number: 2 Color: Red-- Items in ExampColl: ExampColl2: Item5", "A3");
363 CheckLoggedMessageAny (testLogger, "Number: 3 Color: Green-- Items in ExampColl: ExampColl2: Item6", "A4");
364 CheckLoggedMessageAny (testLogger, "Number: 2 Color: -- Items in ExampColl: Item2 ExampColl2: ", "A5");
365 Assert.AreEqual (0, testLogger.Count, "A6");
366 CheckEngineEventCounts (testLogger, 1, 1, 4, 4);
370 public void TestMultipleMetadataReference2 ()
372 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
374 <GroupA Include=""file1.txt""/>
375 <GroupA Include=""file2.txt""/>
376 <GroupA Include=""file3.txt""/>
377 <GroupA Include=""file3.txt""/>
378 <GroupA Include=""file4.txt""/>
382 <GroupB Include=""file1.txt""/>
383 <GroupB Include=""file3.txt""/>
384 <GroupB Include=""file5.txt""/>
386 <GroupC Include=""PreExistingValue""/>
389 <Target Name=""Build"">
390 <CreateItem Include=""@(GroupA)"" Condition=""'%(Identity)' != '' and '@(GroupA)' != '' and '@(GroupB)' != ''"" >
391 <Output TaskParameter=""Include"" ItemName=""GroupC""/>
393 <Message Text=""%(GroupC.Identity)""/>
397 Engine engine = new Engine (Consts.BinPath);
398 Project project = engine.CreateNewProject ();
400 TestMessageLogger testLogger = new TestMessageLogger ();
401 engine.RegisterLogger (testLogger);
403 project.LoadXml (projectString);
404 Assert.IsTrue (project.Build ("Build"), "A1: Build failed");
406 BuildItemGroup include = project.GetEvaluatedItemsByName ("GroupC");
407 Assert.AreEqual (4, include.Count, "A2");
409 string [,] additional_metadata = new string [,] { { "Identity", "PreExistingValue" } };
410 CreateItemTest.CheckBuildItem (include [0], "GroupC", additional_metadata, "PreExistingValue", "A3");
412 additional_metadata = new string [,] { { "Identity", "file1.txt" } };
413 CreateItemTest.CheckBuildItem (include [1], "GroupC", additional_metadata, "file1.txt", "A4");
415 additional_metadata = new string [,] { { "Identity", "file3.txt" } };
416 CreateItemTest.CheckBuildItem (include [2], "GroupC", additional_metadata, "file3.txt", "A5");
417 CreateItemTest.CheckBuildItem (include [3], "GroupC", additional_metadata, "file3.txt", "A6");
419 CheckEngineEventCounts (testLogger, 1, 1, 5, 5);
423 public void TestIdentity ()
425 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
427 <ExampColl Include=""Item1""/>
428 <ExampColl Include=""Item2""/>
429 <ExampColl Include=""Item3""/>
430 <ExampColl Include=""Item4""/>
431 <ExampColl Include=""Item4""/>
432 <ExampColl Include=""Item5""/>
433 <ExampColl Include=""Item6""/>
435 <Target Name=""ShowMessage"">
436 <Message Text = ""Identity: %(IdenTIty) -- Items in ExampColl: @(ExampColl)""/>
440 Engine engine = new Engine (Consts.BinPath);
441 Project project = engine.CreateNewProject ();
443 TestMessageLogger testLogger = new TestMessageLogger ();
444 engine.RegisterLogger (testLogger);
446 project.LoadXml (projectString);
447 Assert.IsTrue (project.Build ("ShowMessage"), "A1: Build failed");
449 CheckLoggedMessageAny (testLogger, "Identity: Item1 -- Items in ExampColl: Item1", "A2");
450 CheckLoggedMessageAny (testLogger, "Identity: Item2 -- Items in ExampColl: Item2", "A3");
451 CheckLoggedMessageAny (testLogger, "Identity: Item3 -- Items in ExampColl: Item3", "A4");
452 CheckLoggedMessageAny (testLogger, "Identity: Item4 -- Items in ExampColl: Item4;Item4", "A5");
453 CheckLoggedMessageAny (testLogger, "Identity: Item5 -- Items in ExampColl: Item5", "A6");
454 CheckLoggedMessageAny (testLogger, "Identity: Item6 -- Items in ExampColl: Item6", "A7");
455 Assert.AreEqual (0, testLogger.Count, "A8");
456 CheckEngineEventCounts (testLogger, 1, 1, 6, 6);
460 public void TestFilter ()
462 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
464 <fruit Include=""apple"">
465 <consistency>firm</consistency>
467 <fruit Include=""orange"">
468 <consistency>pulpy</consistency>
470 <fruit Include=""banana"">
471 <consistency>softish</consistency>
473 <fruit Include=""pear"">
474 <consistency>unsound</consistency>
476 <fruit Include=""apricot"">
477 <consistency>unsound</consistency>
480 <Target Name=""Compost"">
481 <CreateItem Include=""@(fruit)"" Condition=""'%(consistency)' == 'pulpy' or '%(consistency)' == 'unsound' "">
482 <Output TaskParameter=""Include"" ItemName=""Final""/>
487 Engine engine = new Engine (Consts.BinPath);
488 Project project = engine.CreateNewProject ();
490 TestMessageLogger testLogger = new TestMessageLogger ();
491 engine.RegisterLogger (testLogger);
493 project.LoadXml (projectString);
494 Assert.IsTrue (project.Build ("Compost"), "A1: Build failed");
496 BuildItemGroup include = project.GetEvaluatedItemsByName ("Final");
497 Assert.AreEqual (3, include.Count, "A2");
499 string [,] additional_metadata = new string [,] { { "Identity", "orange" } };
500 CreateItemTest.CheckBuildItem (include [0], "Final", additional_metadata, "orange", "A3");
502 additional_metadata = new string [,] { { "Identity", "pear" } };
503 CreateItemTest.CheckBuildItem (include [1], "Final", additional_metadata, "pear", "A4");
505 additional_metadata = new string [,] { { "Identity", "apricot" } };
506 CreateItemTest.CheckBuildItem (include [2], "Final", additional_metadata, "apricot", "A5");
507 CheckEngineEventCounts (testLogger, 1, 1, 2, 2);
513 public void TestTargetBatching1 ()
515 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
517 <List1 Include=""fr_a.txt""><Culture>fr</Culture></List1>
518 <List1 Include=""en_b.txt""><Culture>en</Culture></List1>
519 <List1 Include=""fr_c.txt""><Culture>fr</Culture></List1>
520 <List1 Include=""gb_d.txt""><Culture>gb</Culture></List1>
522 <List2 Include=""fr_x.txt""><Culture>fr</Culture></List2>
523 <List2 Include=""gb_z.txt""><Culture>gb</Culture></List2>
525 <Foo Include=""1_a1""><Md>1</Md></Foo>
526 <Foo Include=""2_b1""><Md>2</Md></Foo>
527 <Foo Include=""1_c1""><Md>1</Md></Foo>
530 <Target Name=""foo"" >
531 <Message Text=""TargetStarted""/>
532 <Message Text=""List1: @(List1): %(Culture)""/>
533 <Message Text=""Foo: @(Foo): %(Md)""/>
537 Engine engine = new Engine (Consts.BinPath);
538 Project project = engine.CreateNewProject ();
540 TestMessageLogger testLogger = new TestMessageLogger ();
541 engine.RegisterLogger (testLogger);
543 project.LoadXml (projectString);
544 bool res = project.Build ("foo");
546 testLogger.DumpMessages ();
547 Assert.Fail ("A1: Build failed");
550 CheckLoggedMessagesInOrder (testLogger, new string [] {
551 "TargetStarted", "List1: fr_a.txt;fr_c.txt: fr",
552 "List1: en_b.txt: en", "List1: gb_d.txt: gb",
553 "Foo: 1_a1;1_c1: 1", "Foo: 2_b1: 2"
555 CheckEngineEventCounts (testLogger, 1, 1, 6, 6);
559 public void TestTargetBatching2 ()
561 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
563 <List1 Include=""fr_a.txt""><Culture>fr</Culture></List1>
564 <List1 Include=""en_b.txt""><Culture>en</Culture></List1>
565 <List1 Include=""fr_c.txt""><Culture>fr</Culture></List1>
566 <List1 Include=""gb_d.txt""><Culture>gb</Culture></List1>
568 <List2 Include=""fr_x.txt""><Culture>fr</Culture></List2>
569 <List2 Include=""gb_z.txt""><Culture>gb</Culture></List2>
571 <Foo Include=""1_a1""><Md>1</Md></Foo>
572 <Foo Include=""2_b1""><Md>2</Md></Foo>
573 <Foo Include=""1_c1""><Md>1</Md></Foo>
576 <Target Name=""foo"" Inputs=""@(List1)"" Outputs=""%(Culture).foo"">
577 <Message Text=""TargetStarted""/>
578 <Message Text=""List1: @(List1): %(Culture)""/>
579 <Message Text=""Foo: @(Foo): %(Md)""/>
583 Engine engine = new Engine (Consts.BinPath);
584 Project project = engine.CreateNewProject ();
586 TestMessageLogger testLogger = new TestMessageLogger ();
587 engine.RegisterLogger (testLogger);
589 project.LoadXml (projectString);
590 bool res = project.Build ("foo");
592 testLogger.DumpMessages ();
593 Assert.Fail ("A1: Build failed");
596 CheckLoggedMessagesInOrder (testLogger, new string [] {
597 "TargetStarted", "List1: fr_a.txt;fr_c.txt: fr",
598 "Foo: 1_a1;1_c1: 1", "Foo: 2_b1: 2",
600 "TargetStarted", "List1: en_b.txt: en",
601 "Foo: 1_a1;1_c1: 1", "Foo: 2_b1: 2",
603 "TargetStarted", "List1: gb_d.txt: gb",
604 "Foo: 1_a1;1_c1: 1", "Foo: 2_b1: 2"
606 CheckEngineEventCounts (testLogger, 3, 3, 12, 12);
610 public void TestTargetBatching3 ()
612 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
614 <List1 Include=""fr_a.txt""><Culture>fr</Culture></List1>
615 <List1 Include=""en_b.txt""><Culture>en</Culture></List1>
616 <List1 Include=""fr_c.txt""><Culture>fr</Culture></List1>
617 <List1 Include=""gb_d.txt""><Culture>gb</Culture></List1>
619 <List2 Include=""fr_x.txt""><Culture>fr</Culture></List2>
620 <List2 Include=""gb_z.txt""><Culture>gb</Culture></List2>
622 <Foo Include=""1_a1""><Md>1</Md></Foo>
623 <Foo Include=""2_b1""><Md>2</Md></Foo>
624 <Foo Include=""1_c1""><Md>1</Md></Foo>
626 <Target Name=""foo"" Inputs=""@(Foo)"" Outputs=""%(Md).foo"">
627 <Message Text=""TargetStarted""/>
628 <Message Text=""List1: @(List1): %(Culture)""/>
629 <Message Text=""Foo: @(Foo): %(Md)""/>
633 Engine engine = new Engine (Consts.BinPath);
634 Project project = engine.CreateNewProject ();
636 TestMessageLogger testLogger = new TestMessageLogger ();
637 engine.RegisterLogger (testLogger);
639 project.LoadXml (projectString);
640 bool res = project.Build ("foo");
642 testLogger.DumpMessages ();
643 Assert.Fail ("A1: Build failed");
646 CheckLoggedMessagesInOrder (testLogger, new string [] {
647 "TargetStarted", "List1: fr_a.txt;fr_c.txt: fr",
648 "List1: en_b.txt: en", "List1: gb_d.txt: gb",
650 "TargetStarted", "List1: fr_a.txt;fr_c.txt: fr",
651 "List1: en_b.txt: en", "List1: gb_d.txt: gb",
654 CheckEngineEventCounts (testLogger, 2, 2, 10, 10);
658 public void TestTargetBatching4 ()
660 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
662 <List1 Include=""fr_a.txt""><Culture>fr</Culture></List1>
663 <List1 Include=""en_b.txt""><Culture>en</Culture></List1>
664 <List1 Include=""fr_c.txt""><Culture>fr</Culture></List1>
665 <List1 Include=""gb_d.txt""><Culture>gb</Culture></List1>
667 <List2 Include=""fr_x.txt""><Culture>fr</Culture></List2>
668 <List2 Include=""gb_z.txt""><Culture>gb</Culture></List2>
670 <Foo Include=""1_a1""><Md>1</Md></Foo>
671 <Foo Include=""2_b1""><Md>2</Md></Foo>
672 <Foo Include=""1_c1""><Md>1</Md></Foo>
674 <Target Name=""foo"" Inputs=""@(List1)"" Outputs=""%(Culture).foo"">
675 <Message Text=""TargetStarted""/>
676 <Message Text=""List1: @(List1): %(Culture)""/>
677 <Message Text=""List2: @(List2): %(Culture)""/>
678 <Message Text=""Foo: @(Foo): %(Md)""/>
682 Engine engine = new Engine (Consts.BinPath);
683 Project project = engine.CreateNewProject ();
685 TestMessageLogger testLogger = new TestMessageLogger ();
686 engine.RegisterLogger (testLogger);
688 project.LoadXml (projectString);
689 bool res = project.Build ("foo");
691 testLogger.DumpMessages ();
692 Assert.Fail ("A1: Build failed");
695 CheckLoggedMessagesInOrder (testLogger, new string [] {
696 "TargetStarted", "List1: fr_a.txt;fr_c.txt: fr",
697 "List2: fr_x.txt: fr", "List2: gb_z.txt: gb",
698 "Foo: 1_a1;1_c1: 1", "Foo: 2_b1: 2",
700 "TargetStarted", "List1: en_b.txt: en",
701 "List2: fr_x.txt: fr", "List2: gb_z.txt: gb",
702 "Foo: 1_a1;1_c1: 1", "Foo: 2_b1: 2",
704 "TargetStarted", "List1: gb_d.txt: gb",
705 "List2: fr_x.txt: fr", "List2: gb_z.txt: gb",
706 "Foo: 1_a1;1_c1: 1", "Foo: 2_b1: 2"
708 CheckEngineEventCounts (testLogger, 3, 3, 18, 18);
712 public void TestTargetBatching5 ()
714 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
715 <Target Name=""foo"" Inputs=""@(List1)"" Outputs=""%(Culture).foo"">
716 <Message Text=""TargetStarted""/>
720 Engine engine = new Engine (Consts.BinPath);
721 Project project = engine.CreateNewProject ();
723 TestMessageLogger testLogger = new TestMessageLogger ();
724 engine.RegisterLogger (testLogger);
726 project.LoadXml (projectString);
727 bool res = project.Build ("foo");
729 testLogger.DumpMessages ();
730 Assert.Fail ("A1: Build failed");
732 Assert.AreEqual (1, testLogger.CheckAny ("TargetStarted", MessageImportance.Normal),
733 "A2: Target should've been skipped because of no inputs");
734 CheckEngineEventCounts (testLogger, 1, 1, 0, 0);
738 public void TestTargetBatching6 ()
740 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
742 <List1 Include=""fr_a.txt""><Culture>fr</Culture></List1>
743 <List1 Include=""en_b.txt""><Culture>en</Culture></List1>
744 <List1 Include=""fr_c.txt""><Culture>fr</Culture></List1>
745 <List1 Include=""gb_d.txt""><Culture>gb</Culture></List1>
747 <List3 Include=""fr_x.txt""><Culture>fr</Culture></List3>
748 <List3 Include=""gb_z.txt""><Culture>gb</Culture></List3>
750 <Foo Include=""1_a1""><Md>1</Md></Foo>
751 <Foo Include=""2_b1""><Md>2</Md></Foo>
752 <Foo Include=""1_c1""><Md>1</Md></Foo>
755 <Target Name=""foo"" Inputs=""@(List1);@(List2)"" Outputs=""%(Culture).foo"">
756 <Message Text=""TargetStarted"" />
757 <Message Text=""List1: %(List1.Culture), List2: %(List2.Culture)"" />
758 <Message Text=""List2: @(List2), Culture: %(Culture)"" />
759 <Message Text=""List3: @(List3), Culture: %(Culture)"" />
763 Engine engine = new Engine (Consts.BinPath);
764 Project project = engine.CreateNewProject ();
766 TestMessageLogger testLogger = new TestMessageLogger ();
767 engine.RegisterLogger (testLogger);
769 project.LoadXml (projectString);
770 bool res = project.Build ("foo");
772 testLogger.DumpMessages ();
773 Assert.Fail ("A1: Build failed");
776 CheckLoggedMessagesInOrder (testLogger, new string [] {
778 "List1: fr, List2: ",
779 "List2: , Culture: ",
780 "List3: fr_x.txt, Culture: fr",
781 "List3: gb_z.txt, Culture: gb",
784 "List1: en, List2: ",
785 "List2: , Culture: ",
786 "List3: fr_x.txt, Culture: fr",
787 "List3: gb_z.txt, Culture: gb",
790 "List1: gb, List2: ",
791 "List2: , Culture: ",
792 "List3: fr_x.txt, Culture: fr",
793 "List3: gb_z.txt, Culture: gb"
795 CheckEngineEventCounts (testLogger, 3, 3, 15, 15);
799 public void TestTargetBatching7 ()
801 string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
803 <List1 Include=""fr_a.txt""><Culture>fr</Culture></List1>
804 <List1 Include=""en_b.txt""><Culture>en</Culture></List1>
805 <List1 Include=""fr_c.txt""><Culture>fr</Culture></List1>
806 <List1 Include=""gb_d.txt""><Culture>gb</Culture></List1>
808 <List2 Include=""fr_x.txt""><Culture>fr</Culture></List2>
809 <List2 Include=""gb_z.txt""><Culture>gb</Culture></List2>
811 <Foo Include=""1_a1""><Md>1</Md></Foo>
812 <Foo Include=""2_b1""><Md>2</Md></Foo>
813 <Foo Include=""1_c1""><Md>1</Md></Foo>
816 <Target Name=""foo"" Inputs=""@(List1);@(List2)"" Outputs=""%(Culture).foo"">
817 <Message Text=""TargetStarted"" />
818 <Message Text=""List1: @(List1), List2: @(List2)""/>
822 Engine engine = new Engine (Consts.BinPath);
823 Project project = engine.CreateNewProject ();
825 TestMessageLogger testLogger = new TestMessageLogger ();
826 engine.RegisterLogger (testLogger);
828 project.LoadXml (projectString);
829 bool res = project.Build ("foo");
831 testLogger.DumpMessages ();
832 Assert.Fail ("A1: Build failed");
835 CheckLoggedMessagesInOrder (testLogger, new string [] {
837 "List1: fr_a.txt;fr_c.txt, List2: fr_x.txt",
840 "List1: en_b.txt, List2: ",
843 "List1: gb_d.txt, List2: gb_z.txt"
845 CheckEngineEventCounts (testLogger, 3, 3, 6, 6);
848 void CheckLoggedMessagesInOrder (TestMessageLogger logger, string [] values, string prefix)
851 for (int i = 0; i < values.Length; i++) {
852 logger.CheckLoggedMessageHead (values [i], prefix + "#" + i);
854 if (logger.NormalMessageCount > 0)
855 Assert.Fail ("{0}: Expected {1} messages, but found {2}",
856 prefix, values.Length, values.Length + logger.NormalMessageCount);
857 } catch (NUnit.Framework.AssertionException) {
858 logger.DumpMessages ();
863 void CheckMessage (TestMessageLogger logger, string culture, string items, string id)
865 logger.CheckLoggedMessageHead (String.Format ("Culture: {0} -- ResXFile: {1}", culture, items), id);
868 void CheckMessage2 (TestMessageLogger logger, string culture, string resx_files, string nonresx_files, string id)
870 logger.CheckLoggedMessageHead (String.Format ("Culture: {0} -- ResXFiles: {1} NonResXFiles: {2}", culture, resx_files, nonresx_files), id);
873 void CheckLoggedMessageAny (TestMessageLogger logger, string expected, string id)
875 if (logger.CheckAny (expected, MessageImportance.Normal) == 1)
876 Assert.Fail ("{0}: Expected message '{1}' was not emitted.", id, expected);
879 void CheckEngineEventCounts (TestMessageLogger logger, int target_start, int target_finish, int task_start, int task_finish)
881 Assert.AreEqual (target_start, logger.TargetStarted, "TargetStarted event count doesn't match");
882 Assert.AreEqual (target_finish, logger.TargetFinished, "TargetFinished event count doesn't match");
883 Assert.AreEqual (task_start, logger.TaskStarted, "TaskStarted event count doesn't match");
884 Assert.AreEqual (task_finish, logger.TaskFinished, "TaskFinished event count doesn't match");