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>