public async void ConfigurationProjectConfigurationDimensionProvider_OnDimensionValueChanged_Add() { using (var projectFile = new MsBuildProjectFile(projectXml)) { IProjectXmlAccessor _projectXmlAccessor = IProjectXmlAccessorFactory.Create(projectFile.Project); var provider = new ConfigurationProjectConfigurationDimensionProvider(_projectXmlAccessor); var unconfiguredProject = UnconfiguredProjectFactory.Create(filePath: projectFile.Filename); // On ChangeEventStage.After nothing should be changed ProjectConfigurationDimensionValueChangedEventArgs args = new ProjectConfigurationDimensionValueChangedEventArgs( unconfiguredProject, ConfigurationDimensionChange.Add, ChangeEventStage.After, ConfigurationGeneral.ConfigurationProperty, "CustomConfig"); await provider.OnDimensionValueChangedAsync(args); var property = BuildUtilities.GetProperty(projectFile.Project, Configurations); Assert.NotNull(property); Assert.Equal("Debug;Release;CustomConfiguration", property.Value); // On ChangeEventStage.Before the property should be added args = new ProjectConfigurationDimensionValueChangedEventArgs( unconfiguredProject, ConfigurationDimensionChange.Add, ChangeEventStage.Before, ConfigurationGeneral.ConfigurationProperty, "CustomConfig"); await provider.OnDimensionValueChangedAsync(args); property = BuildUtilities.GetProperty(projectFile.Project, Configurations); Assert.NotNull(property); Assert.Equal("Debug;Release;CustomConfiguration;CustomConfig", property.Value); } }
public async Task PlatformProjectConfigurationDimensionProvider_OnDimensionValueChanged_Remove() { var project = ProjectRootElementFactory.Create(projectXml); var projectXmlAccessor = IProjectXmlAccessorFactory.Create(project); var provider = new PlatformProjectConfigurationDimensionProvider(projectXmlAccessor); var unconfiguredProject = UnconfiguredProjectFactory.Create(); // On ChangeEventStage.After nothing should be changed var args = new ProjectConfigurationDimensionValueChangedEventArgs( unconfiguredProject, ConfigurationDimensionChange.Delete, ChangeEventStage.After, ConfigurationGeneral.PlatformProperty, "x86"); await provider.OnDimensionValueChangedAsync(args); var property = BuildUtilities.GetProperty(project, Platforms); Assert.NotNull(property); Assert.Equal("AnyCPU;x64;x86", property.Value); // On ChangeEventStage.Before the property should be removed args = new ProjectConfigurationDimensionValueChangedEventArgs( unconfiguredProject, ConfigurationDimensionChange.Delete, ChangeEventStage.Before, ConfigurationGeneral.PlatformProperty, "x86"); await provider.OnDimensionValueChangedAsync(args); property = BuildUtilities.GetProperty(project, Platforms); Assert.NotNull(property); Assert.Equal("AnyCPU;x64", property.Value); }
public async Task OnDimensionValueChanged_Rename_UnknownValue() { string projectXml = "" " <Project> <PropertyGroup> <PROP>A;B;C</PROP> </PropertyGroup> </Project> " ""; var rootElement = ProjectRootElementFactory.Create(projectXml.Replace("PROP", PropertyName)); var projectAccessor = IProjectAccessorFactory.Create(rootElement); var configuredProject = ConfiguredProjectFactory.Create(); var provider = CreateInstance(projectAccessor); var project = UnconfiguredProjectFactory.Create(configuredProject: configuredProject); var args = new ProjectConfigurationDimensionValueChangedEventArgs( project, ConfigurationDimensionChange.Rename, ChangeEventStage.After, DimensionName, "Renamed", "Unknown"); await Assert.ThrowsAsync <ArgumentException>(() => provider.OnDimensionValueChangedAsync(args)); var property = BuildUtilities.GetProperty(rootElement, PropertyName); Assert.NotNull(property); Assert.Equal("A;B;C", property.Value); }
/// <summary> /// Modifies the project when there's a platform change. /// </summary> /// <param name="args">Information about the configuration dimension value change.</param> /// <returns>A task for the async operation.</returns> public override async Task OnDimensionValueChangedAsync(ProjectConfigurationDimensionValueChangedEventArgs args) { if (StringComparers.ConfigurationDimensionNames.Equals(args.DimensionName, DimensionName)) { if (args.Stage == ChangeEventStage.Before) { switch (args.Change) { case ConfigurationDimensionChange.Add: await OnPlatformAddedAsync(args.Project, args.DimensionValue).ConfigureAwait(false); break; case ConfigurationDimensionChange.Delete: await OnPlatformDeletedAsync(args.Project, args.DimensionValue).ConfigureAwait(false); break; case ConfigurationDimensionChange.Rename: // Platform doesn't currently supports rename, this should never be called. break; } } } }
public async Task OnDimensionValueChanged_Add() { var project = ProjectRootElementFactory.Create(projectXml); var projectXmlAccessor = IProjectXmlAccessorFactory.Create(project); var provider = new ConfigurationProjectConfigurationDimensionProvider(projectXmlAccessor); var unconfiguredProject = UnconfiguredProjectFactory.Create(); // On ChangeEventStage.After nothing should be changed var args = new ProjectConfigurationDimensionValueChangedEventArgs( unconfiguredProject, ConfigurationDimensionChange.Add, ChangeEventStage.After, ConfigurationGeneral.ConfigurationProperty, "CustomConfig"); await provider.OnDimensionValueChangedAsync(args); var property = BuildUtilities.GetProperty(project, Configurations); Assert.NotNull(property); Assert.Equal("Debug;Release;CustomConfiguration", property.Value); // On ChangeEventStage.Before the property should be added args = new ProjectConfigurationDimensionValueChangedEventArgs( unconfiguredProject, ConfigurationDimensionChange.Add, ChangeEventStage.Before, ConfigurationGeneral.ConfigurationProperty, "CustomConfig"); await provider.OnDimensionValueChangedAsync(args); property = BuildUtilities.GetProperty(project, Configurations); Assert.NotNull(property); Assert.Equal("Debug;Release;CustomConfiguration;CustomConfig", property.Value); }
/// <summary> /// Modifies the project when there's a configuration change. /// </summary> /// <param name="args">Information about the configuration dimension value change.</param> /// <returns>A task for the async operation.</returns> public override async Task OnDimensionValueChangedAsync(ProjectConfigurationDimensionValueChangedEventArgs args) { if (StringComparers.ConfigurationDimensionNames.Equals(args.DimensionName, DimensionName)) { if (args.Stage == ChangeEventStage.Before) { switch (args.Change) { case ConfigurationDimensionChange.Add: await OnConfigurationAddedAsync(args.Project, args.DimensionValue).ConfigureAwait(true); break; case ConfigurationDimensionChange.Delete: await OnConfigurationRemovedAsync(args.Project, args.DimensionValue).ConfigureAwait(true); break; case ConfigurationDimensionChange.Rename: // Need to wait until the core rename changes happen before renaming the property. break; } } else if (args.Stage == ChangeEventStage.After) { // Only change that needs to be handled here is renaming configurations which needs to happen after all // of the core changes to rename existing conditions have executed. if (args.Change == ConfigurationDimensionChange.Rename) { await OnConfigurationRenamedAsync(args.Project, args.OldDimensionValue, args.DimensionValue).ConfigureAwait(true); } } } }
public async Task PlatformProjectConfigurationDimensionProvider_OnDimensionValueChanged_Add() { using (var projectFile = new MsBuildProjectFile(projectXml)) { IProjectXmlAccessor _projectXmlAccessor = IProjectXmlAccessorFactory.Create(projectFile.Project); var provider = new PlatformProjectConfigurationDimensionProvider(_projectXmlAccessor); var unconfiguredProject = UnconfiguredProjectFactory.Create(filePath: projectFile.Filename); // On ChangeEventStage.After nothing should be changed var args = new ProjectConfigurationDimensionValueChangedEventArgs( unconfiguredProject, ConfigurationDimensionChange.Add, ChangeEventStage.After, ConfigurationGeneral.PlatformProperty, "ARM"); await provider.OnDimensionValueChangedAsync(args); var property = BuildUtilities.GetProperty(projectFile.Project, Platforms); Assert.NotNull(property); Assert.Equal("AnyCPU;x64;x86", property.Value); // On ChangeEventStage.Before the property should be added args = new ProjectConfigurationDimensionValueChangedEventArgs( unconfiguredProject, ConfigurationDimensionChange.Add, ChangeEventStage.Before, ConfigurationGeneral.PlatformProperty, "ARM"); await provider.OnDimensionValueChangedAsync(args); property = BuildUtilities.GetProperty(projectFile.Project, Platforms); Assert.NotNull(property); Assert.Equal("AnyCPU;x64;x86;ARM", property.Value); } }
/// <summary> /// Modifies the project when there's a configuration change. /// </summary> /// <param name="args">Information about the configuration dimension value change.</param> /// <returns>A task for the async operation.</returns> public Task OnDimensionValueChangedAsync(ProjectConfigurationDimensionValueChangedEventArgs args) { if (StringComparers.ConfigurationDimensionNames.Equals(args.DimensionName, DimensionName)) { if (args.Stage == ChangeEventStage.Before) { switch (args.Change) { case ConfigurationDimensionChange.Add: return(UpdateUnderLockAsync(args.Project, (msbuildProject, evaluatedPropertyValue) => BuildUtilities.AppendPropertyValue(msbuildProject, evaluatedPropertyValue, PropertyName, args.DimensionValue))); case ConfigurationDimensionChange.Delete: return(UpdateUnderLockAsync(args.Project, (msbuildProject, evaluatedPropertyValue) => BuildUtilities.RemovePropertyValue(msbuildProject, evaluatedPropertyValue, PropertyName, args.DimensionValue))); case ConfigurationDimensionChange.Rename: // Need to wait until the core rename changes happen before renaming the property. break; } } else if (args.Stage == ChangeEventStage.After) { // Only change that needs to be handled here is renaming configurations which needs to happen after all // of the core changes to rename existing conditions have executed. if (args.Change == ConfigurationDimensionChange.Rename) { return(UpdateUnderLockAsync(args.Project, (msbuildProject, evaluatedPropertyValue) => BuildUtilities.RenamePropertyValue(msbuildProject, evaluatedPropertyValue, PropertyName, args.OldDimensionValue, args.DimensionValue))); } } } return(Task.CompletedTask); async Task UpdateUnderLockAsync(UnconfiguredProject project, Action <ProjectRootElement, string> action) { ConfiguredProject?configuredProject = await project.GetSuggestedConfiguredProjectAsync(); Assumes.NotNull(configuredProject); await ProjectAccessor.OpenProjectForUpgradeableReadAsync(configuredProject, evaluatedProject => { string evaluatedPropertyValue = evaluatedProject.GetPropertyValue(PropertyName); return(ProjectAccessor.OpenProjectXmlForWriteAsync(project, msbuildProject => { action(msbuildProject, evaluatedPropertyValue); })); }); } }
public async Task OnDimensionValueChanged_Rename() { string projectXml = "" " <Project> <PropertyGroup> <PROP>A;B;C</PROP> </PropertyGroup> </Project> " ""; var rootElement = ProjectRootElementFactory.Create(projectXml.Replace("PROP", PropertyName)); var projectAccessor = IProjectAccessorFactory.Create(rootElement); var configuredProject = ConfiguredProjectFactory.Create(); var provider = CreateInstance(projectAccessor); var project = UnconfiguredProjectFactory.Create(configuredProject: configuredProject); // On ChangeEventStage.Before nothing should be changed var args = new ProjectConfigurationDimensionValueChangedEventArgs( project, ConfigurationDimensionChange.Rename, ChangeEventStage.Before, DimensionName, "Renamed", "B"); await provider.OnDimensionValueChangedAsync(args); var property = BuildUtilities.GetProperty(rootElement, PropertyName); Assert.NotNull(property); Assert.Equal("A;B;C", property.Value); // On ChangeEventStage.Before the property should be renamed args = new ProjectConfigurationDimensionValueChangedEventArgs( project, ConfigurationDimensionChange.Rename, ChangeEventStage.After, DimensionName, "Renamed", "B"); await provider.OnDimensionValueChangedAsync(args); property = BuildUtilities.GetProperty(rootElement, PropertyName); Assert.NotNull(property); Assert.Equal("A;Renamed;C", property.Value); }
public async Task OnDimensionValueChanged_Remove_MissingValue() { var project = ProjectRootElementFactory.Create(projectXml); var projectXmlAccessor = IProjectXmlAccessorFactory.Create(project); var provider = new ConfigurationProjectConfigurationDimensionProvider(projectXmlAccessor); var unconfiguredProject = UnconfiguredProjectFactory.Create(); var args = new ProjectConfigurationDimensionValueChangedEventArgs( unconfiguredProject, ConfigurationDimensionChange.Delete, ChangeEventStage.Before, ConfigurationGeneral.ConfigurationProperty, "NonExistantConfiguration"); await Assert.ThrowsAsync <ArgumentException>(() => provider.OnDimensionValueChangedAsync(args)); var property = BuildUtilities.GetProperty(project, Configurations); Assert.NotNull(property); Assert.Equal("Debug;Release;CustomConfiguration", property.Value); }
public async Task OnDimensionValueChanged(ConfigurationDimensionChange change, ChangeEventStage stage) { // No changes should happen for TFM so verify that the property is the same before and after var project = ProjectRootElementFactory.Create(ProjectXmlTFMs); var projectXmlAccessor = IProjectXmlAccessorFactory.Create(project); var provider = new TargetFrameworkProjectConfigurationDimensionProvider(projectXmlAccessor); var unconfiguredProject = UnconfiguredProjectFactory.Create(); var property = BuildUtilities.GetProperty(project, ConfigurationGeneral.TargetFrameworksProperty); string expectedTFMs = property.Value; var args = new ProjectConfigurationDimensionValueChangedEventArgs( unconfiguredProject, change, stage, ConfigurationGeneral.TargetFrameworkProperty, "NewTFM"); await provider.OnDimensionValueChangedAsync(args); Assert.NotNull(property); Assert.Equal(expectedTFMs, property.Value); }
public async void ConfigurationProjectConfigurationDimensionProvider_OnDimensionValueChanged_Rename_MissingValue() { using (var projectFile = new MsBuildProjectFile(projectXml)) { IProjectXmlAccessor _projectXmlAccessor = IProjectXmlAccessorFactory.Create(projectFile.Project); var provider = new ConfigurationProjectConfigurationDimensionProvider(_projectXmlAccessor); var unconfiguredProject = UnconfiguredProjectFactory.Create(filePath: projectFile.Filename); ProjectConfigurationDimensionValueChangedEventArgs args = new ProjectConfigurationDimensionValueChangedEventArgs( unconfiguredProject, ConfigurationDimensionChange.Rename, ChangeEventStage.After, ConfigurationGeneral.ConfigurationProperty, "RenamedConfiguration", "NonExistantConfiguration"); await Assert.ThrowsAsync <ArgumentException>(() => provider.OnDimensionValueChangedAsync(args)); var property = BuildUtilities.GetProperty(projectFile.Project, Configurations); Assert.NotNull(property); Assert.Equal("Debug;Release;CustomConfiguration", property.Value); } }
public async Task PlatformProjectConfigurationDimensionProvider_OnDimensionValueChanged_Rename() { var rootElement = ProjectRootElementFactory.Create(projectXml); var projectAccessor = IProjectAccessorFactory.Create(rootElement); var provider = new PlatformProjectConfigurationDimensionProvider(projectAccessor); var project = UnconfiguredProjectFactory.Create(); // Nothing should happen on platform rename as it's unsupported var args = new ProjectConfigurationDimensionValueChangedEventArgs( project, ConfigurationDimensionChange.Rename, ChangeEventStage.Before, ConfigurationGeneral.PlatformProperty, "RenamedPlatform", "x86"); await provider.OnDimensionValueChangedAsync(args); var property = BuildUtilities.GetProperty(rootElement, Platforms); Assert.NotNull(property); Assert.Equal("AnyCPU;x64;x86", property.Value); // On ChangeEventStage.Before the property should be renamed args = new ProjectConfigurationDimensionValueChangedEventArgs( project, ConfigurationDimensionChange.Rename, ChangeEventStage.After, ConfigurationGeneral.PlatformProperty, "RenamedPlatform", "x86"); await provider.OnDimensionValueChangedAsync(args); property = BuildUtilities.GetProperty(rootElement, Platforms); Assert.NotNull(property); Assert.Equal("AnyCPU;x64;x86", property.Value); }
public async void PlatformProjectConfigurationDimensionProvider_OnDimensionValueChanged_Rename() { using (var projectFile = new MsBuildProjectFile(projectXml)) { IProjectXmlAccessor _projectXmlAccessor = IProjectXmlAccessorFactory.Create(projectFile.Project); var provider = new PlatformProjectConfigurationDimensionProvider(_projectXmlAccessor); var unconfiguredProject = UnconfiguredProjectFactory.Create(filePath: projectFile.Filename); // Nothing should happen on platform rename as it's unsupported ProjectConfigurationDimensionValueChangedEventArgs args = new ProjectConfigurationDimensionValueChangedEventArgs( unconfiguredProject, ConfigurationDimensionChange.Rename, ChangeEventStage.Before, ConfigurationGeneral.PlatformProperty, "RenamedPlatform", "x86"); await provider.OnDimensionValueChangedAsync(args); var property = BuildUtilities.GetProperty(projectFile.Project, Platforms); Assert.NotNull(property); Assert.Equal("AnyCPU;x64;x86", property.Value); // On ChangeEventStage.Before the property should be renamed args = new ProjectConfigurationDimensionValueChangedEventArgs( unconfiguredProject, ConfigurationDimensionChange.Rename, ChangeEventStage.After, ConfigurationGeneral.PlatformProperty, "RenamedPlatform", "x86"); await provider.OnDimensionValueChangedAsync(args); property = BuildUtilities.GetProperty(projectFile.Project, Platforms); Assert.NotNull(property); Assert.Equal("AnyCPU;x64;x86", property.Value); } }
/// <summary> /// Modifies the project when there's a configuration change. /// </summary> /// <param name="args">Information about the configuration dimension value change.</param> /// <returns>A task for the async operation.</returns> /// From <see cref="IProjectConfigurationDimensionsProvider2"/>. public abstract Task OnDimensionValueChangedAsync(ProjectConfigurationDimensionValueChangedEventArgs args);
public override Task OnDimensionValueChangedAsync(ProjectConfigurationDimensionValueChangedEventArgs args) { // CPS cannot change TargetFramework currently so don't do anything for the dimension return(Task.CompletedTask); }