diff --git a/src/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs b/src/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs index 3c15744439..f1fd87166d 100644 --- a/src/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs +++ b/src/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs @@ -792,11 +792,24 @@ private static Job MakeWasmJob(Job baseJob, CommandLineOptions options, string m private static IEnumerable GetFilters(CommandLineOptions options) { if (options.Filters.Any()) - yield return new GlobFilter(options.Filters.ToArray()); + { + // Filter by UID when specified filter can be parsed as GUID. + var uids = options.Filters.Where(x => Guid.TryParse(x, out _)).ToArray(); + if (uids.Length > 0) + yield return new UidFilter(uids); + + // Use GlobFilter for remaining filters. + var globFilters = options.Filters.Except(uids).ToArray(); + if (globFilters.Length > 0) + yield return new GlobFilter(globFilters); + } + if (options.AllCategories.Any()) yield return new AllCategoriesFilter(options.AllCategories.ToArray()); + if (options.AnyCategories.Any()) yield return new AnyCategoriesFilter(options.AnyCategories.ToArray()); + if (options.AttributeNames.Any()) yield return new AttributesFilter(options.AttributeNames.ToArray()); } diff --git a/src/BenchmarkDotNet/Filters/UidFilter.cs b/src/BenchmarkDotNet/Filters/UidFilter.cs new file mode 100644 index 0000000000..359ab77f29 --- /dev/null +++ b/src/BenchmarkDotNet/Filters/UidFilter.cs @@ -0,0 +1,25 @@ +using BenchmarkDotNet.Exporters; +using BenchmarkDotNet.Extensions; +using BenchmarkDotNet.Running; + +namespace BenchmarkDotNet.Filters +{ + /// + /// filters benchmarks by unique id. + /// + public class UidFilter : IFilter + { + private readonly string[] uids; + + public UidFilter(string[] uids) + { + this.uids = uids; + } + + public bool Predicate(BenchmarkCase benchmarkCase) + { + var uid = benchmarkCase.GetUniqueId(); + return uids.Any(x => x.Equals(uid, StringComparison.OrdinalIgnoreCase)); + } + } +} diff --git a/tests/BenchmarkDotNet.Tests/GlobFilterTests.cs b/tests/BenchmarkDotNet.Tests/Filters/GlobFilterTests.cs similarity index 90% rename from tests/BenchmarkDotNet.Tests/GlobFilterTests.cs rename to tests/BenchmarkDotNet.Tests/Filters/GlobFilterTests.cs index c56b75ec60..182222ebeb 100644 --- a/tests/BenchmarkDotNet.Tests/GlobFilterTests.cs +++ b/tests/BenchmarkDotNet.Tests/Filters/GlobFilterTests.cs @@ -2,7 +2,7 @@ using BenchmarkDotNet.Filters; using BenchmarkDotNet.Running; -namespace BenchmarkDotNet.Tests +namespace BenchmarkDotNet.Tests.Filters { public class GlobFilterTests { @@ -35,8 +35,8 @@ public void TheFilterIsCaseInsensitive(string pattern, bool expected) [InlineData("*", 2)] [InlineData("WRONG", 0)] [InlineData("*stillWRONG*", 0)] - [InlineData("BenchmarkDotNet.Tests.TypeWithBenchmarksAndParams.TheBenchmark", 2)] - [InlineData("BenchmarkDotNet.Tests.TypeWithBenchmarksAndParams.TheBenchmark(A: 100)", 1)] + [InlineData("BenchmarkDotNet.Tests.Filters.TypeWithBenchmarksAndParams.TheBenchmark", 2)] + [InlineData("BenchmarkDotNet.Tests.Filters.TypeWithBenchmarksAndParams.TheBenchmark(A: 100)", 1)] public void TheFilterWorksWithParams(string pattern, int expectedBenchmarks) { var benchmarkCases = BenchmarkConverter.TypeToBenchmarks(typeof(TypeWithBenchmarksAndParams)).BenchmarksCases; diff --git a/tests/BenchmarkDotNet.Tests/TypeFilterTests.cs b/tests/BenchmarkDotNet.Tests/Filters/TypeFilterTests.cs similarity index 99% rename from tests/BenchmarkDotNet.Tests/TypeFilterTests.cs rename to tests/BenchmarkDotNet.Tests/Filters/TypeFilterTests.cs index 1f3e6e7918..0b57d07be8 100644 --- a/tests/BenchmarkDotNet.Tests/TypeFilterTests.cs +++ b/tests/BenchmarkDotNet.Tests/Filters/TypeFilterTests.cs @@ -7,7 +7,7 @@ using JetBrains.Annotations; using TypeFilter = BenchmarkDotNet.Running.TypeFilter; -namespace BenchmarkDotNet.Tests +namespace BenchmarkDotNet.Tests.Filters { public class TypeFilterTests { diff --git a/tests/BenchmarkDotNet.Tests/Filters/UidFilterTests.cs b/tests/BenchmarkDotNet.Tests/Filters/UidFilterTests.cs new file mode 100644 index 0000000000..5298e5975f --- /dev/null +++ b/tests/BenchmarkDotNet.Tests/Filters/UidFilterTests.cs @@ -0,0 +1,40 @@ +using AwesomeAssertions; +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Extensions; +using BenchmarkDotNet.Filters; +using BenchmarkDotNet.Running; + +namespace BenchmarkDotNet.Tests.Filters; + +public class UidFilterTests +{ + [Fact] + public void FilterByUid() + { + // Arrange + var benchmarkCase = BenchmarkConverter.TypeToBenchmarks(typeof(TypeWithBenchmarks)).BenchmarksCases.Single(); + var uid = benchmarkCase.GetUniqueId(); + var filter = new UidFilter([uid]); + + // Assert + bool result = filter.Predicate(benchmarkCase); + + // Assert + result.Should().BeTrue(); + } + + [Fact] + public void FilterByUid_UpperCase() + { + // Arrange + var benchmarkCase = BenchmarkConverter.TypeToBenchmarks(typeof(TypeWithBenchmarks)).BenchmarksCases.Single(); + var uid = benchmarkCase.GetUniqueId().ToUpperInvariant(); + var filter = new UidFilter([uid]); + + // Assert + bool result = filter.Predicate(benchmarkCase); + + // Assert + result.Should().BeTrue(); + } +}