Project · ASP.NET companions

Check a quote policy independently of HTTP

Verify nine accepted and rejected domain cases before attaching an ASP.NET response adapter.

All C# source files below are loaded together in the playground. Files written by a run live in its virtual directory.

Program.cs

QuoteChecks.Run();

Domain/QuotePolicy.cs

public enum DecisionKind { Accepted, Invalid, Missing, LimitExceeded }
public sealed record QuoteDecision(DecisionKind Kind, decimal? Total = null);
public sealed class QuotePolicy {
    private readonly int maximum;
    public QuotePolicy(int maximum) { if (maximum is < 1 or > 10) throw new ArgumentOutOfRangeException(nameof(maximum)); this.maximum = maximum; }
    public QuoteDecision Evaluate(string? item, int quantity) {
        if (string.IsNullOrWhiteSpace(item) || quantity is < 1 or > 10) return new(DecisionKind.Invalid);
        if (!string.Equals(item, "rune", StringComparison.Ordinal)) return new(DecisionKind.Missing);
        if (quantity > maximum) return new(DecisionKind.LimitExceeded);
        return new(DecisionKind.Accepted, checked(12.5m * quantity));
    }
}

Checks/QuoteChecks.cs

using System.Globalization;
public static class QuoteChecks {
    public static void Run() {
        var policy = new QuotePolicy(3); int checks = 0;
        void Check(bool accepted) { if (!accepted) throw new Exception("Independent quote expectation failed"); checks++; }
        Check(policy.Evaluate("rune", 2) == new QuoteDecision(DecisionKind.Accepted, 25m));
        Check(policy.Evaluate("rune", 3) == new QuoteDecision(DecisionKind.Accepted, 37.5m));
        Check(policy.Evaluate("rune", 4).Kind == DecisionKind.LimitExceeded);
        Check(policy.Evaluate("missing", 1).Kind == DecisionKind.Missing);
        Check(policy.Evaluate("Rune", 1).Kind == DecisionKind.Missing);
        Check(policy.Evaluate("", 1).Kind == DecisionKind.Invalid);
        Check(policy.Evaluate("rune", 0).Kind == DecisionKind.Invalid);
        Check(policy.Evaluate("rune", 11).Kind == DecisionKind.Invalid);
        try { _ = new QuotePolicy(0); throw new Exception("Invalid configuration was accepted"); } catch (ArgumentOutOfRangeException) { checks++; }
        Console.WriteLine("quote checks:" + checks); Console.WriteLine("transport:none");
    }
}

QuotePolicy.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net9.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
</Project>