public void InvalidUnqualifiedMetadataReference() { Assert.Throws <InvalidProjectFileException>(() => { ProjectInstance project = ProjectHelpers.CreateEmptyProjectInstance(); List <string> parameters = new List <string>(); parameters.Add("@(File)"); parameters.Add("%(Culture)"); ItemDictionary <ProjectItemInstance> itemsByType = new ItemDictionary <ProjectItemInstance>(); List <ProjectItemInstance> items = new List <ProjectItemInstance>(); ProjectItemInstance a = new ProjectItemInstance(project, "File", "a.foo", project.FullPath); items.Add(a); ProjectItemInstance b = new ProjectItemInstance(project, "File", "b.foo", project.FullPath); items.Add(b); a.SetMetadata("Culture", "fr-fr"); itemsByType.ImportItems(items); PropertyDictionary <ProjectPropertyInstance> properties = new PropertyDictionary <ProjectPropertyInstance>(); // This is expected to throw because not all items contain a value for metadata "Culture". // Only a.foo has a Culture metadata. b.foo does not. List <ItemBucket> buckets = BatchingEngine.PrepareBatchingBuckets(parameters, CreateLookup(itemsByType, properties), MockElementLocation.Instance); } ); }
public void ValidUnqualifiedMetadataReference() { List <string> parameters = new List <string>(); parameters.Add("@(File)"); parameters.Add("%(Culture)"); Hashtable itemsByType = new Hashtable(StringComparer.OrdinalIgnoreCase); BuildItemGroup items = new BuildItemGroup(); itemsByType["FILE"] = items; BuildItem a = items.AddNewItem("File", "a.foo"); BuildItem b = items.AddNewItem("File", "b.foo"); a.SetMetadata("Culture", "fr-fr"); b.SetMetadata("Culture", "en-en"); BuildPropertyGroup properties = new BuildPropertyGroup(); ArrayList buckets = BatchingEngine.PrepareBatchingBuckets(new XmlDocument().CreateElement("Foo"), parameters, CreateLookup(itemsByType, properties)); Assertion.AssertEquals(2, buckets.Count); }
public void ValidUnqualifiedMetadataReference() { ProjectInstance project = ProjectHelpers.CreateEmptyProjectInstance(); List <string> parameters = new List <string>(); parameters.Add("@(File)"); parameters.Add("%(Culture)"); ItemDictionary <ProjectItemInstance> itemsByType = new ItemDictionary <ProjectItemInstance>(); List <ProjectItemInstance> items = new List <ProjectItemInstance>(); ProjectItemInstance a = new ProjectItemInstance(project, "File", "a.foo", project.FullPath); ProjectItemInstance b = new ProjectItemInstance(project, "File", "b.foo", project.FullPath); a.SetMetadata("Culture", "fr-fr"); b.SetMetadata("Culture", "en-en"); items.Add(a); items.Add(b); itemsByType.ImportItems(items); PropertyDictionary <ProjectPropertyInstance> properties = new PropertyDictionary <ProjectPropertyInstance>(); List <ItemBucket> buckets = BatchingEngine.PrepareBatchingBuckets(parameters, CreateLookup(itemsByType, properties), null); Assert.Equal(2, buckets.Count); }
public void NoItemsConsumed() { List <string> parameters = new List <string>(); parameters.Add("$(File)"); parameters.Add("%(Culture)"); ItemDictionary <ProjectItemInstance> itemsByType = new ItemDictionary <ProjectItemInstance>(); PropertyDictionary <ProjectPropertyInstance> properties = new PropertyDictionary <ProjectPropertyInstance>(); // This is expected to throw because we have no idea what item list %(Culture) refers to. List <ItemBucket> buckets = BatchingEngine.PrepareBatchingBuckets(parameters, CreateLookup(itemsByType, properties), MockElementLocation.Instance); }
public void NoItemsConsumed() { List <string> parameters = new List <string>(); parameters.Add("$(File)"); parameters.Add("%(Culture)"); Hashtable itemsByType = new Hashtable(StringComparer.OrdinalIgnoreCase); BuildPropertyGroup properties = new BuildPropertyGroup(); // This is expected to throw because we have no idea what item list %(Culture) refers to. ArrayList buckets = BatchingEngine.PrepareBatchingBuckets(new XmlDocument().CreateElement("Foo"), parameters, CreateLookup(itemsByType, properties)); }
public void Regress_Mutation_DuplicateBatchingBucketsAreFoldedTogether() { List <string> parameters = new List <string>(); parameters.Add("%(File.Culture)"); Hashtable itemsByType = new Hashtable(StringComparer.OrdinalIgnoreCase); BuildItemGroup items = new BuildItemGroup(); items.AddNewItem("File", "a.foo"); items.AddNewItem("File", "b.foo"); // Need at least two items for this test case to ensure multiple buckets might be possible itemsByType["FILE"] = items; BuildPropertyGroup properties = new BuildPropertyGroup(); ArrayList buckets = BatchingEngine.PrepareBatchingBuckets(new XmlDocument().CreateElement("Foo"), parameters, CreateLookup(itemsByType, properties)); // If duplicate buckes have been folded correctly, then there will be exactly one bucket here // containing both a.foo and b.foo. Assertion.AssertEquals(1, buckets.Count); }
public void Regress_Mutation_DuplicateBatchingBucketsAreFoldedTogether() { ProjectInstance project = ProjectHelpers.CreateEmptyProjectInstance(); List <string> parameters = new List <string>(); parameters.Add("%(File.Culture)"); ItemDictionary <ProjectItemInstance> itemsByType = new ItemDictionary <ProjectItemInstance>(); List <ProjectItemInstance> items = new List <ProjectItemInstance>(); items.Add(new ProjectItemInstance(project, "File", "a.foo", project.FullPath)); items.Add(new ProjectItemInstance(project, "File", "b.foo", project.FullPath)); // Need at least two items for this test case to ensure multiple buckets might be possible itemsByType.ImportItems(items); PropertyDictionary <ProjectPropertyInstance> properties = new PropertyDictionary <ProjectPropertyInstance>(); List <ItemBucket> buckets = BatchingEngine.PrepareBatchingBuckets(parameters, CreateLookup(itemsByType, properties), null); // If duplicate buckes have been folded correctly, then there will be exactly one bucket here // containing both a.foo and b.foo. Assert.Equal(1, buckets.Count); }
public void InvalidUnqualifiedMetadataReference() { List <string> parameters = new List <string>(); parameters.Add("@(File)"); parameters.Add("%(Culture)"); Hashtable itemsByType = new Hashtable(StringComparer.OrdinalIgnoreCase); BuildItemGroup items = new BuildItemGroup(); itemsByType["FILE"] = items; BuildItem a = items.AddNewItem("File", "a.foo"); BuildItem b = items.AddNewItem("File", "b.foo"); a.SetMetadata("Culture", "fr-fr"); BuildPropertyGroup properties = new BuildPropertyGroup(); // This is expected to throw because not all items contain a value for metadata "Culture". // Only a.foo has a Culture metadata. b.foo does not. ArrayList buckets = BatchingEngine.PrepareBatchingBuckets(new XmlDocument().CreateElement("Foo"), parameters, CreateLookup(itemsByType, properties)); }
public void GetBuckets() { ProjectInstance project = ProjectHelpers.CreateEmptyProjectInstance(); List <string> parameters = new List <string>(); parameters.Add("@(File);$(unittests)"); parameters.Add("$(obj)\\%(Filename).ext"); parameters.Add("@(File->'%(extension)')"); // attributes in transforms don't affect batching ItemDictionary <ProjectItemInstance> itemsByType = new ItemDictionary <ProjectItemInstance>(); IList <ProjectItemInstance> items = new List <ProjectItemInstance>(); items.Add(new ProjectItemInstance(project, "File", "a.foo", project.FullPath)); items.Add(new ProjectItemInstance(project, "File", "b.foo", project.FullPath)); items.Add(new ProjectItemInstance(project, "File", "c.foo", project.FullPath)); items.Add(new ProjectItemInstance(project, "File", "d.foo", project.FullPath)); items.Add(new ProjectItemInstance(project, "File", "e.foo", project.FullPath)); itemsByType.ImportItems(items); items = new List <ProjectItemInstance>(); items.Add(new ProjectItemInstance(project, "Doc", "a.doc", project.FullPath)); items.Add(new ProjectItemInstance(project, "Doc", "b.doc", project.FullPath)); items.Add(new ProjectItemInstance(project, "Doc", "c.doc", project.FullPath)); items.Add(new ProjectItemInstance(project, "Doc", "d.doc", project.FullPath)); items.Add(new ProjectItemInstance(project, "Doc", "e.doc", project.FullPath)); itemsByType.ImportItems(items); PropertyDictionary <ProjectPropertyInstance> properties = new PropertyDictionary <ProjectPropertyInstance>(); properties.Set(ProjectPropertyInstance.Create("UnitTests", "unittests.foo")); properties.Set(ProjectPropertyInstance.Create("OBJ", "obj")); List <ItemBucket> buckets = BatchingEngine.PrepareBatchingBuckets(parameters, CreateLookup(itemsByType, properties), MockElementLocation.Instance); Assert.Equal(5, buckets.Count); foreach (ItemBucket bucket in buckets) { // non-batching data -- same for all buckets XmlAttribute tempXmlAttribute = (new XmlDocument()).CreateAttribute("attrib"); tempXmlAttribute.Value = "'$(Obj)'=='obj'"; Assert.True(ConditionEvaluator.EvaluateCondition(tempXmlAttribute.Value, ParserOptions.AllowAll, bucket.Expander, ExpanderOptions.ExpandAll, Directory.GetCurrentDirectory(), MockElementLocation.Instance, null, new BuildEventContext(1, 2, 3, 4))); Assert.Equal("a.doc;b.doc;c.doc;d.doc;e.doc", bucket.Expander.ExpandIntoStringAndUnescape("@(doc)", ExpanderOptions.ExpandItems, MockElementLocation.Instance)); Assert.Equal("unittests.foo", bucket.Expander.ExpandIntoStringAndUnescape("$(bogus)$(UNITTESTS)", ExpanderOptions.ExpandPropertiesAndMetadata, MockElementLocation.Instance)); } Assert.Equal("a.foo", buckets[0].Expander.ExpandIntoStringAndUnescape("@(File)", ExpanderOptions.ExpandItems, MockElementLocation.Instance)); Assert.Equal(".foo", buckets[0].Expander.ExpandIntoStringAndUnescape("@(File->'%(Extension)')", ExpanderOptions.ExpandItems, MockElementLocation.Instance)); Assert.Equal("obj\\a.ext", buckets[0].Expander.ExpandIntoStringAndUnescape("$(obj)\\%(Filename).ext", ExpanderOptions.ExpandPropertiesAndMetadata, MockElementLocation.Instance)); // we weren't batching on this attribute, so it has no value Assert.Equal(String.Empty, buckets[0].Expander.ExpandIntoStringAndUnescape("%(Extension)", ExpanderOptions.ExpandAll, MockElementLocation.Instance)); ProjectItemInstanceFactory factory = new ProjectItemInstanceFactory(project, "i"); items = buckets[0].Expander.ExpandIntoItemsLeaveEscaped("@(file)", factory, ExpanderOptions.ExpandItems, MockElementLocation.Instance); Assert.NotNull(items); Assert.Equal(1, items.Count); int invalidProjectFileExceptions = 0; try { // This should throw because we don't allow item lists to be concatenated // with other strings. bool throwAway; items = buckets[0].Expander.ExpandSingleItemVectorExpressionIntoItems("@(file)$(unitests)", factory, ExpanderOptions.ExpandItems, false /* no nulls */, out throwAway, MockElementLocation.Instance); } catch (InvalidProjectFileException ex) { // check we don't lose error codes from IPFE's during build Assert.Equal(ex.ErrorCode, "MSB4012"); invalidProjectFileExceptions++; } // We do allow separators in item vectors, this results in an item group with a single flattened item items = buckets[0].Expander.ExpandIntoItemsLeaveEscaped("@(file, ',')", factory, ExpanderOptions.ExpandItems, MockElementLocation.Instance); Assert.NotNull(items); Assert.Equal(1, items.Count); Assert.Equal("a.foo", items[0].EvaluatedInclude); Assert.Equal(1, invalidProjectFileExceptions); }
public void GetBuckets() { List <string> parameters = new List <string>(); parameters.Add("@(File);$(unittests)"); parameters.Add("$(obj)\\%(Filename).ext"); parameters.Add("@(File->'%(extension)')"); // attributes in transforms don't affect batching Hashtable itemsByType = new Hashtable(StringComparer.OrdinalIgnoreCase); BuildItemGroup items = new BuildItemGroup(); items.AddNewItem("File", "a.foo"); items.AddNewItem("File", "b.foo"); items.AddNewItem("File", "c.foo"); items.AddNewItem("File", "d.foo"); items.AddNewItem("File", "e.foo"); itemsByType["FILE"] = items; items = new BuildItemGroup(); items.AddNewItem("Doc", "a.doc"); items.AddNewItem("Doc", "b.doc"); items.AddNewItem("Doc", "c.doc"); items.AddNewItem("Doc", "d.doc"); items.AddNewItem("Doc", "e.doc"); itemsByType["DOC"] = items; BuildPropertyGroup properties = new BuildPropertyGroup(); properties.SetProperty("UnitTests", "unittests.foo"); properties.SetProperty("OBJ", "obj"); ArrayList buckets = BatchingEngine.PrepareBatchingBuckets(new XmlDocument().CreateElement("Foo"), parameters, CreateLookup(itemsByType, properties)); Assertion.AssertEquals(5, buckets.Count); foreach (ItemBucket bucket in buckets) { // non-batching data -- same for all buckets XmlAttribute tempXmlAttribute = (new XmlDocument()).CreateAttribute("attrib"); tempXmlAttribute.Value = "'$(Obj)'=='obj'"; Assertion.Assert(BuildEngine.Utilities.EvaluateCondition(tempXmlAttribute.Value, tempXmlAttribute, bucket.Expander, null, ParserOptions.AllowAll, null, null)); Assertion.AssertEquals("a.doc;b.doc;c.doc;d.doc;e.doc", ExpandItemsIntoString(bucket, "@(doc)")); Assertion.AssertEquals("unittests.foo", ExpandMetadataAndProperties(bucket, "$(bogus)$(UNITTESTS)")); } Assertion.AssertEquals("a.foo", ExpandItemsIntoString((ItemBucket)buckets[0], "@(File)")); Assertion.AssertEquals(".foo", ExpandItemsIntoString((ItemBucket)buckets[0], "@(File->'%(Extension)')")); Assertion.AssertEquals("obj\\a.ext", ExpandMetadataAndProperties((ItemBucket)buckets[0], "$(obj)\\%(Filename).ext")); // we weren't batching on this attribute, so it has no value Assertion.AssertEquals(String.Empty, ExpandMetadataAndProperties((ItemBucket)buckets[0], "%(Extension)")); items = ((ItemBucket)buckets[0]).Expander.ExpandSingleItemListExpressionIntoItemsLeaveEscaped("@(file)", null); Assertion.AssertNotNull(items); Assertion.AssertEquals(1, items.Count); int invalidProjectFileExceptions = 0; try { // This should throw because we don't allow item lists to be concatenated // with other strings. items = ((ItemBucket)buckets[0]).Expander.ExpandSingleItemListExpressionIntoItemsLeaveEscaped("@(file);$(unitests)", null); } catch (InvalidProjectFileException) { invalidProjectFileExceptions++; } // We do allow separators in item vectors, this results in an item group with a single flattened item items = ((ItemBucket)buckets[0]).Expander.ExpandSingleItemListExpressionIntoItemsLeaveEscaped("@(file, ',')", null); Assertion.AssertNotNull(items); Assertion.AssertEquals(1, items.Count); Assertion.AssertEquals("a.foo", items[0].FinalItemSpec); Assertion.AssertEquals(1, invalidProjectFileExceptions); }