[TestFixture]
public class TaskBatchingTest
{
+ string projectHeader;
+ public TaskBatchingTest ()
+ {
+ projectHeader = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" " + Consts.ToolsVersionString + ">";
+ }
+
[Test]
public void Test1 ()
{
// 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)""/>
// 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)""/>
[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""/>
[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""/>
[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""/>
}
}
+ [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>