Project · Current .NET
Frozen rate-card contract lab
Build a scalar configuration snapshot with an explicit comparer, then run five independent console checks. No test-framework package is required.
All C# source files below are loaded together in the playground. Files written by a run live in its virtual directory.
Program.cs
var checks = RateCardChecks.Run();
foreach (var check in checks) Console.WriteLine($"{check.Name}:{(check.Passed ? "PASS" : "FAIL")}");
Console.WriteLine($"passed:{checks.Count(check => check.Passed)}/{checks.Count}");
return checks.All(check => check.Passed) ? 0 : 1;
Domain/RateCard.cs
using System.Collections.Frozen;
public sealed class RateCard
{
private readonly FrozenDictionary<string, int> rates;
public int Count => rates.Count;
public RateCard(IEnumerable<KeyValuePair<string, int>> entries)
{
ArgumentNullException.ThrowIfNull(entries);
rates = entries.ToFrozenDictionary(StringComparer.OrdinalIgnoreCase);
}
public bool TryGet(string code, out int rate) => rates.TryGetValue(code, out rate);
}
Checks/RateCardChecks.cs
public static class RateCardChecks
{
public static List<(string Name, bool Passed)> Run()
{
var source = new Dictionary<string, int> { ["small"] = 2, ["large"] = 5 };
var card = new RateCard(source);
var checks = new List<(string Name, bool Passed)>();
checks.Add(("lookup", card.TryGet("small", out int first) && first == 2));
checks.Add(("comparer", card.TryGet("SMALL", out int upper) && upper == 2));
source["small"] = 9;
source["other"] = 7;
checks.Add(("snapshot", card.TryGet("small", out int snapshot) && snapshot == 2));
checks.Add(("missing", !card.TryGet("other", out _)));
checks.Add(("count", card.Count == 2));
return checks;
}
}
ConsoleLab.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<LangVersion>13.0</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>