From 70062d3b2ba64517aaed56720b15fb1fbed31384 Mon Sep 17 00:00:00 2001 From: Gabriela Trutan Date: Thu, 18 Sep 2025 09:57:31 +0200 Subject: [PATCH 1/2] Adapt converter to be more generic and to be able to search for any DarawingImage not only for DependencyRiskImpactSeverity --- ...mpactSeverityToImageSourceConverterTest.cs | 10 +++- ...iskImpactSeverityToImageSourceConverter.cs | 51 ++++++++++--------- .../ReportView/ReportViewControl.xaml | 2 +- 3 files changed, 38 insertions(+), 25 deletions(-) diff --git a/src/IssueViz.Security.UnitTests/DependencyRisks/DependencyRiskImpactSeverityToImageSourceConverterTest.cs b/src/IssueViz.Security.UnitTests/DependencyRisks/DependencyRiskImpactSeverityToImageSourceConverterTest.cs index 7c856315c1..862fe37429 100644 --- a/src/IssueViz.Security.UnitTests/DependencyRisks/DependencyRiskImpactSeverityToImageSourceConverterTest.cs +++ b/src/IssueViz.Security.UnitTests/DependencyRisks/DependencyRiskImpactSeverityToImageSourceConverterTest.cs @@ -80,12 +80,20 @@ public void Convert_ReturnsResourceForSeverity(DependencyRiskImpactSeverity seve var expectedResource = new Style(); resourceFinder.TryFindResource(uiElement, $"{severity}SeverityDrawingImage").Returns(expectedResource); - var result = testSubject.Convert([severity, uiElement, resourceFinder], null, null, CultureInfo.InvariantCulture); + var result = testSubject.Convert([severity, uiElement, resourceFinder], null, "Severity", CultureInfo.InvariantCulture); resourceFinder.Received(1).TryFindResource(uiElement, $"{severity}SeverityDrawingImage"); result.Should().Be(expectedResource); } + [TestMethod] + public void Convert_ParameterNotProvided_SearchesForResource() + { + testSubject.Convert([DependencyRiskImpactSeverity.Blocker, uiElement, resourceFinder], null, null, CultureInfo.InvariantCulture); + + resourceFinder.Received(1).TryFindResource(uiElement, $"{DependencyRiskImpactSeverity.Blocker}DrawingImage"); + } + [TestMethod] public void ConvertBack_ThrowsException() { diff --git a/src/IssueViz.Security/DependencyRisks/DependencyRiskImpactSeverityToImageSourceConverter.cs b/src/IssueViz.Security/DependencyRisks/DependencyRiskImpactSeverityToImageSourceConverter.cs index 53634f82ee..91b0256b1e 100644 --- a/src/IssueViz.Security/DependencyRisks/DependencyRiskImpactSeverityToImageSourceConverter.cs +++ b/src/IssueViz.Security/DependencyRisks/DependencyRiskImpactSeverityToImageSourceConverter.cs @@ -22,34 +22,39 @@ using System.Windows; using System.Windows.Data; using System.Windows.Media; -using SonarLint.VisualStudio.Core.Analysis; -namespace SonarLint.VisualStudio.IssueVisualization.Security.DependencyRisks +namespace SonarLint.VisualStudio.IssueVisualization.Security.DependencyRisks; + +/// +/// Tries to find a DrawingImage resource based on the pattern [EnumValue][CustomSuffix]DrawingImage. +/// The enum value should be provided as the first binding value. +/// The FrameworkElement used to find the resource should be provided as the second binding value. +/// The IResourceFinder used to find the resource should be provided as the third binding value. +/// A custom suffix can be provided as a converter parameter. +/// +[ValueConversion(typeof(Enum), typeof(ImageSource))] +public class DependencyRiskImpactSeverityToImageSourceConverter : IMultiValueConverter { - [ValueConversion(typeof(DependencyRiskImpactSeverity), typeof(ImageSource))] - public class DependencyRiskImpactSeverityToImageSourceConverter : IMultiValueConverter - { - private const string Suffix = "SeverityDrawingImage"; + private const string Suffix = "DrawingImage"; - public object Convert( - object[] values, - Type targetType, - object parameter, - CultureInfo culture) + public object Convert( + object[] values, + Type targetType, + object parameter, + CultureInfo culture) + { + if (values.Length < 3 || values[0] is not Enum enumValue || values[1] is not FrameworkElement element || values[2] is not IResourceFinder resourceFinder) { - if (values.Length < 3 || values[0] is not DependencyRiskImpactSeverity severity || values[1] is not FrameworkElement element || values[2] is not IResourceFinder resourceFinder) - { - return null; - } - - return resourceFinder.TryFindResource(element, $"{severity}{Suffix}"); + return null; } - public object[] ConvertBack( - object value, - Type[] targetTypes, - object parameter, - CultureInfo culture) => - throw new NotImplementedException(); + return resourceFinder.TryFindResource(element, $"{enumValue}{parameter}{Suffix}"); } + + public object[] ConvertBack( + object value, + Type[] targetTypes, + object parameter, + CultureInfo culture) => + throw new NotImplementedException(); } diff --git a/src/IssueViz.Security/ReportView/ReportViewControl.xaml b/src/IssueViz.Security/ReportView/ReportViewControl.xaml index 2b57c04fb6..e9cb9ea131 100644 --- a/src/IssueViz.Security/ReportView/ReportViewControl.xaml +++ b/src/IssueViz.Security/ReportView/ReportViewControl.xaml @@ -265,7 +265,7 @@ + Converter="{StaticResource DependencyRiskImpactSeverityToImageSourceConverter}" ConverterParameter="Severity"> Date: Thu, 18 Sep 2025 10:38:47 +0200 Subject: [PATCH 2/2] Rename and moved converter to a more appropriate place. --- .../EnumToImageSourceConverterTest.cs} | 10 +++++----- .../EnumToImageSourceConverter.cs} | 4 ++-- .../{DependencyRisks => ReportView}/IResourceFinder.cs | 2 +- .../ReportView/ReportViewControl.xaml | 7 ++----- 4 files changed, 10 insertions(+), 13 deletions(-) rename src/IssueViz.Security.UnitTests/{DependencyRisks/DependencyRiskImpactSeverityToImageSourceConverterTest.cs => ReportView/EnumToImageSourceConverterTest.cs} (92%) rename src/IssueViz.Security/{DependencyRisks/DependencyRiskImpactSeverityToImageSourceConverter.cs => ReportView/EnumToImageSourceConverter.cs} (92%) rename src/IssueViz.Security/{DependencyRisks => ReportView}/IResourceFinder.cs (95%) diff --git a/src/IssueViz.Security.UnitTests/DependencyRisks/DependencyRiskImpactSeverityToImageSourceConverterTest.cs b/src/IssueViz.Security.UnitTests/ReportView/EnumToImageSourceConverterTest.cs similarity index 92% rename from src/IssueViz.Security.UnitTests/DependencyRisks/DependencyRiskImpactSeverityToImageSourceConverterTest.cs rename to src/IssueViz.Security.UnitTests/ReportView/EnumToImageSourceConverterTest.cs index 862fe37429..24cbbc41ac 100644 --- a/src/IssueViz.Security.UnitTests/DependencyRisks/DependencyRiskImpactSeverityToImageSourceConverterTest.cs +++ b/src/IssueViz.Security.UnitTests/ReportView/EnumToImageSourceConverterTest.cs @@ -22,14 +22,14 @@ using System.Windows; using System.Windows.Controls; using SonarLint.VisualStudio.Core.Analysis; -using SonarLint.VisualStudio.IssueVisualization.Security.DependencyRisks; +using SonarLint.VisualStudio.IssueVisualization.Security.ReportView; -namespace SonarLint.VisualStudio.IssueVisualization.Security.UnitTests.DependencyRisks; +namespace SonarLint.VisualStudio.IssueVisualization.Security.UnitTests.ReportView; [TestClass] -public class DependencyRiskImpactSeverityToImageSourceConverterTest +public class EnumToImageSourceConverterTest { - private DependencyRiskImpactSeverityToImageSourceConverter testSubject; + private EnumToImageSourceConverter testSubject; private IResourceFinder resourceFinder; private Button uiElement; @@ -38,7 +38,7 @@ public void Initialize() { uiElement = new Button(); resourceFinder = Substitute.For(); - testSubject = new DependencyRiskImpactSeverityToImageSourceConverter(); + testSubject = new EnumToImageSourceConverter(); } [TestMethod] diff --git a/src/IssueViz.Security/DependencyRisks/DependencyRiskImpactSeverityToImageSourceConverter.cs b/src/IssueViz.Security/ReportView/EnumToImageSourceConverter.cs similarity index 92% rename from src/IssueViz.Security/DependencyRisks/DependencyRiskImpactSeverityToImageSourceConverter.cs rename to src/IssueViz.Security/ReportView/EnumToImageSourceConverter.cs index 91b0256b1e..177185e7f7 100644 --- a/src/IssueViz.Security/DependencyRisks/DependencyRiskImpactSeverityToImageSourceConverter.cs +++ b/src/IssueViz.Security/ReportView/EnumToImageSourceConverter.cs @@ -23,7 +23,7 @@ using System.Windows.Data; using System.Windows.Media; -namespace SonarLint.VisualStudio.IssueVisualization.Security.DependencyRisks; +namespace SonarLint.VisualStudio.IssueVisualization.Security.ReportView; /// /// Tries to find a DrawingImage resource based on the pattern [EnumValue][CustomSuffix]DrawingImage. @@ -33,7 +33,7 @@ namespace SonarLint.VisualStudio.IssueVisualization.Security.DependencyRisks; /// A custom suffix can be provided as a converter parameter. /// [ValueConversion(typeof(Enum), typeof(ImageSource))] -public class DependencyRiskImpactSeverityToImageSourceConverter : IMultiValueConverter +public class EnumToImageSourceConverter : IMultiValueConverter { private const string Suffix = "DrawingImage"; diff --git a/src/IssueViz.Security/DependencyRisks/IResourceFinder.cs b/src/IssueViz.Security/ReportView/IResourceFinder.cs similarity index 95% rename from src/IssueViz.Security/DependencyRisks/IResourceFinder.cs rename to src/IssueViz.Security/ReportView/IResourceFinder.cs index f847e9ba2b..a96060f71d 100644 --- a/src/IssueViz.Security/DependencyRisks/IResourceFinder.cs +++ b/src/IssueViz.Security/ReportView/IResourceFinder.cs @@ -21,7 +21,7 @@ using System.Diagnostics.CodeAnalysis; using System.Windows; -namespace SonarLint.VisualStudio.IssueVisualization.Security.DependencyRisks; +namespace SonarLint.VisualStudio.IssueVisualization.Security.ReportView; /// /// Abstraction for finding resources introduced to allow UI testability. diff --git a/src/IssueViz.Security/ReportView/ReportViewControl.xaml b/src/IssueViz.Security/ReportView/ReportViewControl.xaml index e9cb9ea131..1424970c7a 100644 --- a/src/IssueViz.Security/ReportView/ReportViewControl.xaml +++ b/src/IssueViz.Security/ReportView/ReportViewControl.xaml @@ -18,10 +18,7 @@ - - - + @@ -265,7 +262,7 @@ + Converter="{StaticResource EnumToImageSourceConverter}" ConverterParameter="Severity">