5 // Marek Sieradzki (marek.sieradzki@gmail.com)
7 // (C) 2005 Marek Sieradzki
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 Microsoft.Build.BuildEngine;
30 using Microsoft.Build.Framework;
31 using Microsoft.Build.Utilities;
32 using NUnit.Framework;
34 namespace MonoTests.Microsoft.Build.BuildEngine {
36 public class BuildItemTest {
41 public void TestCtor1 ()
43 string itemName = "itemName";
44 string itemInclude = "a;b;c";
46 item = new BuildItem (itemName, itemInclude);
48 Assert.AreEqual (itemInclude, item.FinalItemSpec, "A1");
49 Assert.AreEqual (itemInclude, item.Include, "A2");
50 Assert.AreEqual (String.Empty, item.Exclude, "A3");
51 Assert.AreEqual (String.Empty, item.Condition, "A4");
52 Assert.AreEqual (false, item.IsImported, "A5");
53 Assert.AreEqual (itemName, item.Name, "A6");
57 public void TestCtor2 ()
59 string itemName = "itemName";
60 string itemSpec = "a;b;c";
61 // result of Utilities.Escape (itemSpec)
62 string escapedInclude = "a%3bb%3bc";
63 ITaskItem taskItem = new TaskItem (itemSpec);
65 item = new BuildItem (itemName, taskItem);
67 Assert.AreEqual (itemSpec, item.FinalItemSpec, "A1");
68 Assert.AreEqual (escapedInclude, item.Include, "A2");
69 Assert.AreEqual (String.Empty, item.Exclude, "A3");
70 Assert.AreEqual (String.Empty, item.Condition, "A4");
71 Assert.AreEqual (false, item.IsImported, "A5");
72 Assert.AreEqual (itemName, item.Name, "A6");
76 [ExpectedException (typeof (ArgumentNullException))]
77 public void TestCtor3 ()
79 new BuildItem (null, (string) null);
83 [ExpectedException (typeof (ArgumentNullException))]
84 [Category ("NotDotNet")]
85 public void TestCtor4 ()
87 new BuildItem (null, (ITaskItem) null);
91 public void TestCtor5 ()
93 new BuildItem (null, "something");
96 // Parameter "itemInclude" cannot have zero length.
98 [Category ("NotDotNet")]
99 [ExpectedException (typeof (ArgumentException))]
100 public void TestCtor6 ()
102 new BuildItem (null, String.Empty);
106 [Category ("NotDotNet")] //IndexOutOfRange throw by MS .NET 2.0
107 public void TestCtor7 ()
109 new BuildItem (String.Empty, "something");
113 public void TestClone1 ()
115 item = new BuildItem ("name", "1;2;3");
116 item.SetMetadata ("a", "b");
118 BuildItem item2 = item.Clone ();
120 Assert.AreEqual ("1;2;3", item2.FinalItemSpec, "A1");
121 Assert.AreEqual ("1;2;3", item2.Include, "A2");
122 Assert.AreEqual (String.Empty, item2.Exclude, "A3");
123 Assert.AreEqual (String.Empty, item2.Condition, "A4");
124 Assert.AreEqual (false, item2.IsImported, "A5");
125 Assert.AreEqual ("name", item2.Name, "A6");
128 // Cannot set a condition on an object not represented by an XML element in the project file.
130 [ExpectedException (typeof (InvalidOperationException))]
131 public void TestCondition1 ()
133 item = new BuildItem ("name", "1");
134 item.Condition = "true";
138 [Ignore ("weird test need to check how project.Xml looks")]
139 public void TestCondition2 ()
143 BuildItemGroup [] groups = new BuildItemGroup [1];
145 string documentString = @"
146 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
153 engine = new Engine (Consts.BinPath);
154 project = engine.CreateNewProject ();
155 project.LoadXml (documentString);
157 project.EvaluatedItems [0].Condition = "true";
158 project.ItemGroups.CopyTo (groups, 0);
159 Assert.AreEqual (String.Empty, groups [0] [0].Condition, "A1");
160 Assert.AreEqual ("true", project.EvaluatedItems [0].Condition, "A2");
164 [Ignore ("weird test need to check how project.Xml looks")]
165 public void TestCondition3 ()
169 BuildItemGroup [] groups = new BuildItemGroup [1];
171 string documentString = @"
172 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
179 engine = new Engine (Consts.BinPath);
180 project = engine.CreateNewProject ();
181 project.LoadXml (documentString);
183 project.ItemGroups.CopyTo (groups, 0);
184 groups [0] [0].Condition = "true";
185 Assert.AreEqual ("true", groups [0] [0].Condition, "A1");
186 Assert.AreEqual ("true", project.EvaluatedItems [0].Condition, "A2");
190 public void TestCopyCustomMetadataTo1 ()
192 BuildItem source, destination;
193 string itemName1 = "a";
194 string itemName2 = "b";
195 string itemInclude = "a;b;c";
196 string metadataName = "name";
197 string metadataValue = "value";
199 source = new BuildItem (itemName1, itemInclude);
200 destination = new BuildItem (itemName2, itemInclude);
202 source.SetMetadata (metadataName, metadataValue);
204 source.CopyCustomMetadataTo (destination);
206 Assert.AreEqual (metadataValue, destination.GetMetadata (metadataName), "A1");
207 Assert.AreEqual (metadataValue, destination.GetEvaluatedMetadata (metadataName), "A2");
211 [ExpectedException (typeof (ArgumentNullException))]
212 [Category ("NotDotNet")]
213 public void TestCopyCustomMetadataTo2 ()
215 BuildItem item = new BuildItem ("name", "include");
216 item.SetMetadata ("name", "value");
218 item.CopyCustomMetadataTo (null);
221 // Assigning the "Exclude" attribute of a virtual item is not allowed.
223 [ExpectedException (typeof (InvalidOperationException))]
224 public void TestExclude1 ()
226 item = new BuildItem ("name", "1");
231 public void TestExclude2 ()
235 BuildItemGroup [] groups = new BuildItemGroup [1];
237 string documentString = @"
238 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
245 engine = new Engine (Consts.BinPath);
246 project = engine.CreateNewProject ();
247 project.LoadXml (documentString);
248 project.ItemGroups.CopyTo (groups, 0);
250 Assert.AreEqual (String.Empty, groups [0] [0].Exclude, "A1");
252 groups [0] [0].Exclude = "b";
254 Assert.AreEqual ("b", groups [0] [0].Exclude, "A2");
255 Assert.AreEqual ("a;b", groups [0] [0].Include, "A3");
259 public void TestGetMetadata1 ()
261 string itemName = "a";
262 string itemInclude = "a;b;c";
263 string metadataName = "name";
264 string metadataValue = "a;b;c";
266 item = new BuildItem (itemName, itemInclude);
268 Assert.AreEqual (String.Empty, item.GetMetadata (metadataName), "A1");
270 item.SetMetadata (metadataName, metadataValue);
272 Assert.AreEqual (metadataValue, item.GetMetadata (metadataName), "A2");
273 Assert.IsTrue (item.GetMetadata ("FullPath").EndsWith (Utilities.Escape (itemInclude)), "A3");
274 //Assert.IsTrue (String.Empty != item.GetMetadata ("RootDir"), "A4");
275 Assert.AreEqual (itemInclude, item.GetMetadata ("Filename"), "A5");
276 Assert.AreEqual (String.Empty, item.GetMetadata ("Extension"), "A6");
277 Assert.AreEqual (String.Empty, item.GetMetadata ("RelativeDir"), "A7");
278 Assert.IsTrue (String.Empty != item.GetMetadata ("Directory"), "A8");
279 Assert.AreEqual (String.Empty, item.GetMetadata ("RecursiveDir"), "A9");
280 Assert.AreEqual (itemInclude, item.GetMetadata ("Identity"), "A10");
281 // FIXME: test with CreatedTime
282 Assert.AreEqual (String.Empty, item.GetMetadata ("ModifiedTime"), "A11");
283 Assert.AreEqual (String.Empty, item.GetMetadata ("ModifiedTime"), "A12");
284 Assert.AreEqual (String.Empty, item.GetMetadata ("AccessedTime"), "A13");
288 public void GetMetadata_UnescapedItemSpec ()
290 string itemInclude = "a;b;c";
291 string escapedItemInclude = Utilities.Escape (itemInclude);
293 item = new BuildItem ("name", itemInclude);
294 Assert.IsTrue (item.GetMetadata ("FullPath").EndsWith (escapedItemInclude), "#1a");
295 Assert.IsTrue (item.GetEvaluatedMetadata ("FullPath").EndsWith (itemInclude), "#1b");
297 Assert.AreEqual (itemInclude, item.GetMetadata ("FileName"), "#2b");
298 Assert.AreEqual (itemInclude, item.GetEvaluatedMetadata ("FileName"), "#2b");
300 Assert.AreEqual (itemInclude, item.GetMetadata ("Identity"), "#3a");
301 Assert.AreEqual (itemInclude, item.GetEvaluatedMetadata ("Identity"), "#3b");
305 public void GetMetadata_EscapedItemSpec ()
307 string itemInclude = "a;b;c";
308 string escapedItemInclude = Utilities.Escape (itemInclude);
310 item = new BuildItem ("name", escapedItemInclude);
311 Assert.IsTrue (item.GetMetadata ("FullPath").EndsWith (escapedItemInclude), "#1a");
312 Assert.IsTrue (item.GetEvaluatedMetadata ("FullPath").EndsWith (itemInclude), "#1b");
314 Assert.AreEqual (escapedItemInclude, item.GetMetadata ("FileName"), "#2b");
315 Assert.AreEqual (itemInclude, item.GetEvaluatedMetadata ("FileName"), "#2b");
317 Assert.AreEqual (escapedItemInclude, item.GetMetadata ("Identity"), "#3a");
318 Assert.AreEqual ("a;b;c", item.GetEvaluatedMetadata ("Identity"), "#3b");
322 [ExpectedException (typeof (ArgumentNullException))]
323 public void TestGetMetadata2 ()
325 item = new BuildItem ("name", "spec");
326 item.GetMetadata (null);
330 public void TestGetMetadata3 ()
334 BuildItemGroup [] groups = new BuildItemGroup [1];
336 string documentString = @"
337 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
346 engine = new Engine (Consts.BinPath);
347 project = engine.CreateNewProject ();
348 project.LoadXml (documentString);
349 project.ItemGroups.CopyTo (groups, 0);
351 Assert.AreEqual ("Value", groups [0] [0].GetMetadata ("Meta"), "A1");
352 Assert.AreEqual (String.Empty, groups [0] [0].GetMetadata ("Other"), "A2");
356 public void TestGetEvaluatedMetadata1 ()
358 string itemName = "a";
359 string itemInclude = "a";
360 string metadataName = "name";
361 string metadataValue = "a;b;c";
363 item = new BuildItem (itemName, itemInclude);
365 Assert.AreEqual (String.Empty, item.GetEvaluatedMetadata (metadataName), "A1");
367 item.SetMetadata (metadataName, metadataValue);
369 Assert.AreEqual (metadataValue, item.GetEvaluatedMetadata (metadataName), "A2");
370 Assert.AreEqual (itemInclude, item.GetEvaluatedMetadata ("Identity"), "A3");
374 public void TestGetEvaluatedMetadata2 ()
378 BuildItemGroup [] groups = new BuildItemGroup [1];
380 string documentString = @"
381 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
394 engine = new Engine (Consts.BinPath);
395 project = engine.CreateNewProject ();
396 project.LoadXml (documentString);
397 project.ItemGroups.CopyTo (groups, 0);
399 Assert.AreEqual ("Value", groups [0] [0].GetEvaluatedMetadata ("Meta"), "A1");
400 Assert.AreEqual (String.Empty, groups [0] [0].GetEvaluatedMetadata ("Other"), "A2");
401 Assert.AreEqual ("A", groups [0] [0].GetEvaluatedMetadata ("Meta2"), "A3");
405 public void TestHasMetadata1 ()
407 string itemName = "a";
408 string itemInclude = "a";
409 string metadataName = "name";
411 item = new BuildItem (itemName, itemInclude);
413 Assert.AreEqual (false, item.HasMetadata (metadataName), "A1");
415 item.SetMetadata (metadataName, "value");
417 Assert.AreEqual (true, item.HasMetadata (metadataName), "A2");
418 Assert.IsTrue (item.HasMetadata ("FullPath"), "A3");
419 Assert.IsTrue (item.HasMetadata ("RootDir"), "A4");
420 Assert.IsTrue (item.HasMetadata ("Filename"), "A5");
421 Assert.IsTrue (item.HasMetadata ("Extension"), "A6");
422 Assert.IsTrue (item.HasMetadata ("RelativeDir"), "A7");
423 Assert.IsTrue (item.HasMetadata ("Directory"), "A8");
424 Assert.IsTrue (item.HasMetadata ("RecursiveDir"), "A9");
425 Assert.IsTrue (item.HasMetadata ("Identity"), "A10");
426 Assert.IsTrue (item.HasMetadata ("ModifiedTime"), "A11");
427 Assert.IsTrue (item.HasMetadata ("CreatedTime"), "A12");
428 Assert.IsTrue (item.HasMetadata ("AccessedTime"), "A13");
432 public void TestHasMetadata2 ()
436 BuildItemGroup [] groups = new BuildItemGroup [1];
438 string documentString = @"
439 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
448 engine = new Engine (Consts.BinPath);
449 project = engine.CreateNewProject ();
450 project.LoadXml (documentString);
451 project.ItemGroups.CopyTo (groups, 0);
453 BuildItem item = groups [0] [0];
455 Assert.IsFalse (item.HasMetadata ("Other"), "A1");
456 Assert.IsTrue (item.HasMetadata ("Meta"), "A2");
457 Assert.IsTrue (item.HasMetadata ("FullPath"), "A3");
458 Assert.IsTrue (item.HasMetadata ("RootDir"), "A4");
459 Assert.IsTrue (item.HasMetadata ("Filename"), "A5");
460 Assert.IsTrue (item.HasMetadata ("Extension"), "A6");
461 Assert.IsTrue (item.HasMetadata ("RelativeDir"), "A7");
462 Assert.IsTrue (item.HasMetadata ("Directory"), "A8");
463 Assert.IsTrue (item.HasMetadata ("RecursiveDir"), "A9");
464 Assert.IsTrue (item.HasMetadata ("Identity"), "A10");
465 Assert.IsTrue (item.HasMetadata ("ModifiedTime"), "A11");
466 Assert.IsTrue (item.HasMetadata ("CreatedTime"), "A12");
467 Assert.IsTrue (item.HasMetadata ("AccessedTime"), "A13");
471 [ExpectedException (typeof (ArgumentNullException))]
472 public void TestHasMetadata3 ()
474 item = new BuildItem ("name", "spec");
475 item.HasMetadata (null);
479 [ExpectedException (typeof (InvalidProjectFileException))]
480 public void TestInclude1 ()
485 string documentString = @"
486 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
493 engine = new Engine (Consts.BinPath);
494 project = engine.CreateNewProject ();
495 project.LoadXml (documentString);
499 public void TestInclude2 ()
504 string documentString = @"
505 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
512 engine = new Engine (Consts.BinPath);
513 project = engine.CreateNewProject ();
514 project.LoadXml (documentString);
516 Assert.AreEqual ("a", project.EvaluatedItems [0].Include, "A1");
520 public void TestInclude3 ()
522 BuildItem item = new BuildItem ("name", "a");
524 Assert.AreEqual ("b", item.Include, "A1");
528 public void TestName1 ()
532 BuildItemGroup [] groups = new BuildItemGroup [1];
534 string documentString = @"
535 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
542 engine = new Engine (Consts.BinPath);
543 project = engine.CreateNewProject ();
544 project.LoadXml (documentString);
546 project.EvaluatedItems [0].Name = "C";
548 Assert.AreEqual (2, project.EvaluatedItems.Count, "A1");
549 Assert.AreEqual ("C", project.EvaluatedItems [0].Name, "A2");
550 Assert.AreEqual ("A", project.EvaluatedItems [1].Name, "A3");
551 project.ItemGroups.CopyTo (groups, 0);
552 Assert.AreEqual (2, groups [0].Count, "A4");
553 Assert.AreEqual ("C", groups [0] [0].Name, "A5");
554 Assert.AreEqual ("A", groups [0] [1].Name, "A6");
558 public void TestName2 ()
560 BuildItem item = new BuildItem ("A", "V");
562 Assert.AreEqual ("B", item.Name, "A1");
566 public void TestRemoveMetadata1 ()
568 string itemName = "a";
569 string itemInclude = "a";
570 string metadataName = "name";
571 string metadataValue = "a;b;c";
573 item = new BuildItem (itemName, itemInclude);
575 item.SetMetadata (metadataName, metadataValue);
577 Assert.AreEqual (true, item.HasMetadata (metadataName), "A1");
579 item.RemoveMetadata (metadataName);
581 Assert.AreEqual (false, item.HasMetadata (metadataName), "A2");
585 [ExpectedException (typeof (ArgumentNullException))]
586 public void TestRemoveMetadata2 ()
588 item = new BuildItem ("name", "value");
589 item.RemoveMetadata (null);
593 public void TestRemoveMetadata3 ()
595 item = new BuildItem ("name", "value");
596 item.RemoveMetadata ("undefined_metadata");
599 // "Filename" is a reserved item meta-data, and cannot be modified or deleted.
601 [ExpectedException (typeof (ArgumentException))]
602 public void TestRemoveMetadata4 ()
604 item = new BuildItem ("name", "value");
605 item.RemoveMetadata ("Filename");
609 public void TestRemoveMetadata5 ()
613 BuildItemGroup [] groups = new BuildItemGroup [1];
615 string documentString = @"
616 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
627 engine = new Engine (Consts.BinPath);
628 project = engine.CreateNewProject ();
629 project.LoadXml (documentString);
630 project.ItemGroups.CopyTo (groups, 0);
632 Assert.AreEqual (3, project.EvaluatedItems.Count, "A1");
634 groups [0] [0].RemoveMetadata ("Meta");
635 Assert.IsFalse (groups [0] [0].HasMetadata ("Meta"), "A2");
636 groups [0] [0].RemoveMetadata ("undefined_metadata");
638 Assert.AreEqual (2, groups [0].Count, "A3");
639 Assert.AreEqual (3, project.EvaluatedItems.Count, "A4");
643 public void TestRemoveMetadata6 ()
647 BuildItemGroup [] groups = new BuildItemGroup [1];
649 string documentString = @"
650 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
661 engine = new Engine (Consts.BinPath);
662 project = engine.CreateNewProject ();
663 project.LoadXml (documentString);
665 Assert.AreEqual (4, project.EvaluatedItems.Count, "A1");
666 project.ItemGroups.CopyTo (groups, 0);
667 Assert.AreEqual (2, groups [0].Count, "A2");
669 BuildItem b1 = project.EvaluatedItems [0];
671 b1.RemoveMetadata ("Meta");
673 Assert.AreEqual (4, project.EvaluatedItems.Count, "A3");
674 project.ItemGroups.CopyTo (groups, 0);
675 Assert.AreEqual (4, groups [0].Count, "A4");
679 [ExpectedException (typeof (ArgumentNullException))]
680 public void TestSetMetadata1 ()
682 item = new BuildItem ("name", "include");
683 item.SetMetadata (null, null);
687 [ExpectedException (typeof (ArgumentNullException))]
688 public void TestSetMetadata2 ()
690 item = new BuildItem ("name", "include");
691 item.SetMetadata ("name", null);
695 public void TestSetMetadata3 ()
697 item = new BuildItem ("name", "include");
698 item.SetMetadata ("a", "$(A)");
699 item.SetMetadata ("b", "$(A)", true);
700 item.SetMetadata ("c", "$(A)", false);
702 Assert.AreEqual ("$(A)", item.GetEvaluatedMetadata ("a"), "A1");
703 Assert.AreEqual ("$(A)", item.GetEvaluatedMetadata ("b"), "A2");
704 Assert.AreEqual ("$(A)", item.GetEvaluatedMetadata ("c"), "A3");
705 Assert.AreEqual ("$(A)", item.GetMetadata ("a"), "A4");
706 Assert.AreEqual (Utilities.Escape ("$(A)"), item.GetMetadata ("b"), "A5");
707 Assert.AreEqual ("$(A)", item.GetMetadata ("c"), "A6");
710 // "Filename" is a reserved item meta-data, and cannot be modified or deleted.
712 [ExpectedException (typeof (ArgumentException))]
713 public void TestSetMetadata4 ()
715 item = new BuildItem ("name", "include");
716 item.SetMetadata ("Filename", "something");
720 public void TestSetMetadata5 ()
724 BuildItemGroup [] groups = new BuildItemGroup [1];
726 string documentString = @"
727 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
737 engine = new Engine (Consts.BinPath);
738 project = engine.CreateNewProject ();
739 project.LoadXml (documentString);
741 project.ItemGroups.CopyTo (groups, 0);
743 groups [0] [0].SetMetadata ("Meta", "$(A)");
744 Assert.AreEqual (2, project.EvaluatedItems.Count, "A0");
746 Assert.AreEqual (1, groups [0].Count, "A1");
747 Assert.AreEqual ("$(A)", groups [0] [0].GetMetadata ("Meta"), "A2");
748 Assert.AreEqual ("$(A)", project.EvaluatedItems [0].GetMetadata ("Meta"), "A3");
749 Assert.AreEqual ("$(A)", project.EvaluatedItems [1].GetMetadata ("Meta"), "A4");
750 Assert.AreEqual ("A", project.EvaluatedItems [0].GetEvaluatedMetadata ("Meta"), "A5");
751 Assert.AreEqual ("A", project.EvaluatedItems [1].GetEvaluatedMetadata ("Meta"), "A6");
755 public void TestSetMetadata5a () {
758 BuildItemGroup[] groups = new BuildItemGroup[1];
760 string documentString = @"
761 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
775 <Message Text=""a.md: %(A.Md)""/>
776 <Message Text=""a.md: %(A.Meta)""/>
781 engine = new Engine (Consts.BinPath);
782 project = engine.CreateNewProject ();
783 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger = new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
784 engine.RegisterLogger (logger);
785 project.LoadXml (documentString);
787 CheckMetadata (project, "A", "Md", new string [] {"@(C)", "@(C)"}, "G1");
788 CheckEvaluatedMetadata (project, "A", "Md", new string[] { "D", "D" }, "G2");
791 Assert.AreEqual ("A", project.GetEvaluatedItemsByName ("B")[0].FinalItemSpec, "B2");
793 project.ItemGroups.CopyTo (groups, 0);
795 CheckBuildItemGroup (groups[0], new string[] {
802 CheckBuildItemGroup (project.GetEvaluatedItemsByName ("C"), new string[] {
806 CheckBuildItemGroup (project.GetEvaluatedItemsByName ("C"), new string[] {
810 project.GetEvaluatedItemsByName ("A")[0].SetMetadata ("Meta", "@(B)");
812 Assert.AreEqual (5, project.EvaluatedItems.Count, "A0");
813 Assert.AreEqual (2, project.GetEvaluatedItemsByName ("A").Count, "A7");
815 CheckMetadata (project, "A", "Meta", new string[] { "@(B)", "" }, "J");
817 if (!project.Build ()) {
818 logger.DumpMessages ();
819 Assert.Fail ("Build failed");
822 CheckMetadata (project, "A", "Meta", new string[] { "@(B)", "" }, "K1");
823 CheckEvaluatedMetadata (project, "A", "Meta", new string[] { "", "" }, "K2");
825 logger.CheckLoggedMessageHead ("a.md: D", "E10");
826 logger.CheckLoggedMessageHead ("a.md: ", "E11");
827 Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected messages left");
831 public void TestSetMetadata6 ()
835 BuildItemGroup [] groups = new BuildItemGroup [1];
837 string documentString = @"
838 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
845 engine = new Engine (Consts.BinPath);
846 project = engine.CreateNewProject ();
847 project.LoadXml (documentString);
849 project.EvaluatedItems [0].SetMetadata ("Meta", "Value");
850 //NOTE: this triggers reevaluation
851 Assert.AreEqual ("A", project.EvaluatedItems [0].Name, "A0");
852 project.ItemGroups.CopyTo (groups, 0);
854 Assert.AreEqual (3, groups [0].Count, "A1");
855 Assert.AreEqual ("Value", groups [0] [0].GetMetadata ("Meta"), "A2");
856 Assert.AreEqual (String.Empty, groups [0] [1].GetMetadata ("Meta"), "A3");
857 Assert.AreEqual (String.Empty, groups [0] [2].GetMetadata ("Meta"), "A4");
858 Assert.AreEqual (3, project.EvaluatedItems.Count, "A5");
859 Assert.AreEqual ("Value", project.EvaluatedItems [0].GetMetadata ("Meta"), "A6");
860 Assert.AreEqual (String.Empty, project.EvaluatedItems [1].GetMetadata ("Meta"), "A7");
861 Assert.AreEqual (String.Empty, project.EvaluatedItems [1].GetMetadata ("Meta"), "A8");
865 public void TestSetMetadata7 ()
869 BuildItemGroup [] groups = new BuildItemGroup [1];
871 string documentString = @"
872 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
881 engine = new Engine (Consts.BinPath);
882 project = engine.CreateNewProject ();
883 project.LoadXml (documentString);
885 project.ItemGroups.CopyTo (groups, 0);
886 groups [0][0].SetMetadata ("Meta", "Value");
887 Assert.AreEqual ("Value", groups [0] [0].GetEvaluatedMetadata ("Meta"), "A1");
888 Assert.AreEqual ("Value", groups [0] [0].GetMetadata ("Meta"), "A2");
892 public void TestSetMetadata8 ()
896 BuildItemGroup [] groups = new BuildItemGroup [1];
898 string documentString = @"
899 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
906 engine = new Engine (Consts.BinPath);
907 project = engine.CreateNewProject ();
908 project.LoadXml (documentString);
910 project.EvaluatedItems [0].SetMetadata ("Meta", "Value");
912 Assert.AreEqual (1, project.EvaluatedItems.Count, "A1");
913 Assert.AreEqual ("Value", project.EvaluatedItems [0].GetMetadata ("Meta"), "A2");
914 project.ItemGroups.CopyTo (groups, 0);
915 Assert.AreEqual (1, groups [0].Count, "A3");
919 public void TestBuildItemTransform ()
921 string projectText = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
922 <UsingTask TaskName='BatchingTestTask' AssemblyFile='Test\resources\TestTasks.dll' />
929 <FooProp>PropValue/</FooProp>
932 <Target Name=""main"">
933 <CreateItem Include=""@(Foo)"">
934 <Output TaskParameter =""Include"" ItemName=""SyntheticFoo""/>
938 TaskItemsOutput=""@(SyntheticFoo->'$(FooProp)%(Identity).txt')"">
939 <Output TaskParameter='TaskItemsOutput' ItemName='I0' />
944 Engine engine = new Engine (Consts.BinPath);
945 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
946 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
947 engine.RegisterLogger (logger);
948 Project project = engine.CreateNewProject ();
949 project.LoadXml (projectText);
951 bool result = project.Build ("main");
953 logger.DumpMessages ();
954 Assert.Fail ("Build failed");
957 BuildItemGroup grp = project.GetEvaluatedItemsByName ("I0");
958 Assert.AreEqual (2, grp.Count, "A1");
959 Assert.AreEqual ("PropValue/abc.txt", grp [0].FinalItemSpec, "A2");
960 Assert.AreEqual ("PropValue/def.txt", grp [1].FinalItemSpec, "A3");
963 void CheckMetadata (Project p, string itemname, string metadataname, string[] values, string prefix)
965 BuildItemGroup group = p.GetEvaluatedItemsByName (itemname);
967 Assert.AreEqual (values.Length, group.Count, "Number of items for itemname " + itemname);
969 for (int i = 0; i < values.Length; i++) {
970 Assert.AreEqual (values[i], group [i].GetMetadata (metadataname), prefix + "#" + i.ToString ());
974 void CheckEvaluatedMetadata (Project p, string itemname, string metadataname, string[] values, string prefix)
976 BuildItemGroup group = p.GetEvaluatedItemsByName (itemname);
978 Assert.AreEqual (values.Length, group.Count, "Number of items for itemname " + itemname);
980 for (int i = 0; i < values.Length; i++) {
981 Assert.AreEqual (values[i], group [i].GetEvaluatedMetadata (metadataname), prefix + "#" + i.ToString ());
985 void CheckBuildItemGroup (BuildItemGroup group, string[] names, string prefix)
988 Assert.AreEqual (group.Count, names.Length / 2, "Number of items in group");
989 for (int i = 0; i < group.Count; i++) {
990 Assert.AreEqual (names[i * 2], group[i].Name, String.Format ("{0}#{1} : item name", prefix, i));
991 Assert.AreEqual (names[(i * 2) + 1], group[i].FinalItemSpec, String.Format ("{0}#{1} : FinalItemSpec", prefix, i));
993 } catch (AssertionException) {
994 for (int i = 0; i < group.Count; i++) {
995 Console.WriteLine ("group[{0}] = {1}", i, group[i].Name);
996 Console.WriteLine ("group[{0}] = {1}", i, group[i].FinalItemSpec);