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>