From 7748def78e9699c119c358ffa9b2cce10c56e254 Mon Sep 17 00:00:00 2001 From: Nathan Tran Date: Tue, 11 Nov 2025 10:52:27 -0800 Subject: [PATCH 1/2] Allow `null` for a dotnet Namespace and add a small test --- .../src/adapters/c_sharp/dot_net.rs | 37 +++++++++++++++++-- .../c_sharp/dot_net/null_namespace.json | 16 ++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 lib/bencher_adapter/tool_output/c_sharp/dot_net/null_namespace.json diff --git a/lib/bencher_adapter/src/adapters/c_sharp/dot_net.rs b/lib/bencher_adapter/src/adapters/c_sharp/dot_net.rs index 76e57113d..9c46a1d85 100644 --- a/lib/bencher_adapter/src/adapters/c_sharp/dot_net.rs +++ b/lib/bencher_adapter/src/adapters/c_sharp/dot_net.rs @@ -33,7 +33,8 @@ pub struct Benchmarks(pub Vec); #[derive(Debug, Clone, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct Benchmark { - pub namespace: BenchmarkName, + #[serde(rename = "Namespace")] + pub opt_namespace: Option, pub method: BenchmarkName, pub statistics: Statistics, } @@ -57,7 +58,7 @@ impl DotNet { let mut benchmark_metrics = Vec::with_capacity(benchmarks.len()); for benchmark in benchmarks { let Benchmark { - namespace: mut benchmark_name, + opt_namespace, method, statistics, } = benchmark; @@ -68,7 +69,13 @@ impl DotNet { interquartile_range, } = statistics; - benchmark_name.try_push('.', &method)?; + let benchmark_name = match opt_namespace { + Some(mut name) => { + name.try_push('.', &method)?; + name + }, + None => method, + }; // JSON output is always in nanos let units = Units::Nano; @@ -121,6 +128,30 @@ pub(crate) mod test_c_sharp_dot_net { format!("./tool_output/c_sharp/dot_net/{suffix}.json") } + #[test] + fn test_adapter_c_sharp_dot_net_null_namespace() { + let null_namespace = "null_namespace"; + let file_path = file_path(null_namespace); + + let results = convert_c_sharp_dot_net(null_namespace); + validate_adapter_c_sharp_dot_net_null_namespace(&results); + + let results = opt_convert_file_path::( + &file_path, + Settings { + average: Some(JsonAverage::Mean), + }, + ) + .unwrap(); + + validate_adapter_c_sharp_dot_net_null_namespace(&results); + } + + fn validate_adapter_c_sharp_dot_net_null_namespace(results: &AdapterResults) { + assert_eq!(results.inner.len(), 1); + assert!(results.get("NullNamespaceMethod").is_some()); + } + #[test] fn test_adapter_c_sharp_dot_net_two() { let two = "two"; diff --git a/lib/bencher_adapter/tool_output/c_sharp/dot_net/null_namespace.json b/lib/bencher_adapter/tool_output/c_sharp/dot_net/null_namespace.json new file mode 100644 index 000000000..b840c09bf --- /dev/null +++ b/lib/bencher_adapter/tool_output/c_sharp/dot_net/null_namespace.json @@ -0,0 +1,16 @@ +{ + "HostEnvironmentInfo": { + }, + "Benchmarks": [ + { + "Namespace": null, + "Method": "NullNamespaceMethod", + "Statistics": { + "Median": 0, + "Mean": 0, + "InterquartileRange": 0, + "StandardDeviation": 0 + } + } + ] +} From 3a940b215b23b8ae28bd99621e5444ec839c30b4 Mon Sep 17 00:00:00 2001 From: Nathan Tran Date: Wed, 12 Nov 2025 08:53:09 -0800 Subject: [PATCH 2/2] Revert `opt_namespace` to `namespace` --- lib/bencher_adapter/src/adapters/c_sharp/dot_net.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/bencher_adapter/src/adapters/c_sharp/dot_net.rs b/lib/bencher_adapter/src/adapters/c_sharp/dot_net.rs index 9c46a1d85..b7524daae 100644 --- a/lib/bencher_adapter/src/adapters/c_sharp/dot_net.rs +++ b/lib/bencher_adapter/src/adapters/c_sharp/dot_net.rs @@ -33,8 +33,7 @@ pub struct Benchmarks(pub Vec); #[derive(Debug, Clone, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct Benchmark { - #[serde(rename = "Namespace")] - pub opt_namespace: Option, + pub namespace: Option, pub method: BenchmarkName, pub statistics: Statistics, } @@ -58,7 +57,7 @@ impl DotNet { let mut benchmark_metrics = Vec::with_capacity(benchmarks.len()); for benchmark in benchmarks { let Benchmark { - opt_namespace, + namespace, method, statistics, } = benchmark; @@ -69,7 +68,7 @@ impl DotNet { interquartile_range, } = statistics; - let benchmark_name = match opt_namespace { + let benchmark_name = match namespace { Some(mut name) => { name.try_push('.', &method)?; name