5 // Marek Sieradzki (marek.sieradzki@gmail.com)
6 // Ankit Jain (jankit@novell.com)
8 // (C) 2006 Marek Sieradzki
9 // Copyright 2009 Novell, Inc (http://www.novell.com)
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.
33 using Microsoft.Build.BuildEngine;
34 using NUnit.Framework;
36 using Microsoft.Build.Framework;
38 namespace MonoTests.Microsoft.Build.BuildEngine.Various {
41 private string GetItems (Project proj, string name)
43 BuildItemGroup big = proj.GetEvaluatedItemsByName (name);
44 string str = String.Empty;
48 foreach (BuildItem bi in big) {
49 if (str == String.Empty)
50 str = bi.FinalItemSpec;
52 str += ";" + bi.FinalItemSpec;
58 private void CheckItems (Project proj, string name, string prefix, params string [] values)
60 BuildItemGroup big = proj.GetEvaluatedItemsByName (name);
62 Assert.Fail ("{0}: Item corresponding '{1}' not found.", prefix, name);
66 if (values.Length != big.Count) {
67 Console.Write ("Expected> ");
68 foreach (string s in values)
69 Console.Write ("{0}|", s);
71 Console.Write ("Actual> ");
72 foreach (BuildItem item in big)
73 Console.Write ("{0}|", item.FinalItemSpec);
75 Assert.AreEqual (values.Length, big.Count, String.Format ("{0}: Number of items", prefix));
77 for (int i = 0; i < values.Length; i ++)
78 Assert.AreEqual (values [i], big [i].FinalItemSpec,
79 String.Format ("{0}: Item named {1}, numbered {2}", prefix, name, i));
83 public void TestItems1 ()
85 Engine engine = new Engine (Consts.BinPath);
86 Project proj = engine.CreateNewProject ();
88 string documentString = @"
89 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
92 <Item1 Include='A;B;C' />
93 <Item2 Include='@(Item1);A;D' />
94 <Item3 Include='@(Item2)' Exclude='A' />
95 <Item4 Include='@(Item1);Q' Exclude='@(Item2)' />
96 <Item5 Include='@(Item1)' Exclude='@(Item2)' />
97 <Item6 Include='@(Item2)' Exclude='@(Item1)' />
98 <Item7 Include='@(item_that_doesnt_exist)' />
103 proj.LoadXml (documentString);
104 CheckItems (proj, "Item0", "A1", "A");
105 CheckItems (proj, "Item1", "A2", "A", "B", "C");
106 CheckItems (proj, "Item2", "A3", "A", "B", "C", "A", "D");
107 CheckItems (proj, "Item3", "A4", "B", "C", "D");
108 CheckItems (proj, "Item4", "A5", "Q");
109 CheckItems (proj, "Item5", "A6");
110 CheckItems (proj, "Item6", "A7", "D");
111 CheckItems (proj, "Item7", "A8");
115 public void TestItems2 ()
117 Engine engine = new Engine (Consts.BinPath);
118 Project proj = engine.CreateNewProject ();
120 string documentString = @"
121 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
123 <Item1 Include='A;B;C' />
124 <Item2 Include=""@(Item1,'-')"" />
125 <Item3 Include=""@(Item1,'xx')"" />
130 proj.LoadXml (documentString);
132 CheckItems (proj, "Item2", "A1", "A-B-C");
133 CheckItems (proj, "Item3", "A2", "AxxBxxC");
137 // item with 1. item ref with a separator and 2. another item ref
138 public void TestItems2a () {
139 Engine engine = new Engine (Consts.BinPath);
140 Project proj = engine.CreateNewProject ();
142 string documentString = @"
143 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
146 <Item1 Include='A;B;C' />
147 <Item2 Include=""@(Item1,'-');@(Item0)"" />
148 <Item3 Include=""@(Item1,'xx')"" />
153 proj.LoadXml (documentString);
155 CheckItems (proj, "Item2", "A1", "A-B-C", "D");
156 CheckItems (proj, "Item3", "A2", "AxxBxxC");
160 public void TestInheritedMetadataFromItemRefs () {
161 Engine engine = new Engine (Consts.BinPath);
162 Project proj = engine.CreateNewProject ();
163 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
164 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
165 engine.RegisterLogger (logger);
167 string documentString = @"
168 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
173 <Item1 Include='A;@(Item0)' >
176 <Item2 Include=""@(Item1,'-')"" />
177 <Item3 Include=""@(Item1);Z"" />
180 <Target Name=""Main"">
181 <Message Text=""Item2: %(Item2.Identity) MD0: %(Item2.MD0) MD1: %(Item2.MD1)""/>
182 <Message Text=""Item3: %(Item3.Identity) MD0: %(Item3.MD0) MD1: %(Item3.MD1)""/>
187 proj.LoadXml (documentString);
189 CheckItems (proj, "Item2", "A1", "A-D");
190 CheckItems (proj, "Item3", "A2", "A", "D", "Z");
192 if (!proj.Build ("Main")) {
193 logger.DumpMessages ();
194 Assert.Fail ("Build failed");
197 logger.CheckLoggedMessageHead ("Item2: A-D MD0: MD1: ", "A4");
199 logger.CheckLoggedMessageHead ("Item3: A MD0: MD1: Val1", "A5");
200 logger.CheckLoggedMessageHead ("Item3: D MD0: Val0 MD1: Val1", "A6");
201 logger.CheckLoggedMessageHead ("Item3: Z MD0: MD1: ", "A7");
203 Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected extra messages found");
207 public void TestInheritedMetadataFromItemRefs2 () {
208 Engine engine = new Engine (Consts.BinPath);
209 Project proj = engine.CreateNewProject ();
210 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
211 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
212 engine.RegisterLogger (logger);
214 string documentString = @"
215 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
224 <Item1 Include='A;@(Item0)' >
227 <Item2 Include=""@(Item1,'-');@(Item5)"" />
230 <Target Name=""Main"">
231 <Message Text=""Item2: %(Item2.Identity) MD0: %(Item2.MD0) MD1: %(Item2.MD1) MD5: %(Item2.MD5)""/>
236 proj.LoadXml (documentString);
238 CheckItems (proj, "Item2", "A1", "A-D", "ZZ");
240 if (!proj.Build ("Main")) {
241 logger.DumpMessages ();
242 Assert.Fail ("Build failed");
245 logger.CheckLoggedMessageHead ("Item2: A-D MD0: MD1: MD5: ", "A4");
246 logger.CheckLoggedMessageHead ("Item2: ZZ MD0: MD1: MD5: Val5", "A5");
247 Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected extra messages found");
251 public void TestItems3 ()
253 Engine engine = new Engine (Consts.BinPath);
254 Project proj = engine.CreateNewProject ();
256 string documentString = @"
257 <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
259 <Item1 Include='A;B;C' />
260 <Item2 Include=""@(Item1, '-')"" />
265 proj.LoadXml (documentString);
267 CheckItems (proj, "Item2", "A1", "A-B-C");
272 public void TestItems4 ()
274 Engine engine = new Engine (Consts.BinPath);
275 Project proj = engine.CreateNewProject ();
277 string documentString = @"
278 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
280 <Prop1>@(Item0)</Prop1>
283 <Item0 Include=""Foo""/>
284 <Item1 Include='A;B;C' />
285 <Item2 Include=""A\B.txt;A\C.txt;B\B.zip;B\C.zip"" />
286 <ItemT0 Include=""@(Item1)"" />
287 <ItemT1 Include=""@(Item1->'%(Identity)')"" />
288 <ItemT2 Include=""@(Item1->'%(Identity)%(Identity)')"" />
289 <ItemT3 Include=""@(Item1->'(-%(Identity)-)')"" />
290 <ItemT4 Include=""@(Item2->'%(Extension)')"" />
291 <ItemT5 Include=""@(Item2->'%(Filename)/%(Extension)')"" />
292 <ItemT6 Include=""@(Item2->'%(Extension)/$(Prop1)')"" />
297 proj.LoadXml (documentString);
299 //Assert.IsTrue (proj.Build (), "Build failed");
301 Assert.AreEqual ("@(Item0)", proj.EvaluatedProperties["Prop1"].FinalValue, "A0");
302 //Assert.AreEqual ("@(Item2->'%(Extension)/$(Prop1)')", proj.EvaluatedItems [7].FinalItemSpec, "B0");
304 CheckItems (proj, "ItemT0", "A1", "A", "B", "C");
305 CheckItems (proj, "ItemT1", "A1", "A", "B", "C");
306 CheckItems (proj, "ItemT2", "A2", "AA", "BB", "CC");
307 CheckItems (proj, "ItemT3", "A3", "(-A-)", "(-B-)", "(-C-)");
308 CheckItems (proj, "ItemT4", "A4", ".txt", ".txt", ".zip", ".zip");
309 CheckItems (proj, "ItemT5", "A5", "B/.txt", "C/.txt", "B/.zip", "C/.zip");
310 CheckItems (proj, "ItemT6", "A6", ".txt/@(Item0)", ".txt/@(Item0)", ".zip/@(Item0)", ".zip/@(Item0)");
314 public void TestItems5 ()
316 Engine engine = new Engine (Consts.BinPath);
317 Project proj = engine.CreateNewProject ();
319 string documentString = @"
320 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
322 <Item Include=""A\B.txt;A\C.txt;B\B.zip;B\C.zip"" />
323 <ItemT Include=""@(Item->'%(RelativeDir)X\%(Filename)')"" />
328 proj.LoadXml (documentString);
330 string dir_a = Path.Combine ("A", "X");
331 string dir_b = Path.Combine ("B", "X");
332 CheckItems (proj, "ItemT", "A1", Path.Combine (dir_a, "B"), Path.Combine (dir_a, "C"),
333 Path.Combine (dir_b, "B"), Path.Combine (dir_b, "C"));
337 public void TestItems6 ()
339 Engine engine = new Engine (Consts.BinPath);
340 Project proj = engine.CreateNewProject ();
342 string documentString = @"
343 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
349 <Item1 Include='A;B;C' />
350 <Item2 Include='%(A.B)' />
351 <Item3 Include='$(Z)' />
352 <Item4 Include=""@(Item1, '$(A)')"" />
353 <Item5 Include=""@(Item1, '%(A)')"" />
354 <Item6 Include=""@(Item1, '@(A)')"" />
355 <Item7 Include=""@(Item1-> '%(Filename)')"" />
360 proj.LoadXml (documentString);
362 CheckItems (proj, "Item2", "A1", "%(A.B)");
363 CheckItems (proj, "Item3", "A2");
364 CheckItems (proj, "Item4", "A3", "AABAC");
365 CheckItems (proj, "Item5", "A4", "A%(A)B%(A)C");
366 CheckItems (proj, "Item6", "A6", "A@(A)B@(A)C");
367 CheckItems (proj, "Item7", "A6", "A", "B", "C");
370 // The expression "@(Item1, '@(A,'')')" cannot be used in this context.
371 // Item lists cannot be concatenated with other strings where an item list is expected.
372 // Use a semicolon to separate multiple item lists.
374 [ExpectedException (typeof (InvalidProjectFileException))]
375 [Category ("NotWorking")]
376 public void TestItems7 ()
378 Engine engine = new Engine (Consts.BinPath);
379 Project proj = engine.CreateNewProject ();
381 string documentString = @"
382 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
384 <Item1 Include='A;B;C' />
385 <Item7 Include=""@(Item1, '@(A,'')')"" />
390 proj.LoadXml (documentString);
393 // The expression "@(Item1, '@(A->'')')" cannot be used in this context.
394 // Item lists cannot be concatenated with other strings where an item list is expected.
395 // Use a semicolon to separate multiple item lists.
397 [ExpectedException (typeof (InvalidProjectFileException))]
398 [Category ("NotWorking")]
399 public void TestItems8 ()
401 Engine engine = new Engine (Consts.BinPath);
402 Project proj = engine.CreateNewProject ();
404 string documentString = @"
405 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
407 <Item1 Include='A;B;C' />
408 <Item8 Include=""@(Item1, '@(A->'')')"" />
413 proj.LoadXml (documentString);
416 // The expression "@(Item1, '@(A->'','')')" cannot be used in this context.
417 // Item lists cannot be concatenated with other strings where an item list is expected.
418 // Use a semicolon to separate multiple item lists.
420 [ExpectedException (typeof (InvalidProjectFileException))]
421 [Category ("NotWorking")]
422 public void TestItems9 ()
424 Engine engine = new Engine (Consts.BinPath);
425 Project proj = engine.CreateNewProject ();
427 string documentString = @"
428 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
430 <Item1 Include='A;B;C' />
431 <Item9 Include=""@(Item1, '@(A->'','')')"" />
436 proj.LoadXml (documentString);
440 // test item metadata
441 public void TestItems10 ()
443 string project_xml = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
445 <Prop1>@(Item0)</Prop1>
446 <Prop2>@(Ref1)</Prop2>
449 <Item0 Include=""Foo""/>
450 <Ref1 Include=""File1"" />
451 <IWithM Include=""A"">
458 <Message Text=""IWithM.md: %(IWithM.Md)""/>
459 <Message Text=""IWithM.md2: %(IWithM.Md2)""/>
461 <CreateItem Include=""Bar;Xyz"">
462 <Output TaskParameter=""Include"" ItemName=""Item0""/>
465 <Message Text=""IWithM.md: %(IWithM.Md)""/>
466 <Message Text=""IWithM.md2: %(IWithM.Md2)""/>
471 Engine engine = new Engine (Consts.BinPath);
472 Project proj = engine.CreateNewProject ();
473 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
474 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
475 proj.LoadXml (project_xml);
476 engine.RegisterLogger (logger);
478 if (!proj.Build ("1")) {
479 logger.DumpMessages ();
480 Assert.Fail ("Build failed");
483 logger.CheckLoggedMessageHead ("IWithM.md: Foo", "A1");
484 logger.CheckLoggedMessageHead ("IWithM.md2: File1", "A2");
486 logger.CheckLoggedMessageHead ("IWithM.md: Foo", "A3");
487 logger.CheckLoggedMessageHead ("IWithM.md2: File1", "A4");
488 Assert.AreEqual (0, logger.NormalMessageCount, "unexpected messages found");
492 // Test Item/prop references in conditions
493 public void TestItems11 () {
494 string project_xml = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
496 <Prop1>@(Item0)</Prop1>
499 <Item0 Include=""Foo""/>
500 <Item1 Include=""@(Item0)""/>
502 <CondItem Condition=""'@(Item1)' == '@(Item0)'"" Include=""Equal to item0""/>
503 <CondItem Condition=""'@(Item1)' == 'Foo'"" Include=""Equal to item0's value""/>
505 <CondItem1 Condition=""'$(Prop1)' == '@(Item0)'"" Include=""Equal to item0""/>
506 <CondItem1 Condition=""'$(Prop1)' == 'Foo'"" Include=""Equal to item0's value""/>
510 <Message Text = ""CondItem: %(CondItem.Identity)""/>
511 <Message Text = ""CondItem1: %(CondItem1.Identity)""/>
516 Engine engine = new Engine (Consts.BinPath);
517 Project proj = engine.CreateNewProject ();
518 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
519 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
520 proj.LoadXml (project_xml);
521 engine.RegisterLogger (logger);
523 if (!proj.Build ("1")) {
524 logger.DumpMessages ();
525 Assert.Fail ("Build failed");
528 logger.CheckLoggedMessageHead ("CondItem: Equal to item0", "A1");
529 logger.CheckLoggedMessageHead ("CondItem: Equal to item0's value", "A2");
530 logger.CheckLoggedMessageHead ("CondItem1: Equal to item0", "A3");
531 logger.CheckLoggedMessageHead ("CondItem1: Equal to item0's value", "A4");
532 Assert.AreEqual (0, logger.NormalMessageCount, "unexpected messages found");
536 // test properties and item refs, with dynamic properties/items
537 public void TestItems12 ()
539 string project_xml = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
541 <Prop2>@(Ref1)</Prop2>
544 <Ref1 Include=""File1"" />
545 <Files Include=""@(Ref1)""/>
549 <Message Text=""Prop2: $(Prop2)""/>
551 <Message Text=""Files: @(Files)""/>
552 <CreateItem Include=""foobar"">
553 <Output TaskParameter=""Include"" ItemName=""Ref1""/>
555 <Message Text=""Files: @(Files)""/>
557 <Message Text=""Prop2: $(Prop2)""/>
558 <CreateProperty Value=""NewValue"">
559 <Output TaskParameter=""Value"" PropertyName=""Prop2""/>
561 <Message Text=""Prop2: $(Prop2)""/>
566 Engine engine = new Engine (Consts.BinPath);
567 Project proj = engine.CreateNewProject ();
568 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
569 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
570 proj.LoadXml (project_xml);
571 engine.RegisterLogger (logger);
573 if (!proj.Build ("1")) {
574 logger.DumpMessages ();
575 Assert.Fail ("Build failed");
578 logger.CheckLoggedMessageHead ("Prop2: File1", "A1");
579 logger.CheckLoggedMessageHead ("Files: File1", "A1");
580 logger.CheckLoggedMessageHead ("Files: File1", "A1");
581 logger.CheckLoggedMessageHead ("Prop2: File1;foobar", "A1");
582 logger.CheckLoggedMessageHead ("Prop2: NewValue", "A1");
583 Assert.AreEqual (0, logger.NormalMessageCount, "unexpected messages found");
587 // test item refs in properties
588 public void TestItems13 () {
589 string project_xml = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
591 <Prop1>@(Item0)</Prop1>
594 <Item0 Include=""Foo""/>
595 <Item1 Include=""A\B.txt;A\C.txt;B\B.zip;B\C.zip"" />
596 <Item2 Include=""@(Item1->'%(Extension)/$(Prop1)')"" />
600 <Message Text=""Item2: @(Item2)""/>
604 Engine engine = new Engine (Consts.BinPath);
605 Project proj = engine.CreateNewProject ();
606 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
607 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
608 proj.LoadXml (project_xml);
609 engine.RegisterLogger (logger);
611 if (!proj.Build ("1")) {
612 logger.DumpMessages ();
613 Assert.Fail ("Build failed");
616 logger.CheckLoggedMessageHead ("Item2: .txt/@(Item0);.txt/@(Item0);.zip/@(Item0);.zip/@(Item0)", "A1");
617 Assert.AreEqual (0, logger.NormalMessageCount, "unexpected messages found");
621 public void TestMetadataFromItemReferences () {
622 string project_xml = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
624 <Item1 Include=""Item1Val1;Item1Val2"">
625 <Item1Md>False</Item1Md>
627 <Item2 Include=""Val1;Val2;@(Item1);Val3"">
628 <Name>Random name</Name>
630 <Item3 Include=""foo;bar;@(Item2);Last""/>
633 <Target Name=""Main"">
634 <CreateItem Include=""@(Item3)"">
635 <Output TaskParameter=""Include"" ItemName=""Final""/>
638 <Message Text=""Final: %(Final.Identity) Item1Md: %(Final.Item1Md) Name: %(Final.Name)""/>
642 Engine engine = new Engine (Consts.BinPath);
643 Project proj = engine.CreateNewProject ();
644 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
645 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
646 proj.LoadXml (project_xml);
647 engine.RegisterLogger (logger);
649 if (!proj.Build ("Main")) {
650 logger.DumpMessages ();
651 Assert.Fail ("Build failed");
654 CheckItems (proj, "Final", "Z", "foo", "bar", "Val1", "Val2", "Item1Val1", "Item1Val2", "Val3", "Last");
656 logger.CheckLoggedMessageHead ("Final: foo Item1Md: Name: ", "A1");
657 logger.CheckLoggedMessageHead ("Final: bar Item1Md: Name: ", "A2");
658 logger.CheckLoggedMessageHead ("Final: Val1 Item1Md: Name: Random name", "A3");
659 logger.CheckLoggedMessageHead ("Final: Val2 Item1Md: Name: Random name", "A4");
660 logger.CheckLoggedMessageHead ("Final: Item1Val1 Item1Md: False Name: Random name", "A5");
661 logger.CheckLoggedMessageHead ("Final: Item1Val2 Item1Md: False Name: Random name", "A6");
662 logger.CheckLoggedMessageHead ("Final: Val3 Item1Md: Name: Random name", "A7");
663 logger.CheckLoggedMessageHead ("Final: Last Item1Md: Name: ", "A8");
665 Assert.AreEqual (0, logger.NormalMessageCount, "unexpected messages found");
669 public void TestSelfRefrentialItems ()
671 string project_xml = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
673 <Prop1>@(Item1);Val</Prop1>
674 <Prop2>@(Item2)</Prop2>
675 <Prop3>@(Item3)</Prop3>
678 <Item1 Include=""Item1OldVal""/>
679 <Item1 Include=""@(Item1);$(Prop1)""/>
681 <Item2 Include=""Item2OldVal""/>
682 <Item2 Include=""@(Item2->'%(Identity)');$(Prop2)""/>
684 <Item3 Include=""Item3OldVal""/>
685 <Item3 Include=""@(Item3, '_');$(Prop3)""/>
687 <Item4 Include=""@(Item4)""/>
691 <Message Text=""Item1: %(Item1.Identity)""/>
692 <Message Text=""Item2: %(Item2.Identity)""/>
693 <Message Text=""Item3: %(Item3.Identity)""/>
694 <Message Text=""%(Item4.Identity)""/>
695 <Message Text=""Item4: %(Item4.Identity)""/>
700 Engine engine = new Engine (Consts.BinPath);
701 Project proj = engine.CreateNewProject ();
702 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
703 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
704 proj.LoadXml (project_xml);
705 engine.RegisterLogger (logger);
707 if (!proj.Build ("1")) {
708 logger.DumpMessages ();
709 Assert.Fail ("Build failed");
712 logger.CheckLoggedMessageHead ("Item1: Item1OldVal", "A1");
713 logger.CheckLoggedMessageHead ("Item1: Val", "A2");
714 logger.CheckLoggedMessageHead ("Item2: Item2OldVal", "A3");
715 logger.CheckLoggedMessageHead ("Item3: Item3OldVal", "A4");
716 logger.CheckLoggedMessageHead ("Item4: ", "A5");
717 Assert.AreEqual (0, logger.NormalMessageCount, "unexpected messages found");
721 [Category ("NotDotNet")]
722 public void TestEmptyItemsWithBatching ()
724 string project_xml = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
725 <UsingTask TaskName='StringTestTask' AssemblyFile='Test\resources\TestTasks.dll' />
726 <UsingTask TaskName='TestTask_TaskItem' AssemblyFile='Test\resources\TestTasks.dll' />
727 <UsingTask TaskName='TestTask_TaskItems' AssemblyFile='Test\resources\TestTasks.dll' />
729 <StringTestTask Property=""%(Item4.Identity)"">
730 <Output TaskParameter=""OutputString"" PropertyName=""OutputString""/>
732 <Message Text='output1: $(OutputString)'/>
734 <StringTestTask Property="" %(Item4.Identity)"">
735 <Output TaskParameter=""OutputString"" PropertyName=""OutputString""/>
737 <Message Text='output2: $(OutputString)'/>
739 <StringTestTask Array=""%(Item4.Identity)"">
740 <Output TaskParameter=""OutputString"" PropertyName=""OutputString""/>
742 <Message Text='output3: $(OutputString)'/>
744 <StringTestTask Array="" %(Item4.Identity)"">
745 <Output TaskParameter=""OutputString"" PropertyName=""OutputString""/>
747 <Message Text='output4: $(OutputString)'/>
750 <TestTask_TaskItem Property=""%(Item4.Identity)"">
751 <Output TaskParameter=""Output"" PropertyName=""OutputString""/>
753 <Message Text='output5: $(OutputString)'/>
755 <TestTask_TaskItem Property="" %(Item4.Identity)"">
756 <Output TaskParameter=""Output"" PropertyName=""OutputString""/>
758 <Message Text='output6: $(OutputString)'/>
761 <TestTask_TaskItems Property="" %(Item4.Identity)"">
762 <Output TaskParameter=""Output"" PropertyName=""OutputString""/>
763 </TestTask_TaskItems>
764 <Message Text='output7: $(OutputString)'/>
767 <!-- no space in property -->
768 <TestTask_TaskItems Property=""%(Item4.Identity)"">
769 <Output TaskParameter=""Output"" PropertyName=""OutputString""/>
770 </TestTask_TaskItems>
771 <Message Text='output8: $(OutputString)'/>
777 Engine engine = new Engine (Consts.BinPath);
778 Project proj = engine.CreateNewProject ();
779 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
780 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
781 proj.LoadXml (project_xml);
782 engine.RegisterLogger (logger);
784 if (!proj.Build ("1")) {
785 logger.DumpMessages ();
786 Assert.Fail ("Build failed");
789 logger.CheckLoggedMessageHead ("output1: property: null ## array: null", "A1");
790 logger.CheckLoggedMessageHead ("output2: property: ## array: null", "A2");
791 logger.CheckLoggedMessageHead ("output3: property: null ## array: null", "A3");
792 logger.CheckLoggedMessageHead ("output4: property: null ## array: null", "A4");
794 logger.CheckLoggedMessageHead ("output5: null", "A5");
795 logger.CheckLoggedMessageHead ("output6: null", "A6");
796 logger.CheckLoggedMessageHead ("output7: null", "A7");
797 logger.CheckLoggedMessageHead ("output8: null", "A8");
799 Assert.AreEqual (0, logger.NormalMessageCount, "unexpected messages found");
803 [Category ("NotDotNet")]
804 public void TestItemsInTarget1 ()
806 Engine engine = new Engine (Consts.BinPath);
807 Project proj = engine.CreateNewProject ();
809 string documentString = @"
810 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
811 <UsingTask TaskName='StringTestTask' AssemblyFile='Test\resources\TestTasks.dll' />
817 <A Include='A;B;C' />
821 <StringTestTask Property='@(A)@(Z)'>
822 <Output TaskParameter='Property' PropertyName='P1' />
824 <StringTestTask Property=""@(A,'')"">
825 <Output TaskParameter='Property' PropertyName='P2' />
827 <StringTestTask Property=""@(A,'@(A)')"">
828 <Output TaskParameter='Property' PropertyName='P3' />
830 <StringTestTask Property=""@(A,'$(A)')"">
831 <Output TaskParameter='Property' PropertyName='P4' />
833 <StringTestTask Property=""@(A,'@(A,'')')"">
834 <Output TaskParameter='Property' PropertyName='P5' />
836 <StringTestTask Property=""@(A,'$(B)')"">
837 <Output TaskParameter='Property' PropertyName='P6' />
839 <StringTestTask Property=""%(A.Filename)"">
840 <Output TaskParameter='Property' ItemName='I1' />
842 <StringTestTask Property=""@(A) %(Filename)"">
843 <Output TaskParameter='Property' ItemName='I2' />
849 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger = new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
850 engine.RegisterLogger (logger);
851 proj.LoadXml (documentString);
852 if (!proj.Build ("1")) {
853 logger.DumpMessages ();
854 Assert.Fail ("build failed");
857 Assert.AreEqual ("A;B;C", proj.GetEvaluatedProperty ("P1"), "A1");
858 Assert.AreEqual ("ABC", proj.GetEvaluatedProperty ("P2"), "A2");
859 Assert.AreEqual ("A@(A)B@(A)C", proj.GetEvaluatedProperty ("P3"), "A3");
860 Assert.AreEqual ("AABAC", proj.GetEvaluatedProperty ("P4"), "A4");
861 Assert.AreEqual ("@(A,'ABC')", proj.GetEvaluatedProperty ("P5"), "A5");
862 Assert.AreEqual ("A@(A)gB@(A)gC", proj.GetEvaluatedProperty ("P6"), "A6");
863 CheckItems (proj, "I1", "A6", "A", "B", "C");
864 CheckItems (proj, "I2", "A7", "A A", "B B", "C C");
870 [Category ("NotWorking")]
871 public void TestItemsInTarget2 ()
873 Engine engine = new Engine (Consts.BinPath);
874 Project proj = engine.CreateNewProject ();
876 string documentString = @"
877 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
878 <UsingTask TaskName='StringTestTask' AssemblyFile='Test\resources\TestTasks.dll' />
880 <A Include='A;B;C' />
884 <StringTestTask Property=""%(Filename)"">
885 <Output TaskParameter='Property' ItemName='I2' />
891 proj.LoadXml (documentString);
892 Assert.IsFalse (proj.Build ("1"), "A1");
896 [Category ("NotDotNet")]
897 public void TestItemsInTarget3 ()
899 Engine engine = new Engine (Consts.BinPath);
900 Project proj = engine.CreateNewProject ();
902 string documentString = @"
903 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
904 <UsingTask TaskName='StringTestTask' AssemblyFile='Test\resources\TestTasks.dll' />
911 <A Include='A;B;C' />
914 documentString += CreateTargetFragment ("StringTestTask", "Array", "Array", "I",
926 proj.LoadXml (documentString);
927 Assert.IsTrue (proj.Build ("1"), "Build failed");
929 CheckItems (proj, "I0", "A0", "AA");
930 CheckItems (proj, "I1", "A1", "A", "BA", "B");
931 CheckItems (proj, "I2", "A2", "A");
932 CheckItems (proj, "I3", "A3", "A", "A");
933 CheckItems (proj, "I4", "A4", "A", "B", "C", "A");
934 CheckItems (proj, "I5", "A5", "A", "B", "C", "A", "B", "C");
935 CheckItems (proj, "I6", "A6", "Foo", "A", "B", "C");
936 CheckItems (proj, "I7", "A7", "A", "B", "C", "Foo");
940 [Category ("NotDotNet")]
941 //Test with ITaskItem[]
942 public void TestItemsInTarget3a ()
944 Engine engine = new Engine (Consts.BinPath);
945 Project proj = engine.CreateNewProject ();
947 string documentString = @"
948 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
949 <UsingTask TaskName='BatchingTestTask' AssemblyFile='Test\resources\TestTasks.dll' />
956 <A Include='A;B;C' />
960 documentString += CreateTargetFragment ("BatchingTestTask", "Sources", "Output", "I",
967 " $(C) Foo $(C) Bar ; $(B) ",
970 " abc; @(A) ; $(C) ;foo",
974 proj.LoadXml (documentString);
975 Assert.IsTrue (proj.Build ("1"), "Build failed");
977 CheckItems (proj, "I0", "A0", "AA");
978 CheckItems (proj, "I1", "A1", "A", "BA", "B");
979 CheckItems (proj, "I2", "A2", "A");
980 CheckItems (proj, "I3", "A3", "A", "A");
981 CheckItems (proj, "I4", "A4", "A", "A");
982 CheckItems (proj, "I5", "A5", "A", "Foo A", "Bar", "A", "B");
983 CheckItems (proj, "I6", "A6", "A", "B", "C", "A");
984 CheckItems (proj, "I7", "A7", "A", "B", "C", "A", "B", "C");
985 CheckItems(proj, "I8", "A8", "abc", "A", "B", "C", "A", "foo");
989 [Category ("NotDotNet")]
991 public void TestItemsInTarget3b ()
993 Engine engine = new Engine (Consts.BinPath);
994 Project proj = engine.CreateNewProject ();
996 string documentString = @"
997 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
998 <UsingTask TaskName='BatchingTestTask' AssemblyFile='Test\resources\TestTasks.dll' />
1005 <A Include='A;B;;;C' />
1008 documentString += CreateTargetFragment ("BatchingTestTask", "Strings", "StringsOutput", "I",
1014 "$(C) $(C) $(C)Bar$(C)",
1019 proj.LoadXml (documentString);
1020 Assert.IsTrue (proj.Build ("1"), "Build failed");
1022 CheckItems (proj, "I0", "A0", "AA");
1023 CheckItems (proj, "I1", "A1", "A", "BA", "B");
1024 CheckItems (proj, "I2", "A2", "A");
1025 CheckItems (proj, "I3", "A3", "A", "A");
1026 CheckItems (proj, "I4", "A4", "A", "A", "A", "BarA");
1027 CheckItems (proj, "I5", "A5", "A", "B", "C", "A");
1028 CheckItems (proj, "I6", "A6", "A", "B", "C", "A", "B", "C");
1032 [Category ("NotDotNet")]
1034 public void TestItemsInTarget3c ()
1036 Engine engine = new Engine (Consts.BinPath);
1037 Project proj = engine.CreateNewProject ();
1038 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
1039 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger();
1040 engine.RegisterLogger(logger);
1042 string documentString = @"
1043 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
1044 <UsingTask TaskName='BatchingTestTask' AssemblyFile='Test\resources\TestTasks.dll' />
1052 <A Include='A;B;;;C' />
1055 documentString += CreateTargetFragment ("BatchingTestTask", "SingleString", "SingleStringOutput", "I",
1067 proj.LoadXml (documentString);
1068 if (!proj.Build("1")) {
1069 logger.DumpMessages();
1070 Assert.Fail("Build failed");
1073 BuildProperty bp = proj.EvaluatedProperties ["D"];
1074 Assert.AreEqual ("$(C);Foo", bp.Value, "B0");
1075 Assert.AreEqual ("A;;;Foo", bp.FinalValue, "B1");
1077 bp = proj.EvaluatedProperties ["C"];
1078 Assert.AreEqual ("A;;", bp.Value, "B3");
1079 Assert.AreEqual ("A;;", bp.FinalValue, "B4");
1081 CheckItems (proj, "I0", "A0", "AA");
1082 CheckItems (proj, "I1", "A1", "A;BA;B");
1083 CheckItems (proj, "I2", "A2", "A;;");
1084 CheckItems (proj, "I3", "A3", "A;;A;;");
1085 CheckItems (proj, "I4", "A4", "A;; A;;");
1086 CheckItems (proj, "I5", "A5", "A;B;C;A;;");
1087 CheckItems (proj, "I6", "A6", "A;B;C;A;B;C");
1088 CheckItems (proj, "I7", "A7", "A;B;C A;; A;B;C");
1092 public void TestSingleTaskItemError1 ()
1094 CheckSingleTaskItemProject ("$(B)$(B)");
1098 public void TestSingleTaskItemError2 ()
1100 CheckSingleTaskItemProject ("$(C)$(C)");
1104 public void TestSingleTaskItemError3 ()
1106 CheckSingleTaskItemProject ("$(C) $(C)");
1110 public void TestSingleTaskItemError4 ()
1112 CheckSingleTaskItemProject ("@(A)");
1116 public void TestSingleTaskItemError5 ()
1118 CheckSingleTaskItemProject ("@(A);$(C))");
1122 public void TestSingleTaskItemError6 ()
1124 CheckSingleTaskItemProject ("@(A);A;B;C");
1128 public void TestSingleTaskItemError7 ()
1130 CheckSingleTaskItemProject ("@(Item1)$(C)");
1134 public void TestSingleTaskItemError8 ()
1136 CheckSingleTaskItemProject ("$(B).foo");
1140 [Category ("NotDotNet")]
1141 public void TestSingleTaskItem1 ()
1143 Project proj = BuildProjectForSingleTaskItem ("$(D)$(C)");
1144 CheckItems (proj, "I0", "A0", "A");
1148 [Category ("NotDotNet")]
1149 public void TestSingleTaskItem2 ()
1151 Project proj = BuildProjectForSingleTaskItem ("@(Item1)");
1152 CheckItems (proj, "I0", "A0", "F");
1156 [Category ("NotDotNet")]
1157 public void TestSingleTaskItem3 ()
1159 Project proj = BuildProjectForSingleTaskItem ("$(A).foo");
1160 CheckItems (proj, "I0", "A0", "A.foo");
1164 [Category ("NotDotNet")]
1165 public void TestSingleTaskItem4 ()
1167 Project proj = BuildProjectForSingleTaskItem ("$(C)");
1168 CheckItems (proj, "I0", "A0", "A");
1171 void CheckSingleTaskItemProject (string expression)
1173 string documentString = CreateProjectForSingleTaskItem (expression);
1174 Engine engine = new Engine (Consts.BinPath);
1175 Project proj = engine.CreateNewProject ();
1176 proj.LoadXml (documentString);
1177 Assert.IsFalse (proj.Build ("1"), "Build should've failed");
1180 Project BuildProjectForSingleTaskItem (string expression)
1182 string documentString = CreateProjectForSingleTaskItem (expression);
1183 Engine engine = new Engine (Consts.BinPath);
1184 Project proj = engine.CreateNewProject ();
1185 proj.LoadXml (documentString);
1186 Assert.IsTrue (proj.Build ("1"), "Build failed");
1191 string CreateProjectForSingleTaskItem (string expression)
1194 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
1195 <UsingTask TaskName='BatchingTestTask' AssemblyFile='Test\resources\TestTasks.dll' />
1203 <A Include='A;B;C' />
1204 <Item1 Include='F' />
1208 <BatchingTestTask SingleTaskItem='" + expression + @"'>
1209 <Output TaskParameter='SingleStringOutput' ItemName='I0' />
1215 string CreateTargetFragment (string taskname, string task_param_in, string task_param_out, string item_prefix,
1218 StringBuilder sb = new StringBuilder ();
1220 sb.Append ("<Target Name='1'>");
1221 for (int i = 0; i < args.Length; i ++) {
1222 sb.AppendFormat ("<{0} {1}='{2}'>\n", taskname, task_param_in, args [i]);
1223 sb.AppendFormat ("\t<Output TaskParameter='{0}' ItemName='{1}{2}' />\n", task_param_out, item_prefix, i);
1224 sb.AppendFormat ("</{0}>\n", taskname);
1226 sb.Append ("</Target>");
1228 return sb.ToString ();
1232 public void TestItemsInTarget4 ()
1234 Engine engine = new Engine (Consts.BinPath);
1235 Project proj = engine.CreateNewProject ();
1237 string documentString = @"
1238 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
1239 <UsingTask TaskName='StringTestTask' AssemblyFile='Test\resources\TestTasks.dll' />
1241 <A Include='A;B;C' />
1244 <StringTestTask Array='@(A)@(A)'>
1245 <Output TaskParameter='Array' ItemName='I1' />
1251 proj.LoadXml (documentString);
1252 Assert.IsFalse (proj.Build ("1"));
1256 public void TestItemsInTarget5 ()
1258 Engine engine = new Engine (Consts.BinPath);
1259 Project proj = engine.CreateNewProject ();
1261 string documentString = @"
1262 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
1263 <UsingTask TaskName='StringTestTask' AssemblyFile='Test\resources\TestTasks.dll' />
1265 <A Include='A;B;C' />
1268 <StringTestTask Array='@(A)AAA'>
1269 <Output TaskParameter='Array' ItemName='I1' />
1275 proj.LoadXml (documentString);
1276 Assert.IsFalse (proj.Build ("1"));
1280 public void TestItemsInTarget6 ()
1282 Engine engine = new Engine (Consts.BinPath);
1283 Project proj = engine.CreateNewProject ();
1285 string documentString = @"
1286 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
1287 <UsingTask TaskName='StringTestTask' AssemblyFile='Test\resources\TestTasks.dll' />
1289 <A Include='A;B;C' />
1295 <StringTestTask Array='@(A)$(A)'>
1296 <Output TaskParameter='Array' ItemName='I1' />
1302 proj.LoadXml (documentString);
1303 Assert.IsFalse (proj.Build ("1"));
1307 public void TestItemsInTarget7 ()
1309 Engine engine = new Engine (Consts.BinPath);
1310 Project proj = engine.CreateNewProject ();
1312 string documentString = @"
1313 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
1314 <UsingTask TaskName='BatchingTestTask' AssemblyFile='Test\resources\TestTasks.dll' />
1316 <A Include='A;B;C' />
1317 <B Include='Foo;' />
1320 <BatchingTestTask SingleTaskItem='Bar%(B.Identity)@(A)' />
1325 proj.LoadXml (documentString);
1326 Assert.IsFalse (proj.Build ("1"));
1330 public void TestItemsInTarget8 ()
1332 Engine engine = new Engine (Consts.BinPath);
1333 Project proj = engine.CreateNewProject ();
1335 string documentString = @"
1336 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
1349 proj.LoadXml (documentString);
1351 Assert.AreEqual (1, proj.EvaluatedItems.Count, "A1");
1352 BuildItem bi = proj.EvaluatedItems [0];
1353 Assert.AreEqual ("False", bi.GetMetadata ("M"), "A2");
1358 public void TestItemsInTarget9 ()
1360 Engine engine = new Engine (Consts.BinPath);
1361 Project proj = engine.CreateNewProject ();
1363 string documentString = @"
1364 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
1370 <M Condition="" '$(Foo)' == 'Five' "">True</M>
1371 <M Condition="" '$(Foo)' != 'Five' "">False</M>
1377 proj.LoadXml (documentString);
1379 Assert.AreEqual (1, proj.EvaluatedItems.Count, "A1");
1380 BuildItem bi = proj.EvaluatedItems [0];
1381 Assert.AreEqual ("True", bi.GetMetadata ("M"), "A2");
1382 Assert.AreEqual (0, bi.Condition.Length, "A3");
1384 BuildItemGroup big = proj.GetEvaluatedItemsByNameIgnoringCondition ("A");
1385 Assert.AreEqual (1, big.Count, "A4");
1387 Assert.AreEqual ("True", bi.GetMetadata ("M"), "A5");
1388 Assert.AreEqual ("True", bi.GetEvaluatedMetadata ("M"), "A6");
1390 /*proj.SetProperty ("Foo", "Six");
1392 bi = proj.GetEvaluatedItemsByName ("A") [0];
1393 Assert.AreEqual ("False", bi.GetMetadata ("M"), "A7");
1394 Assert.AreEqual ("False", bi.GetEvaluatedMetadata ("M"), "A7a");
1395 Assert.AreEqual (0, bi.Condition.Length, "A8");
1397 big = proj.GetEvaluatedItemsByNameIgnoringCondition ("A");
1398 Assert.AreEqual (1, big.Count, "A9");
1400 Assert.AreEqual ("True", bi.GetMetadata ("M"), "A10");
1401 Assert.AreEqual ("True", bi.GetEvaluatedMetadata ("M"), "A11");*/
1406 [Category ("NotWorking")]
1407 public void TestItemsWithWildcards ()
1409 Engine engine = new Engine (Consts.BinPath);
1410 Project proj = engine.CreateNewProject ();
1411 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
1412 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
1413 engine.RegisterLogger (logger);
1417 string basedir = PathCombine ("Test", "resources", "dir");
1418 string aaa = PathCombine ("a", "aa", "aaa");
1419 string bb = Path.Combine ("b", "bb");
1421 string[] dirs = { aaa, bb, "c" };
1423 PathCombine (basedir, aaa, "foo.dll"),
1424 PathCombine (basedir, bb, "bar.dll"),
1425 PathCombine (basedir, bb, "sample.txt"),
1426 Path.Combine (basedir, "xyz.dll")
1429 string documentString = @"
1430 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
1432 <ItemsRel Include='dir\**\*.dll' Exclude='*\x*.dll' />
1433 <ItemsRelExpanded Include=""@(ItemsRel->'%(FullPath)')"" />
1434 <ItemsAbs Include='$(MSBuildProjectDirectory)\dir\**\*.dll'/>
1437 <Target Name='Main'>
1438 <Message Text=""ItemsRel: %(ItemsRel.FullPath) RecDir: %(ItemsRel.RecursiveDir)""/>
1439 <Message Text=""ItemsRelExpanded: %(ItemsRelExpanded.Identity)""/>
1440 <Message Text='ItemsAbs: %(ItemsAbs.Identity) RecDir: %(ItemsAbs.RecursiveDir)'/>
1445 CreateDirectoriesAndFiles (basedir, dirs, files);
1446 string projectdir = Path.Combine ("Test", "resources");
1447 File.WriteAllText (Path.Combine (projectdir, "wild1.proj"), documentString);
1448 proj.Load (Path.Combine (projectdir, "wild1.proj"));
1449 if (!proj.Build ("Main")) {
1450 logger.DumpMessages ();
1451 Assert.Fail ("Build failed");
1453 string full_base_dir = Path.GetFullPath (basedir);
1455 logger.CheckLoggedAny (@"ItemsRel: "+ PathCombine (full_base_dir, aaa, "foo.dll") +
1456 " RecDir: " + aaa + Path.DirectorySeparatorChar, MessageImportance.Normal, "A1");
1458 logger.CheckLoggedAny (@"ItemsRel: " + PathCombine (full_base_dir, bb, "bar.dll") +
1459 " RecDir: " + bb + Path.DirectorySeparatorChar, MessageImportance.Normal, "A2");
1461 logger.CheckLoggedAny (@"ItemsRelExpanded: " + PathCombine (full_base_dir, aaa, "foo.dll"), MessageImportance.Normal, "A3");
1462 logger.CheckLoggedAny (@"ItemsRelExpanded: " + PathCombine (full_base_dir, bb, "bar.dll"), MessageImportance.Normal, "A4");
1464 logger.CheckLoggedAny (@"ItemsAbs: " + PathCombine (full_base_dir, aaa, "foo.dll") +
1465 @" RecDir: " + aaa + Path.DirectorySeparatorChar, MessageImportance.Normal, "A5");
1466 logger.CheckLoggedAny (@"ItemsAbs: " + PathCombine (full_base_dir, bb, "bar.dll") +
1467 @" RecDir: " + bb + Path.DirectorySeparatorChar, MessageImportance.Normal, "A6");
1468 logger.CheckLoggedAny (@"ItemsAbs: " + PathCombine (full_base_dir, "xyz.dll") +
1469 @" RecDir: ", MessageImportance.Normal, "A7");
1471 Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected extra messages found");
1472 } catch (AssertionException) {
1473 logger.DumpMessages ();
1476 Directory.Delete (basedir, true);
1482 [Category ("NotWorking")]
1483 public void TestReservedMetadata ()
1485 Engine engine = new Engine (Consts.BinPath);
1486 Project proj = engine.CreateNewProject ();
1487 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
1488 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
1489 engine.RegisterLogger (logger);
1491 string documentString = @"
1492 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
1493 <ItemGroup><File1 Include=""bar\foo.dll""/></ItemGroup>
1494 <Target Name='Main'>
1495 <Message Text='file1: @(File1)'/>
1496 <Message Text='file1: RootDir: %(File1.RootDir)'/>
1497 <Message Text='file1: Directory: %(File1.Directory)'/>
1501 string projectdir = Path.Combine ("Test", "resources");
1502 File.WriteAllText (Path.Combine (projectdir, "test1.proj"), documentString);
1503 proj.Load (Path.Combine (projectdir, "test1.proj"));
1504 if (!proj.Build ("Main")) {
1505 logger.DumpMessages ();
1506 Assert.Fail ("Build failed");
1509 logger.CheckLoggedMessageHead ("file1: " + Path.Combine ("bar", "foo.dll"), "A1");
1511 string path_root = Path.GetPathRoot (Path.GetFullPath (projectdir));
1512 logger.CheckLoggedMessageHead ("file1: RootDir: " + path_root, "A2");
1514 string fullpath = Path.GetFullPath (Path.Combine (projectdir, "bar"));
1515 logger.CheckLoggedMessageHead ("file1: Directory: " + fullpath.Substring (path_root.Length) + Path.DirectorySeparatorChar, "A3");
1517 if (logger.NormalMessageCount != 0) {
1518 logger.DumpMessages ();
1519 Assert.Fail ("Unexpected extra messages found");
1523 void CreateDirectoriesAndFiles (string basedir, string[] dirs, string[] files)
1525 foreach (string dir in dirs)
1526 Directory.CreateDirectory (Path.Combine (basedir, dir));
1528 foreach (string file in files)
1529 File.WriteAllText (file, String.Empty);
1532 string PathCombine (string path1, params string[] parts)
1534 if (parts == null || parts.Length == 0)
1537 string final_path = path1;
1538 foreach (string part in parts)
1539 final_path = Path.Combine (final_path, part);