QuickAcid 0.0.2
dotnet add package QuickAcid --version 0.0.2
NuGet\Install-Package QuickAcid -Version 0.0.2
<PackageReference Include="QuickAcid" Version="0.0.2" />
<PackageVersion Include="QuickAcid" Version="0.0.2" />
<PackageReference Include="QuickAcid" />
paket add QuickAcid --version 0.0.2
#r "nuget: QuickAcid, 0.0.2"
#:package QuickAcid@0.0.2
#addin nuget:?package=QuickAcid&version=0.0.2
#tool nuget:?package=QuickAcid&version=0.0.2
QuickAcid
Drop it in acid. Look for gold.
Like alchemy, but reproducible.
QuickAcid is a property-based testing library for C# that combines:
- LINQ-based test scripting
- Shrinkable, structured inputs
- Minimal-case failure reporting
- Customizable shrinking strategies
- Deep state modeling and execution traces
It's designed for sharp diagnostics, elegant expressiveness, and easy extension.
Example
Given a naive Account model:
public class Account
{
public int Balance = 0;
public void Deposit(int amount) { Balance += amount; }
public void Withdraw(int amount) { Balance -= amount; }
}
You can test the overdraft invariant like this:
var script =
from account in Script.Tracked(() => new Account())
from _ in Script.Choose(
from amount in Script.Input<Deposit.Amount>().With(Fuzzr.Int(0, 10))
from act in Script.Act<Deposit>(() => account.Deposit(amount))
select Acid.Test,
from amount in Script.Input<Withdraw.Amount>().With(Fuzzr.Int(0, 10))
from act in Script.Act<Withdraw>(() => account.Withdraw(amount))
select Acid.Test)
from spec in Script.Spec<NoOverdraft>(() => account.Balance >= 0)
select Acid.Test;
QState.Run(script, 1584314623) // <= reproducible when seeded
.WithOneRun()
.And(50.ExecutionsPerRun());
The generic arguments to the various Script methods are just lightweight marker records, used for labeling inputs, actions, and specifications in reports:
namespace QuickAcid.Tests;
public record Deposit : Act { public record Amount : Input; };
public record Withdraw : Act { public record Amount : Input; };
public record NoOverdraft : Spec;
Example Failure Output
A failing property produces a minimal counterexample and a readable execution trace:
──────────────────────────────────────────────────
Test: ExampleTest
Location: C:\Code\QuickAcid\QuickAcid.Tests\CreateReadMe.cs:107:1
Original failing run: 4 executions
Minimal failing case: 1 execution (after 4 shrinks)
Seed: 1584314623
──────────────────────────────────────────────────
=> Account (tracked) : { Balance: 0 }
──────────────────────────────────────────────────
Executed (3): Withdraw
- Input: Withdraw Amount = 9
═══════════════════════════════
❌ Spec Failed: No overdraft
═══════════════════════════════
Passed Specs
- No overdraft: 3x
──────────────────────────────────────────────────
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- QuickFuzzr (>= 0.1.3)
- QuickPulse (>= 0.3.2)
- QuickPulse.Show (>= 0.1.9)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.