new BuildItem (null, "something");
}
+ // Parameter "itemInclude" cannot have zero length.
[Test]
- [ExpectedException (typeof (ArgumentException),
- "Parameter \"itemInclude\" cannot have zero length.")]
+ [Category ("NotDotNet")]
+ [ExpectedException (typeof (ArgumentException))]
public void TestCtor6 ()
{
new BuildItem (null, String.Empty);
Assert.AreEqual ("name", item2.Name, "A6");
}
+ // Cannot set a condition on an object not represented by an XML element in the project file.
[Test]
- [ExpectedException (typeof (InvalidOperationException),
- "Cannot set a condition on an object not represented by an XML element in the project file.")]
+ [ExpectedException (typeof (InvalidOperationException))]
public void TestCondition1 ()
{
item = new BuildItem ("name", "1");
item.CopyCustomMetadataTo (null);
}
+ // Assigning the "Exclude" attribute of a virtual item is not allowed.
[Test]
- [ExpectedException (typeof (InvalidOperationException),
- "Assigning the \"Exclude\" attribute of a virtual item is not allowed.")]
+ [ExpectedException (typeof (InvalidOperationException))]
public void TestExclude1 ()
{
item = new BuildItem ("name", "1");
Assert.AreEqual (String.Empty, item.GetMetadata ("AccessedTime"), "A13");
}
+ [Test]
+ public void GetMetadata_UnescapedItemSpec ()
+ {
+ string itemInclude = "a;b;c";
+ string escapedItemInclude = Utilities.Escape (itemInclude);
+
+ item = new BuildItem ("name", itemInclude);
+ Assert.IsTrue (item.GetMetadata ("FullPath").EndsWith (escapedItemInclude), "#1a");
+ Assert.IsTrue (item.GetEvaluatedMetadata ("FullPath").EndsWith (itemInclude), "#1b");
+
+ Assert.AreEqual (itemInclude, item.GetMetadata ("FileName"), "#2b");
+ Assert.AreEqual (itemInclude, item.GetEvaluatedMetadata ("FileName"), "#2b");
+
+ Assert.AreEqual (itemInclude, item.GetMetadata ("Identity"), "#3a");
+ Assert.AreEqual (itemInclude, item.GetEvaluatedMetadata ("Identity"), "#3b");
+ }
+
+ [Test]
+ public void GetMetadata_EscapedItemSpec ()
+ {
+ string itemInclude = "a;b;c";
+ string escapedItemInclude = Utilities.Escape (itemInclude);
+
+ item = new BuildItem ("name", escapedItemInclude);
+ Assert.IsTrue (item.GetMetadata ("FullPath").EndsWith (escapedItemInclude), "#1a");
+ Assert.IsTrue (item.GetEvaluatedMetadata ("FullPath").EndsWith (itemInclude), "#1b");
+
+ Assert.AreEqual (escapedItemInclude, item.GetMetadata ("FileName"), "#2b");
+ Assert.AreEqual (itemInclude, item.GetEvaluatedMetadata ("FileName"), "#2b");
+
+ Assert.AreEqual (escapedItemInclude, item.GetMetadata ("Identity"), "#3a");
+ Assert.AreEqual ("a;b;c", item.GetEvaluatedMetadata ("Identity"), "#3b");
+ }
+
[Test]
[ExpectedException (typeof (ArgumentNullException))]
public void TestGetMetadata2 ()
item.RemoveMetadata ("undefined_metadata");
}
+ // "Filename" is a reserved item meta-data, and cannot be modified or deleted.
[Test]
- [ExpectedException (typeof (ArgumentException),
- "\"Filename\" is a reserved item meta-data, and cannot be modified or deleted.")]
+ [ExpectedException (typeof (ArgumentException))]
public void TestRemoveMetadata4 ()
{
item = new BuildItem ("name", "value");
Assert.AreEqual (Utilities.Escape ("$(A)"), item.GetMetadata ("b"), "A5");
Assert.AreEqual ("$(A)", item.GetMetadata ("c"), "A6");
}
+
+ // "Filename" is a reserved item meta-data, and cannot be modified or deleted.
[Test]
- [ExpectedException (typeof (ArgumentException),
- "\"Filename\" is a reserved item meta-data, and cannot be modified or deleted.")]
+ [ExpectedException (typeof (ArgumentException))]
public void TestSetMetadata4 ()
{
item = new BuildItem ("name", "include");
Assert.AreEqual ("A", project.EvaluatedItems [1].GetEvaluatedMetadata ("Meta"), "A6");
}
+ [Test]
+ public void TestSetMetadata5a () {
+ Engine engine;
+ Project project;
+ BuildItemGroup[] groups = new BuildItemGroup[1];
+
+ string documentString = @"
+ <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
+ <PropertyGroup>
+ <A>A</A>
+ <C>@(D)</C>
+ </PropertyGroup>
+ <ItemGroup>
+ <D Include='D'/>
+ <C Include='$(C)'/>
+ <A Include='a;b'>
+ <Md>@(C)</Md>
+ </A>
+ <B Include='$(A)'/>
+ </ItemGroup>
+ <Target Name='main'>
+ <Message Text=""a.md: %(A.Md)""/>
+ <Message Text=""a.md: %(A.Meta)""/>
+ </Target>
+ </Project>
+ ";
+
+ engine = new Engine (Consts.BinPath);
+ project = engine.CreateNewProject ();
+ MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger = new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
+ engine.RegisterLogger (logger);
+ project.LoadXml (documentString);
+
+ CheckMetadata (project, "A", "Md", new string [] {"@(C)", "@(C)"}, "G1");
+ CheckEvaluatedMetadata (project, "A", "Md", new string[] { "D", "D" }, "G2");
+
+ //@(B)
+ Assert.AreEqual ("A", project.GetEvaluatedItemsByName ("B")[0].FinalItemSpec, "B2");
+
+ project.ItemGroups.CopyTo (groups, 0);
+ /*Broken right now:
+ CheckBuildItemGroup (groups[0], new string[] {
+ "D", "D",
+ "C", "$(C)",
+ "A", "a;b",
+ "B", "$(A)"
+ }, "H1");*/
+
+ CheckBuildItemGroup (project.GetEvaluatedItemsByName ("C"), new string[] {
+ "C", "D"
+ }, "H2");
+
+ CheckBuildItemGroup (project.GetEvaluatedItemsByName ("C"), new string[] {
+ "C", "D"
+ }, "I");
+
+ project.GetEvaluatedItemsByName ("A")[0].SetMetadata ("Meta", "@(B)");
+
+ Assert.AreEqual (5, project.EvaluatedItems.Count, "A0");
+ Assert.AreEqual (2, project.GetEvaluatedItemsByName ("A").Count, "A7");
+
+ CheckMetadata (project, "A", "Meta", new string[] { "@(B)", "" }, "J");
+
+ if (!project.Build ()) {
+ logger.DumpMessages ();
+ Assert.Fail ("Build failed");
+ }
+
+ CheckMetadata (project, "A", "Meta", new string[] { "@(B)", "" }, "K1");
+ CheckEvaluatedMetadata (project, "A", "Meta", new string[] { "", "" }, "K2");
+
+ logger.CheckLoggedMessageHead ("a.md: D", "E10");
+ logger.CheckLoggedMessageHead ("a.md: ", "E11");
+ Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected messages left");
+ }
+
[Test]
public void TestSetMetadata6 ()
{
project.ItemGroups.CopyTo (groups, 0);
Assert.AreEqual (1, groups [0].Count, "A3");
}
+
+ [Test]
+ public void TestBuildItemTransform ()
+ {
+ string projectText = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+ <UsingTask TaskName='BatchingTestTask' AssemblyFile='Test\resources\TestTasks.dll' />
+
+ <ItemGroup>
+ <Foo Include='abc'/>
+ <Foo Include='def'/>
+ </ItemGroup>
+ <PropertyGroup>
+ <FooProp>PropValue/</FooProp>
+ </PropertyGroup>
+
+ <Target Name=""main"">
+ <CreateItem Include=""@(Foo)"">
+ <Output TaskParameter =""Include"" ItemName=""SyntheticFoo""/>
+ </CreateItem>
+
+ <BatchingTestTask
+ TaskItemsOutput=""@(SyntheticFoo->'$(FooProp)%(Identity).txt')"">
+ <Output TaskParameter='TaskItemsOutput' ItemName='I0' />
+ </BatchingTestTask>
+ </Target>
+ </Project>";
+
+ Engine engine = new Engine (Consts.BinPath);
+ MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
+ new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
+ engine.RegisterLogger (logger);
+ Project project = engine.CreateNewProject ();
+ project.LoadXml (projectText);
+
+ bool result = project.Build ("main");
+ if (!result) {
+ logger.DumpMessages ();
+ Assert.Fail ("Build failed");
+ }
+
+ BuildItemGroup grp = project.GetEvaluatedItemsByName ("I0");
+ Assert.AreEqual (2, grp.Count, "A1");
+ Assert.AreEqual ("PropValue/abc.txt", grp [0].FinalItemSpec, "A2");
+ Assert.AreEqual ("PropValue/def.txt", grp [1].FinalItemSpec, "A3");
+ }
+
+ void CheckMetadata (Project p, string itemname, string metadataname, string[] values, string prefix)
+ {
+ BuildItemGroup group = p.GetEvaluatedItemsByName (itemname);
+
+ Assert.AreEqual (values.Length, group.Count, "Number of items for itemname " + itemname);
+
+ for (int i = 0; i < values.Length; i++) {
+ Assert.AreEqual (values[i], group [i].GetMetadata (metadataname), prefix + "#" + i.ToString ());
+ }
+ }
+
+ void CheckEvaluatedMetadata (Project p, string itemname, string metadataname, string[] values, string prefix)
+ {
+ BuildItemGroup group = p.GetEvaluatedItemsByName (itemname);
+
+ Assert.AreEqual (values.Length, group.Count, "Number of items for itemname " + itemname);
+
+ for (int i = 0; i < values.Length; i++) {
+ Assert.AreEqual (values[i], group [i].GetEvaluatedMetadata (metadataname), prefix + "#" + i.ToString ());
+ }
+ }
+
+ void CheckBuildItemGroup (BuildItemGroup group, string[] names, string prefix)
+ {
+ try {
+ Assert.AreEqual (group.Count, names.Length / 2, "Number of items in group");
+ for (int i = 0; i < group.Count; i++) {
+ Assert.AreEqual (names[i * 2], group[i].Name, String.Format ("{0}#{1} : item name", prefix, i));
+ Assert.AreEqual (names[(i * 2) + 1], group[i].FinalItemSpec, String.Format ("{0}#{1} : FinalItemSpec", prefix, i));
+ }
+ } catch (AssertionException) {
+ for (int i = 0; i < group.Count; i++) {
+ Console.WriteLine ("group[{0}] = {1}", i, group[i].Name);
+ Console.WriteLine ("group[{0}] = {1}", i, group[i].FinalItemSpec);
+ }
+ throw;
+ }
+ }
}
}