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 [ExpectedException (typeof (ArgumentException))]
99 public void TestCtor6 ()
101 new BuildItem (null, String.Empty);
105 [Category ("NotDotNet")] //IndexOutOfRange throw by MS .NET 2.0
106 public void TestCtor7 ()
108 new BuildItem (String.Empty, "something");
112 public void TestClone1 ()
114 item = new BuildItem ("name", "1;2;3");
115 item.SetMetadata ("a", "b");
117 BuildItem item2 = item.Clone ();
119 Assert.AreEqual ("1;2;3", item2.FinalItemSpec, "A1");
120 Assert.AreEqual ("1;2;3", item2.Include, "A2");
121 Assert.AreEqual (String.Empty, item2.Exclude, "A3");
122 Assert.AreEqual (String.Empty, item2.Condition, "A4");
123 Assert.AreEqual (false, item2.IsImported, "A5");
124 Assert.AreEqual ("name", item2.Name, "A6");
127 // Cannot set a condition on an object not represented by an XML element in the project file.
129 [ExpectedException (typeof (InvalidOperationException))]
130 public void TestCondition1 ()
132 item = new BuildItem ("name", "1");
133 item.Condition = "true";
137 [Ignore ("weird test need to check how project.Xml looks")]
138 public void TestCondition2 ()
142 BuildItemGroup [] groups = new BuildItemGroup [1];
144 string documentString = @"
145 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
152 engine = new Engine (Consts.BinPath);
153 project = engine.CreateNewProject ();
154 project.LoadXml (documentString);
156 project.EvaluatedItems [0].Condition = "true";
157 project.ItemGroups.CopyTo (groups, 0);
158 Assert.AreEqual (String.Empty, groups [0] [0].Condition, "A1");
159 Assert.AreEqual ("true", project.EvaluatedItems [0].Condition, "A2");
163 [Ignore ("weird test need to check how project.Xml looks")]
164 public void TestCondition3 ()
168 BuildItemGroup [] groups = new BuildItemGroup [1];
170 string documentString = @"
171 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
178 engine = new Engine (Consts.BinPath);
179 project = engine.CreateNewProject ();
180 project.LoadXml (documentString);
182 project.ItemGroups.CopyTo (groups, 0);
183 groups [0] [0].Condition = "true";
184 Assert.AreEqual ("true", groups [0] [0].Condition, "A1");
185 Assert.AreEqual ("true", project.EvaluatedItems [0].Condition, "A2");
189 public void TestCopyCustomMetadataTo1 ()
191 BuildItem source, destination;
192 string itemName1 = "a";
193 string itemName2 = "b";
194 string itemInclude = "a;b;c";
195 string metadataName = "name";
196 string metadataValue = "value";
198 source = new BuildItem (itemName1, itemInclude);
199 destination = new BuildItem (itemName2, itemInclude);
201 source.SetMetadata (metadataName, metadataValue);
203 source.CopyCustomMetadataTo (destination);
205 Assert.AreEqual (metadataValue, destination.GetMetadata (metadataName), "A1");
206 Assert.AreEqual (metadataValue, destination.GetEvaluatedMetadata (metadataName), "A2");
210 [ExpectedException (typeof (ArgumentNullException))]
211 [Category ("NotDotNet")]
212 public void TestCopyCustomMetadataTo2 ()
214 BuildItem item = new BuildItem ("name", "include");
215 item.SetMetadata ("name", "value");
217 item.CopyCustomMetadataTo (null);
220 // Assigning the "Exclude" attribute of a virtual item is not allowed.
222 [ExpectedException (typeof (InvalidOperationException))]
223 public void TestExclude1 ()
225 item = new BuildItem ("name", "1");
230 public void TestExclude2 ()
234 BuildItemGroup [] groups = new BuildItemGroup [1];
236 string documentString = @"
237 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
244 engine = new Engine (Consts.BinPath);
245 project = engine.CreateNewProject ();
246 project.LoadXml (documentString);
247 project.ItemGroups.CopyTo (groups, 0);
249 Assert.AreEqual (String.Empty, groups [0] [0].Exclude, "A1");
251 groups [0] [0].Exclude = "b";
253 Assert.AreEqual ("b", groups [0] [0].Exclude, "A2");
254 Assert.AreEqual ("a;b", groups [0] [0].Include, "A3");
258 public void TestGetMetadata1 ()
260 string itemName = "a";
261 string itemInclude = "a;b;c";
262 string metadataName = "name";
263 string metadataValue = "a;b;c";
265 item = new BuildItem (itemName, itemInclude);
267 Assert.AreEqual (String.Empty, item.GetMetadata (metadataName), "A1");
269 item.SetMetadata (metadataName, metadataValue);
271 Assert.AreEqual (metadataValue, item.GetMetadata (metadataName), "A2");
272 Assert.IsTrue (item.GetMetadata ("FullPath").EndsWith (Utilities.Escape (itemInclude)), "A3");
273 //Assert.IsTrue (String.Empty != item.GetMetadata ("RootDir"), "A4");
274 Assert.AreEqual (itemInclude, item.GetMetadata ("Filename"), "A5");
275 Assert.AreEqual (String.Empty, item.GetMetadata ("Extension"), "A6");
276 Assert.AreEqual (String.Empty, item.GetMetadata ("RelativeDir"), "A7");
277 Assert.IsTrue (String.Empty != item.GetMetadata ("Directory"), "A8");
278 Assert.AreEqual (String.Empty, item.GetMetadata ("RecursiveDir"), "A9");
279 Assert.AreEqual (itemInclude, item.GetMetadata ("Identity"), "A10");
280 // FIXME: test with CreatedTime
281 Assert.AreEqual (String.Empty, item.GetMetadata ("ModifiedTime"), "A11");
282 Assert.AreEqual (String.Empty, item.GetMetadata ("ModifiedTime"), "A12");
283 Assert.AreEqual (String.Empty, item.GetMetadata ("AccessedTime"), "A13");
287 [ExpectedException (typeof (ArgumentNullException))]
288 public void TestGetMetadata2 ()
290 item = new BuildItem ("name", "spec");
291 item.GetMetadata (null);
295 public void TestGetMetadata3 ()
299 BuildItemGroup [] groups = new BuildItemGroup [1];
301 string documentString = @"
302 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
311 engine = new Engine (Consts.BinPath);
312 project = engine.CreateNewProject ();
313 project.LoadXml (documentString);
314 project.ItemGroups.CopyTo (groups, 0);
316 Assert.AreEqual ("Value", groups [0] [0].GetMetadata ("Meta"), "A1");
317 Assert.AreEqual (String.Empty, groups [0] [0].GetMetadata ("Other"), "A2");
321 public void TestGetEvaluatedMetadata1 ()
323 string itemName = "a";
324 string itemInclude = "a";
325 string metadataName = "name";
326 string metadataValue = "a;b;c";
328 item = new BuildItem (itemName, itemInclude);
330 Assert.AreEqual (String.Empty, item.GetEvaluatedMetadata (metadataName), "A1");
332 item.SetMetadata (metadataName, metadataValue);
334 Assert.AreEqual (metadataValue, item.GetEvaluatedMetadata (metadataName), "A2");
335 Assert.AreEqual (itemInclude, item.GetEvaluatedMetadata ("Identity"), "A3");
339 public void TestGetEvaluatedMetadata2 ()
343 BuildItemGroup [] groups = new BuildItemGroup [1];
345 string documentString = @"
346 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
359 engine = new Engine (Consts.BinPath);
360 project = engine.CreateNewProject ();
361 project.LoadXml (documentString);
362 project.ItemGroups.CopyTo (groups, 0);
364 Assert.AreEqual ("Value", groups [0] [0].GetEvaluatedMetadata ("Meta"), "A1");
365 Assert.AreEqual (String.Empty, groups [0] [0].GetEvaluatedMetadata ("Other"), "A2");
366 Assert.AreEqual ("A", groups [0] [0].GetEvaluatedMetadata ("Meta2"), "A3");
370 public void TestHasMetadata1 ()
372 string itemName = "a";
373 string itemInclude = "a";
374 string metadataName = "name";
376 item = new BuildItem (itemName, itemInclude);
378 Assert.AreEqual (false, item.HasMetadata (metadataName), "A1");
380 item.SetMetadata (metadataName, "value");
382 Assert.AreEqual (true, item.HasMetadata (metadataName), "A2");
383 Assert.IsTrue (item.HasMetadata ("FullPath"), "A3");
384 Assert.IsTrue (item.HasMetadata ("RootDir"), "A4");
385 Assert.IsTrue (item.HasMetadata ("Filename"), "A5");
386 Assert.IsTrue (item.HasMetadata ("Extension"), "A6");
387 Assert.IsTrue (item.HasMetadata ("RelativeDir"), "A7");
388 Assert.IsTrue (item.HasMetadata ("Directory"), "A8");
389 Assert.IsTrue (item.HasMetadata ("RecursiveDir"), "A9");
390 Assert.IsTrue (item.HasMetadata ("Identity"), "A10");
391 Assert.IsTrue (item.HasMetadata ("ModifiedTime"), "A11");
392 Assert.IsTrue (item.HasMetadata ("CreatedTime"), "A12");
393 Assert.IsTrue (item.HasMetadata ("AccessedTime"), "A13");
397 public void TestHasMetadata2 ()
401 BuildItemGroup [] groups = new BuildItemGroup [1];
403 string documentString = @"
404 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
413 engine = new Engine (Consts.BinPath);
414 project = engine.CreateNewProject ();
415 project.LoadXml (documentString);
416 project.ItemGroups.CopyTo (groups, 0);
418 BuildItem item = groups [0] [0];
420 Assert.IsFalse (item.HasMetadata ("Other"), "A1");
421 Assert.IsTrue (item.HasMetadata ("Meta"), "A2");
422 Assert.IsTrue (item.HasMetadata ("FullPath"), "A3");
423 Assert.IsTrue (item.HasMetadata ("RootDir"), "A4");
424 Assert.IsTrue (item.HasMetadata ("Filename"), "A5");
425 Assert.IsTrue (item.HasMetadata ("Extension"), "A6");
426 Assert.IsTrue (item.HasMetadata ("RelativeDir"), "A7");
427 Assert.IsTrue (item.HasMetadata ("Directory"), "A8");
428 Assert.IsTrue (item.HasMetadata ("RecursiveDir"), "A9");
429 Assert.IsTrue (item.HasMetadata ("Identity"), "A10");
430 Assert.IsTrue (item.HasMetadata ("ModifiedTime"), "A11");
431 Assert.IsTrue (item.HasMetadata ("CreatedTime"), "A12");
432 Assert.IsTrue (item.HasMetadata ("AccessedTime"), "A13");
436 [ExpectedException (typeof (ArgumentNullException))]
437 public void TestHasMetadata3 ()
439 item = new BuildItem ("name", "spec");
440 item.HasMetadata (null);
444 [ExpectedException (typeof (InvalidProjectFileException))]
445 public void TestInclude1 ()
450 string documentString = @"
451 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
458 engine = new Engine (Consts.BinPath);
459 project = engine.CreateNewProject ();
460 project.LoadXml (documentString);
464 public void TestInclude2 ()
469 string documentString = @"
470 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
477 engine = new Engine (Consts.BinPath);
478 project = engine.CreateNewProject ();
479 project.LoadXml (documentString);
481 Assert.AreEqual ("a", project.EvaluatedItems [0].Include, "A1");
485 public void TestInclude3 ()
487 BuildItem item = new BuildItem ("name", "a");
489 Assert.AreEqual ("b", item.Include, "A1");
493 public void TestName1 ()
497 BuildItemGroup [] groups = new BuildItemGroup [1];
499 string documentString = @"
500 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
507 engine = new Engine (Consts.BinPath);
508 project = engine.CreateNewProject ();
509 project.LoadXml (documentString);
511 project.EvaluatedItems [0].Name = "C";
513 Assert.AreEqual (2, project.EvaluatedItems.Count, "A1");
514 Assert.AreEqual ("C", project.EvaluatedItems [0].Name, "A2");
515 Assert.AreEqual ("A", project.EvaluatedItems [1].Name, "A3");
516 project.ItemGroups.CopyTo (groups, 0);
517 Assert.AreEqual (2, groups [0].Count, "A4");
518 Assert.AreEqual ("C", groups [0] [0].Name, "A5");
519 Assert.AreEqual ("A", groups [0] [1].Name, "A6");
523 public void TestName2 ()
525 BuildItem item = new BuildItem ("A", "V");
527 Assert.AreEqual ("B", item.Name, "A1");
531 public void TestRemoveMetadata1 ()
533 string itemName = "a";
534 string itemInclude = "a";
535 string metadataName = "name";
536 string metadataValue = "a;b;c";
538 item = new BuildItem (itemName, itemInclude);
540 item.SetMetadata (metadataName, metadataValue);
542 Assert.AreEqual (true, item.HasMetadata (metadataName), "A1");
544 item.RemoveMetadata (metadataName);
546 Assert.AreEqual (false, item.HasMetadata (metadataName), "A2");
550 [ExpectedException (typeof (ArgumentNullException))]
551 public void TestRemoveMetadata2 ()
553 item = new BuildItem ("name", "value");
554 item.RemoveMetadata (null);
558 public void TestRemoveMetadata3 ()
560 item = new BuildItem ("name", "value");
561 item.RemoveMetadata ("undefined_metadata");
564 // "Filename" is a reserved item meta-data, and cannot be modified or deleted.
566 [ExpectedException (typeof (ArgumentException))]
567 public void TestRemoveMetadata4 ()
569 item = new BuildItem ("name", "value");
570 item.RemoveMetadata ("Filename");
574 public void TestRemoveMetadata5 ()
578 BuildItemGroup [] groups = new BuildItemGroup [1];
580 string documentString = @"
581 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
592 engine = new Engine (Consts.BinPath);
593 project = engine.CreateNewProject ();
594 project.LoadXml (documentString);
595 project.ItemGroups.CopyTo (groups, 0);
597 Assert.AreEqual (3, project.EvaluatedItems.Count, "A1");
599 groups [0] [0].RemoveMetadata ("Meta");
600 Assert.IsFalse (groups [0] [0].HasMetadata ("Meta"), "A2");
601 groups [0] [0].RemoveMetadata ("undefined_metadata");
603 Assert.AreEqual (2, groups [0].Count, "A3");
604 Assert.AreEqual (3, project.EvaluatedItems.Count, "A4");
608 public void TestRemoveMetadata6 ()
612 BuildItemGroup [] groups = new BuildItemGroup [1];
614 string documentString = @"
615 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
626 engine = new Engine (Consts.BinPath);
627 project = engine.CreateNewProject ();
628 project.LoadXml (documentString);
630 Assert.AreEqual (4, project.EvaluatedItems.Count, "A1");
631 project.ItemGroups.CopyTo (groups, 0);
632 Assert.AreEqual (2, groups [0].Count, "A2");
634 BuildItem b1 = project.EvaluatedItems [0];
636 b1.RemoveMetadata ("Meta");
638 Assert.AreEqual (4, project.EvaluatedItems.Count, "A3");
639 project.ItemGroups.CopyTo (groups, 0);
640 Assert.AreEqual (4, groups [0].Count, "A4");
644 [ExpectedException (typeof (ArgumentNullException))]
645 public void TestSetMetadata1 ()
647 item = new BuildItem ("name", "include");
648 item.SetMetadata (null, null);
652 [ExpectedException (typeof (ArgumentNullException))]
653 public void TestSetMetadata2 ()
655 item = new BuildItem ("name", "include");
656 item.SetMetadata ("name", null);
660 public void TestSetMetadata3 ()
662 item = new BuildItem ("name", "include");
663 item.SetMetadata ("a", "$(A)");
664 item.SetMetadata ("b", "$(A)", true);
665 item.SetMetadata ("c", "$(A)", false);
667 Assert.AreEqual ("$(A)", item.GetEvaluatedMetadata ("a"), "A1");
668 Assert.AreEqual ("$(A)", item.GetEvaluatedMetadata ("b"), "A2");
669 Assert.AreEqual ("$(A)", item.GetEvaluatedMetadata ("c"), "A3");
670 Assert.AreEqual ("$(A)", item.GetMetadata ("a"), "A4");
671 Assert.AreEqual (Utilities.Escape ("$(A)"), item.GetMetadata ("b"), "A5");
672 Assert.AreEqual ("$(A)", item.GetMetadata ("c"), "A6");
675 // "Filename" is a reserved item meta-data, and cannot be modified or deleted.
677 [ExpectedException (typeof (ArgumentException))]
678 public void TestSetMetadata4 ()
680 item = new BuildItem ("name", "include");
681 item.SetMetadata ("Filename", "something");
685 public void TestSetMetadata5 ()
689 BuildItemGroup [] groups = new BuildItemGroup [1];
691 string documentString = @"
692 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
702 engine = new Engine (Consts.BinPath);
703 project = engine.CreateNewProject ();
704 project.LoadXml (documentString);
706 project.ItemGroups.CopyTo (groups, 0);
708 groups [0] [0].SetMetadata ("Meta", "$(A)");
709 Assert.AreEqual (2, project.EvaluatedItems.Count, "A0");
711 Assert.AreEqual (1, groups [0].Count, "A1");
712 Assert.AreEqual ("$(A)", groups [0] [0].GetMetadata ("Meta"), "A2");
713 Assert.AreEqual ("$(A)", project.EvaluatedItems [0].GetMetadata ("Meta"), "A3");
714 Assert.AreEqual ("$(A)", project.EvaluatedItems [1].GetMetadata ("Meta"), "A4");
715 Assert.AreEqual ("A", project.EvaluatedItems [0].GetEvaluatedMetadata ("Meta"), "A5");
716 Assert.AreEqual ("A", project.EvaluatedItems [1].GetEvaluatedMetadata ("Meta"), "A6");
720 public void TestSetMetadata5a () {
723 BuildItemGroup[] groups = new BuildItemGroup[1];
725 string documentString = @"
726 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
740 <Message Text=""a.md: %(A.Md)""/>
741 <Message Text=""a.md: %(A.Meta)""/>
746 engine = new Engine (Consts.BinPath);
747 project = engine.CreateNewProject ();
748 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger = new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
749 engine.RegisterLogger (logger);
750 project.LoadXml (documentString);
752 CheckMetadata (project, "A", "Md", new string [] {"@(C)", "@(C)"}, "G1");
753 CheckEvaluatedMetadata (project, "A", "Md", new string[] { "D", "D" }, "G2");
756 Assert.AreEqual ("A", project.GetEvaluatedItemsByName ("B")[0].FinalItemSpec, "B2");
758 project.ItemGroups.CopyTo (groups, 0);
760 CheckBuildItemGroup (groups[0], new string[] {
767 CheckBuildItemGroup (project.GetEvaluatedItemsByName ("C"), new string[] {
771 CheckBuildItemGroup (project.GetEvaluatedItemsByName ("C"), new string[] {
775 project.GetEvaluatedItemsByName ("A")[0].SetMetadata ("Meta", "@(B)");
777 Assert.AreEqual (5, project.EvaluatedItems.Count, "A0");
778 Assert.AreEqual (2, project.GetEvaluatedItemsByName ("A").Count, "A7");
780 CheckMetadata (project, "A", "Meta", new string[] { "@(B)", "" }, "J");
782 if (!project.Build ()) {
783 logger.DumpMessages ();
784 Assert.Fail ("Build failed");
787 CheckMetadata (project, "A", "Meta", new string[] { "@(B)", "" }, "K1");
788 CheckEvaluatedMetadata (project, "A", "Meta", new string[] { "", "" }, "K2");
790 logger.CheckLoggedMessageHead ("a.md: D", "E10");
791 logger.CheckLoggedMessageHead ("a.md: ", "E11");
792 Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected messages left");
796 public void TestSetMetadata6 ()
800 BuildItemGroup [] groups = new BuildItemGroup [1];
802 string documentString = @"
803 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
810 engine = new Engine (Consts.BinPath);
811 project = engine.CreateNewProject ();
812 project.LoadXml (documentString);
814 project.EvaluatedItems [0].SetMetadata ("Meta", "Value");
815 //NOTE: this triggers reevaluation
816 Assert.AreEqual ("A", project.EvaluatedItems [0].Name, "A0");
817 project.ItemGroups.CopyTo (groups, 0);
819 Assert.AreEqual (3, groups [0].Count, "A1");
820 Assert.AreEqual ("Value", groups [0] [0].GetMetadata ("Meta"), "A2");
821 Assert.AreEqual (String.Empty, groups [0] [1].GetMetadata ("Meta"), "A3");
822 Assert.AreEqual (String.Empty, groups [0] [2].GetMetadata ("Meta"), "A4");
823 Assert.AreEqual (3, project.EvaluatedItems.Count, "A5");
824 Assert.AreEqual ("Value", project.EvaluatedItems [0].GetMetadata ("Meta"), "A6");
825 Assert.AreEqual (String.Empty, project.EvaluatedItems [1].GetMetadata ("Meta"), "A7");
826 Assert.AreEqual (String.Empty, project.EvaluatedItems [1].GetMetadata ("Meta"), "A8");
830 public void TestSetMetadata7 ()
834 BuildItemGroup [] groups = new BuildItemGroup [1];
836 string documentString = @"
837 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
846 engine = new Engine (Consts.BinPath);
847 project = engine.CreateNewProject ();
848 project.LoadXml (documentString);
850 project.ItemGroups.CopyTo (groups, 0);
851 groups [0][0].SetMetadata ("Meta", "Value");
852 Assert.AreEqual ("Value", groups [0] [0].GetEvaluatedMetadata ("Meta"), "A1");
853 Assert.AreEqual ("Value", groups [0] [0].GetMetadata ("Meta"), "A2");
857 public void TestSetMetadata8 ()
861 BuildItemGroup [] groups = new BuildItemGroup [1];
863 string documentString = @"
864 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
871 engine = new Engine (Consts.BinPath);
872 project = engine.CreateNewProject ();
873 project.LoadXml (documentString);
875 project.EvaluatedItems [0].SetMetadata ("Meta", "Value");
877 Assert.AreEqual (1, project.EvaluatedItems.Count, "A1");
878 Assert.AreEqual ("Value", project.EvaluatedItems [0].GetMetadata ("Meta"), "A2");
879 project.ItemGroups.CopyTo (groups, 0);
880 Assert.AreEqual (1, groups [0].Count, "A3");
884 public void TestBuildItemTransform ()
886 string projectText = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
887 <UsingTask TaskName='BatchingTestTask' AssemblyFile='Test\resources\TestTasks.dll' />
894 <FooProp>PropValue/</FooProp>
897 <Target Name=""main"">
898 <CreateItem Include=""@(Foo)"">
899 <Output TaskParameter =""Include"" ItemName=""SyntheticFoo""/>
903 TaskItemsOutput=""@(SyntheticFoo->'$(FooProp)%(Identity).txt')"">
904 <Output TaskParameter='TaskItemsOutput' ItemName='I0' />
909 Engine engine = new Engine (Consts.BinPath);
910 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
911 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
912 engine.RegisterLogger (logger);
913 Project project = engine.CreateNewProject ();
914 project.LoadXml (projectText);
916 bool result = project.Build ("main");
918 logger.DumpMessages ();
919 Assert.Fail ("Build failed");
922 BuildItemGroup grp = project.GetEvaluatedItemsByName ("I0");
923 Assert.AreEqual (2, grp.Count, "A1");
924 Assert.AreEqual ("PropValue/abc.txt", grp [0].FinalItemSpec, "A2");
925 Assert.AreEqual ("PropValue/def.txt", grp [1].FinalItemSpec, "A3");
928 void CheckMetadata (Project p, string itemname, string metadataname, string[] values, string prefix)
930 BuildItemGroup group = p.GetEvaluatedItemsByName (itemname);
932 Assert.AreEqual (values.Length, group.Count, "Number of items for itemname " + itemname);
934 for (int i = 0; i < values.Length; i++) {
935 Assert.AreEqual (values[i], group [i].GetMetadata (metadataname), prefix + "#" + i.ToString ());
939 void CheckEvaluatedMetadata (Project p, string itemname, string metadataname, string[] values, string prefix)
941 BuildItemGroup group = p.GetEvaluatedItemsByName (itemname);
943 Assert.AreEqual (values.Length, group.Count, "Number of items for itemname " + itemname);
945 for (int i = 0; i < values.Length; i++) {
946 Assert.AreEqual (values[i], group [i].GetEvaluatedMetadata (metadataname), prefix + "#" + i.ToString ());
950 void CheckBuildItemGroup (BuildItemGroup group, string[] names, string prefix)
953 Assert.AreEqual (group.Count, names.Length / 2, "Number of items in group");
954 for (int i = 0; i < group.Count; i++) {
955 Assert.AreEqual (names[i * 2], group[i].Name, String.Format ("{0}#{1} : item name", prefix, i));
956 Assert.AreEqual (names[(i * 2) + 1], group[i].FinalItemSpec, String.Format ("{0}#{1} : FinalItemSpec", prefix, i));
958 } catch (AssertionException) {
959 for (int i = 0; i < group.Count; i++) {
960 Console.WriteLine ("group[{0}] = {1}", i, group[i].Name);
961 Console.WriteLine ("group[{0}] = {1}", i, group[i].FinalItemSpec);