private void CloneAndAddInternal(ProjectRootElement sourceProject) { bool externalSource = sourceProject != null; var projectPair = GetNewInMemoryProject("Clone", TestCollectionGroup.BigProjectFile); var xmlPair = new ProjectXmlPair(projectPair); Assert.True(xmlPair.View.HasUnsavedChanges); xmlPair.View.Save(); Assert.False(xmlPair.View.HasUnsavedChanges); sourceProject = sourceProject ?? xmlPair.View; // var existingItemGroup1 = sourceProject.QuerySingleChildrenWithValidation<ProjectItemGroupElement>((ig) => ig.Label == "Group1"); var existingItemGroupList = sourceProject.AllChildren.OfType <ProjectItemGroupElement>().Where(((ig) => ig.Label == "Group1")).ToList(); Assert.Single(existingItemGroupList); var existingItemGroup = existingItemGroupList[0]; var cloned = (ProjectItemGroupElement)existingItemGroup.Clone(); Assert.NotSame(cloned, existingItemGroup); Assert.False(sourceProject.HasUnsavedChanges); var sourceIsALink = ViewValidation.IsLinkedObject(sourceProject); ViewValidation.VerifyNotNull(cloned, sourceIsALink); if (externalSource) { Assert.ThrowsAny <InvalidOperationException>(() => xmlPair.View.AppendChild(cloned)); } else { var clonedPair = xmlPair.CreateFromView(cloned); xmlPair.QueryChildrenWithValidation <ProjectItemGroupElement>((ig) => ig == cloned || ig == clonedPair.Real, 0); xmlPair.View.AppendChild(cloned); Assert.True(xmlPair.View.HasUnsavedChanges); Assert.True(xmlPair.Real.HasUnsavedChanges); clonedPair.VerifySame(xmlPair.QuerySingleChildrenWithValidation <ProjectItemGroupElement>((ig) => ig == clonedPair.View || ig == clonedPair.Real)); xmlPair.QueryChildrenWithValidation <ProjectItemGroupElement>((ig) => ig.Label == "Group1", 2); clonedPair.VerifySetter("Group2", (g) => g.Label, (g, v) => g.Label = v); xmlPair.Verify(); Assert.Equal("Group1", existingItemGroup.Label); } }
public void ProjectRootElementModify() { var pair = GetNewInMemoryProject("temp.prj"); var xmlPair = new ProjectXmlPair(pair); xmlPair.VerifySetter(this.StdGroup.Disk.GetAbsolutePath("tempRenamed"), (p) => p.FullPath, (p, v) => p.FullPath = v); xmlPair.VerifySetter("build", (p) => p.DefaultTargets, (p, v) => p.DefaultTargets = v); xmlPair.VerifySetter("init", (p) => p.InitialTargets, (p, v) => p.InitialTargets = v); xmlPair.VerifySetter("YetAnotherSDK", (p) => p.Sdk, (p, v) => p.Sdk = v); xmlPair.VerifySetter("NonLocalProp", (p) => p.TreatAsLocalProperty, (p, v) => p.TreatAsLocalProperty = v); xmlPair.VerifySetter("xmakever", (p) => p.ToolsVersion, (p, v) => p.ToolsVersion = v); // Check PRE's Add"Foo" functionality. // grab some creation data var newImport = this.StdGroup.Disk.GetAbsolutePath("import"); var newItem = this.StdGroup.Disk.GetAbsolutePath("newfile.cpp"); var newItemWithMetadata = this.StdGroup.Disk.GetAbsolutePath("newfile2.cpp"); List <KeyValuePair <string, string> > itemMetadata = new List <KeyValuePair <string, string> >() { new KeyValuePair <string, string>("m1", "v1"), new KeyValuePair <string, string>("m2", "v2"), new KeyValuePair <string, string>("m3", "v3"), }; // Imports xmlPair.Add2NewChildrenWithVerify <ProjectImportElement>(newImport, (p, i) => p.AddImport(i), (pi, i) => pi.Project == i, out var import1, out var import2); xmlPair.Add2NewLabeledChildrenWithVerify <ProjectImportGroupElement>("ImportGroupLabel", (p, l) => p.AddImportGroup(), out var importGroup1, out var importGroup2); // Items xmlPair.Add2NewChildrenWithVerify <ProjectItemElement>(newItem, (p, i) => p.AddItem("cpp", i), (pi, i) => pi.Include == i, out var item1, out var item2); xmlPair.Add2NewChildrenWithVerify <ProjectItemElement>(newItemWithMetadata, (p, i) => p.AddItem("cpp", i, itemMetadata), (pi, i) => pi.Include == i, out var itemWithMetadata1, out var itemWithMetadata2); ViewValidation.VerifyMetadata(itemMetadata, (k) => itemWithMetadata1.View.Metadata.Where((md) => md.Name == k).FirstOrDefault().Value); xmlPair.Add2NewLabeledChildrenWithVerify <ProjectItemGroupElement>("ItemGroup", (p, l) => p.AddItemGroup(), out var itemGroup1, out var itemGroup2); // ItemDefs xmlPair.Add2NewChildrenWithVerify <ProjectItemDefinitionElement>("cpp", (p, it) => p.AddItemDefinition(it), (pi, it) => pi.ItemType == it, out var itemDefinition1, out var itemDefinition2); xmlPair.Add2NewLabeledChildrenWithVerify <ProjectItemDefinitionGroupElement>("ItemDefGroup", (p, l) => p.AddItemDefinitionGroup(), out var itemDefinitionGroup1, out var itemDefinitionGroup2); // Property xmlPair.Add2NewChildrenWithVerify <ProjectPropertyElement>("NewProp", (p, pn) => p.AddProperty(pn, $"Value{pn}"), (prop, pn) => prop.Name == pn, out var itemProp1, out var itemProp2); xmlPair.Add2NewLabeledChildrenWithVerify <ProjectPropertyGroupElement>("NewPropGroup", (p, l) => p.AddPropertyGroup(), out var itemPropretyGroup1, out var itemPropretyGroup2); // Target & Tasks xmlPair.Add2NewChildrenWithVerify <ProjectTargetElement>("NewTarget", (p, n) => p.AddTarget(n), (t, n) => string.Equals(t.Name, n), out var newTarget1, out var newTarget2); xmlPair.Add2NewChildrenWithVerify <ProjectUsingTaskElement>("NewUsingTaskFile", (p, n) => p.AddUsingTask(n, "assemblyFile", null), (ut, n) => ut.TaskName == n, out var newUsinTaskFile1, out var newUsingTaskFile2); xmlPair.Add2NewChildrenWithVerify <ProjectUsingTaskElement>("NewUsingTaskName", (p, n) => p.AddUsingTask(n, null, "assemblyName"), (ut, n) => ut.TaskName == n, out var newUsinTaskName1, out var newUsingTaskName2); // loose create new element check. xmlPair.CreateWithVerify <ProjectChooseElement>((p) => p.CreateChooseElement()); xmlPair.CreateWithVerify <ProjectImportElement>((p) => p.CreateImportElement("fooImport")); xmlPair.CreateWithVerify <ProjectImportGroupElement>((p) => p.CreateImportGroupElement()); xmlPair.CreateWithVerify <ProjectItemDefinitionElement>((p) => p.CreateItemDefinitionElement("creteItemType")); xmlPair.CreateWithVerify <ProjectItemDefinitionGroupElement>((p) => p.CreateItemDefinitionGroupElement()); xmlPair.CreateWithVerify <ProjectItemElement>((p) => p.CreateItemElement("itemType")); xmlPair.CreateWithVerify <ProjectItemElement>((p) => p.CreateItemElement("itemType", "include")); xmlPair.CreateWithVerify <ProjectItemGroupElement>((p) => p.CreateItemGroupElement()); xmlPair.CreateWithVerify <ProjectMetadataElement>((p) => p.CreateMetadataElement("metadataName")); xmlPair.CreateWithVerify <ProjectMetadataElement>((p) => p.CreateMetadataElement("metadataName1", "value")); xmlPair.CreateWithVerify <ProjectOnErrorElement>((p) => p.CreateOnErrorElement("target")); xmlPair.CreateWithVerify <ProjectOtherwiseElement>((p) => p.CreateOtherwiseElement()); xmlPair.CreateWithVerify <ProjectOutputElement>((p) => p.CreateOutputElement("taskParam", "itemType", null)); xmlPair.CreateWithVerify <ProjectOutputElement>((p) => p.CreateOutputElement("taskParam", null, "propName")); xmlPair.CreateWithVerify <ProjectExtensionsElement>((p) => p.CreateProjectExtensionsElement()); xmlPair.CreateWithVerify <ProjectSdkElement>((p) => p.CreateProjectSdkElement("sdkkk", "verrr")); xmlPair.CreateWithVerify <ProjectPropertyElement>((p) => p.CreatePropertyElement("name")); xmlPair.CreateWithVerify <ProjectPropertyGroupElement>((p) => p.CreatePropertyGroupElement()); xmlPair.CreateWithVerify <ProjectTargetElement>((p) => p.CreateTargetElement("target")); xmlPair.CreateWithVerify <ProjectTaskElement>((p) => p.CreateTaskElement("task")); xmlPair.CreateWithVerify <ProjectUsingTaskBodyElement>((p) => p.CreateUsingTaskBodyElement("eval", "body")); xmlPair.CreateWithVerify <ProjectUsingTaskElement>((p) => p.CreateUsingTaskElement("taskName", "file", null)); xmlPair.CreateWithVerify <ProjectUsingTaskElement>((p) => p.CreateUsingTaskElement("taskName", null, "name")); xmlPair.CreateWithVerify <ProjectUsingTaskElement>((p) => p.CreateUsingTaskElement("taskName", "file", null, "runtime", "arch")); xmlPair.CreateWithVerify <ProjectUsingTaskElement>((p) => p.CreateUsingTaskElement("taskName", null, "name", "runtime", "arch")); xmlPair.CreateWithVerify <ProjectUsingTaskParameterElement>((p) => p.CreateUsingTaskParameterElement("name", "output", "required", "paramType")); xmlPair.CreateWithVerify <UsingTaskParameterGroupElement>((p) => p.CreateUsingTaskParameterGroupElement()); xmlPair.CreateWithVerify <ProjectWhenElement>((p) => p.CreateWhenElement("condition")); // DeepClone var clone = xmlPair.View.DeepClone(); ViewValidation.IsLinkedObject(clone); Assert.NotSame(clone, xmlPair.View); Assert.True(string.IsNullOrEmpty(clone.FullPath)); }