Add support for ToolsVersion and correctly build msbuild+xbuild assemblies
[mono.git] / mcs / class / Microsoft.Build.Tasks / Test / Microsoft.Build.Tasks / TaskBatchingTest.cs
index bf904fbf5ec2da5b958215565d52977d1fe74639..e854812b76b16e12f7fd70b0d18dbc87d15eca3c 100755 (executable)
@@ -40,6 +40,12 @@ namespace MonoTests.Microsoft.Build.Tasks
        [TestFixture]
        public class TaskBatchingTest
        {
+               string projectHeader;
+               public TaskBatchingTest ()
+               {
+                       projectHeader = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" " + Consts.ToolsVersionString + ">";
+               }
+
                [Test]
                public void Test1 ()
                {
@@ -548,7 +554,7 @@ namespace MonoTests.Microsoft.Build.Tasks
                // batching should happen only on basis of the task attributes,
                // and not the resolved expression values
                public void TestBatching1 () {
-                       string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""3.5"">
+                       string projectString = projectHeader + @"
        <ItemGroup>
                <item3 Include=""foo""/>
                <item2 Include=""%(item3.Identity)""/>
@@ -584,7 +590,7 @@ namespace MonoTests.Microsoft.Build.Tasks
                // batching should happen only on basis of the task attributes,
                // and not the resolved expression values
                public void TestConditionalBatching2 () {
-                       string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""3.5"">
+                       string projectString = projectHeader + @"
        <ItemGroup>
                <item2 Include=""%(item3.Identity)""/>
                <item4 Include=""%(item2.Identity);@(item3)""/>
@@ -614,7 +620,7 @@ namespace MonoTests.Microsoft.Build.Tasks
 
                [Test]
                public void TestBatchingWithUnbatchedItems () {
-                       string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""3.5"">
+                       string projectString = projectHeader + @"
        <ItemGroup>
                <Item1 Include=""One""/>
                <Item1 Include=""Two""/>
@@ -651,7 +657,7 @@ namespace MonoTests.Microsoft.Build.Tasks
 
                [Test]
                public void TestPropertiesWithBatchedReferences () {
-                       string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""3.5"">
+                       string projectString = projectHeader + @"
        <ItemGroup>
                <Item1 Include=""One""/>
                <Item1 Include=""Two""/>
@@ -693,7 +699,7 @@ namespace MonoTests.Microsoft.Build.Tasks
 
                [Test]
                public void TestPropertiesWithDynamicItems () {
-                       string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""3.5"">
+                       string projectString = projectHeader + @"
        <ItemGroup>
                <Item1 Include=""One""/>
                <Item1 Include=""Two""/>
@@ -746,9 +752,125 @@ namespace MonoTests.Microsoft.Build.Tasks
                        }
                }
 
+               [Test]
+               public void TestTargetInvocationFromBatchedTask () {
+                       string projectString = projectHeader + @"
+       <ItemGroup>
+               <Item1 Include=""One""/>
+               <Item1 Include=""Two""/>
+
+               <Item1Ref Include=""@(Item1)"" />
+       </ItemGroup>
+       <PropertyGroup>
+               <Prop1>@(Item1)</Prop1>
+               <Prop2>@(Item1Ref)</Prop2>
+       </PropertyGroup>
+       <Target Name='1'>
+               <CallTarget Targets='foo' Condition="" '%(Item1.Identity)' != ''"" />
+               <Message Text=""Item1: @(Item1) Item1Ref: @(Item1Ref)""/>
+               <Message Text=""Prop1: $(Prop1) Prop2: $(Prop2)""/>
+       </Target>
+       <Target Name='foo'>
+               <Message Text=""(foo) Item1: @(Item1) Item1Ref: @(Item1Ref)""/>
+               <Message Text=""(foo) Prop1: $(Prop1) Prop2: $(Prop2)""/>
+       </Target>
+</Project>";
+
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project project = engine.CreateNewProject ();
+
+                       TestMessageLogger testLogger = new TestMessageLogger ();
+                       engine.RegisterLogger (testLogger);
+
+                       project.LoadXml (projectString);
+                       if (!project.Build ("1")) {
+
+                               testLogger.DumpMessages ();
+                               Assert.Fail ("Build failed");
+                       }
+
+                       try {
+                               testLogger.CheckLoggedMessageHead ("(foo) Item1: One;Two Item1Ref: One;Two", "A1");
+                               testLogger.CheckLoggedMessageHead ("(foo) Prop1: One;Two Prop2: One;Two", "A2");
+
+                               testLogger.CheckLoggedMessageHead ("Item1: One;Two Item1Ref: One;Two", "A3");
+                               testLogger.CheckLoggedMessageHead ("Prop1: One;Two Prop2: One;Two", "A4");
+
+                               Assert.AreEqual (0, testLogger.NormalMessageCount, "Unexpected extra messages found");
+                       } catch (AssertionException) {
+                               testLogger.DumpMessages ();
+                               throw;
+                       }
+               }
+
+               [Test]
+               public void TestTargetInvocationFromBatchedTarget () {
+                       string projectString = projectHeader + @"
+       <ItemGroup>
+               <Item1 Include=""One""/>
+               <Item1 Include=""Two""/>
+
+               <Item1Ref Include=""@(Item1)"" />
+       </ItemGroup>
+       <PropertyGroup>
+               <Prop1>@(Item1)</Prop1>
+               <Prop2>@(Item1Ref)</Prop2>
+       </PropertyGroup>
+       <Target Name='1' Inputs=""%(Item1.Identity)"" Outputs=""Nonexistant.foobar"">
+               <Message Text=""Item1: @(Item1) Item1Ref: @(Item1Ref)""/>
+               <Message Text=""Prop1: $(Prop1) Prop2: $(Prop2)""/>
+
+               <CallTarget Targets='foo' />
+
+               <Message Text=""Item1: @(Item1) Item1Ref: @(Item1Ref)""/>
+               <Message Text=""Prop1: $(Prop1) Prop2: $(Prop2)""/>
+       </Target>
+       <Target Name='foo' Condition="" '@(Item1)' != 'One' "">
+               <Message Text=""(foo) Item1: @(Item1) Item1Ref: @(Item1Ref)""/>
+               <Message Text=""(foo) Prop1: $(Prop1) Prop2: $(Prop2)""/>
+       </Target>
+</Project>";
+
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project project = engine.CreateNewProject ();
+
+                       TestMessageLogger testLogger = new TestMessageLogger ();
+                       engine.RegisterLogger (testLogger);
+
+                       project.LoadXml (projectString);
+                       if (!project.Build ("1")) {
+
+                               testLogger.DumpMessages ();
+                               Assert.Fail ("Build failed");
+                       }
+
+                       try {
+                               testLogger.CheckLoggedMessageHead ("Item1: One Item1Ref: One;Two", "A1");
+                               testLogger.CheckLoggedMessageHead ("Prop1: One Prop2: One;Two", "A2");
+
+                               testLogger.CheckLoggedMessageHead ("(foo) Item1: One;Two Item1Ref: One;Two", "A3");
+                               testLogger.CheckLoggedMessageHead ("(foo) Prop1: One;Two Prop2: One;Two", "A4");
+
+                               testLogger.CheckLoggedMessageHead ("Item1: One Item1Ref: One;Two", "A5");
+                               testLogger.CheckLoggedMessageHead ("Prop1: One Prop2: One;Two", "A6");
+
+                               //second batch, foo has already run, so doesn't execute again
+                               testLogger.CheckLoggedMessageHead ("Item1: Two Item1Ref: One;Two", "A7");
+                               testLogger.CheckLoggedMessageHead ("Prop1: Two Prop2: One;Two", "A8");
+
+                               testLogger.CheckLoggedMessageHead ("Item1: Two Item1Ref: One;Two", "A9");
+                               testLogger.CheckLoggedMessageHead ("Prop1: Two Prop2: One;Two", "A10");
+
+                               Assert.AreEqual (0, testLogger.NormalMessageCount, "Unexpected extra messages found");
+                       } catch (AssertionException) {
+                               testLogger.DumpMessages ();
+                               throw;
+                       }
+               }
+
                [Test]
                public void TestBatchingWithUnqualifiedMetadataReference () {
-                       string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""3.5"">
+                       string projectString = projectHeader + @"
        <ItemGroup>
                <Item1 Include=""One""><Md>1</Md></Item1>
                <Item1 Include=""Two""><Md>2</Md></Item1>