SwensenSoftware/unquote
50.4
Weak · 24 September 2026
2.1k
lines of production code
F#
primary language
2
measurements over time
What this system is
Unquote is an F\# testing library that provides expression-based assertions and decompilation capabilities for unit tests. The system has been modernized to target .NET 8, replacing legacy .NET Framework 4.0 support with a modular, SDK-style project structure. It integrates with major .NET testing frameworks, including xUnit, NUnit, and Expecto, to validate assertion operators and expression evaluation.
Features
Add .NET 8 verification projects for Expecto, NUnit 3, and xUnit 2
New verification projects have been added for the Expecto, NUnit 3, and xUnit 2 testing frameworks, all targeting .NET 8. These projects include the necessary test code and dependency lockfiles to validate the library's support for these specific test runners in the modern .NET environment.
verify · high confidence
Removals
Removed obsolete VerifyXunitSupport files
The App.config and VerifyXunitSupport.fs files have been deleted from the project. This removes the legacy XUnit support module and its associated configuration, likely as part of a broader refactoring or migration away from this specific verification approach.
VerifyXunitSupport · high confidence
Architecture
Refactor Unquote core library into modular F\# source files
The Unquote library's internal implementation has been reorganized from a single large file into distinct modules for decompilation, evaluation, dynamic operators, and pattern matching. This change introduces new types such as \AssertionFailedException\ and \EvaluationException\ to handle test failures and evaluation errors, while separating concerns like \Decompilation\, \Evaluation\, and \DynamicOperators\ into their own files. Users will see no functional change, but the library's internal structure is now more maintainable and modular.
src/Unquote · high confidence
Behavioural changes
Added NuGet build integration for cross-platform support
The project now includes .nuget/nuget.config and .nuget/nuget.targets files to modernize build tooling. The config disables source control integration, while the targets file provides cross-platform (Windows and non-Windows) support for restoring packages and building NuGet packages via the dotnet CLI, enabling the .NET 4.5 test suite to run correctly.
.nuget · medium confidence
Modernized build tooling and project structure for .NET 8
The project has been modernized to target .NET 8, utilizing the \dotnet\ CLI for build and test automation via a new \Makefile\. The solution structure has been reorganized into \src\, \test\, and \verify\ folders, and the solution file has been updated to Visual Studio 15 format. Additionally, the \readme.html\ file was removed in favor of \README.md\.
(repo-wide) · high confidence
Removal of .NET 4.0 support and related configuration
The project no longer supports .NET Framework 4.0. The App.config file specifying .NET 4.0 runtime support and the associated F\# source file (VerifyNunitSupport.fs) have been removed, indicating that the .NET 4.0 build target has been dropped from the test suite.
VerifyNunitSupport · high confidence
Removal of .NET Framework 4.0 support
The project has removed support for .NET Framework 4.0. This is reflected by the deletion of the App.config file that previously specified the v4.0 runtime and the removal of the Program.fs file associated with that framework version. Users targeting .NET Framework 4.0 will no longer be able to use this library.
VerifyNonFrameworkSupport · high confidence
Removed deprecated Unquote extension modules and startup script
The Unquote library has removed several legacy files—specifically ExprExt.fs, Operators.fs, Reduce.fs, RegexUtils.fs, Sprint.fs, Startup.fsx, and TypeExt.fs. This change consolidates the public API by removing the previous extension methods and operator-based syntax (such as the \test\ and \=?\>\ operators) and the F\# script used to load them, signaling a breaking change to the public interface as the library moves to a simplified, consolidated structure.
Unquote · high confidence
Removed obsolete F\# decompiler test files
Deleted the App.config file and the FSharpNameTests.fs, ReduceFullyOpTests.fs, and SourceOpTests.fs test files. These files contained unit tests for the F\# decompiler's source and reduction operations, which are no longer needed or have been replaced by newer test structures.
UnquoteTests · high confidence
Test coverage
Added comprehensive unit tests for the Unquote testing library
Added a new test project, UnquoteTests, containing extensive unit tests for the Unquote library. The test suite covers assertion operators, checked and dynamic operator evaluation, decompilation of expressions, evaluation of various F\# language constructs (tuples, records, arrays, lambdas), reduction steps, and serialization of custom exceptions. The project targets .NET 8 and uses xUnit for test execution.
test · high confidence
Dependencies
Modernize build tooling and update test dependencies
The project has been migrated from the legacy MSBuild-based .fsproj format to the modern SDK-style format, enabling support for .NET 8.0 in the test and verification projects. Dependencies have been updated to use NuGet package management, including xUnit 2.8.0 and Microsoft.NET.Test.Sdk 17.9.0 for the main test suite, while verification projects now target .NET 8.0 with updated packages such as NUnit 3.14.0, Expecto 9.0.4, and xUnit 2.6.4. The old project files for Unquote, UnquoteTests, and the various verify projects have been removed.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 50 → 50 (+0.7)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 98 → 97 (-0.6)
- Architecture 100 → 100 (+0.0)
- Maturity 35 → 35 (+0.0)
- Readiness 31 → 32 (+1.2)
- Security 96 → 98 (+1.7)
Resolved (22)
- Dependency hygiene not measured — no packages were read
- Duplicated block (5 lines × 2) (src/Unquote/Evaluation.fs)
- Duplicated block (6 lines × 2) (src/Unquote/EvaluationException.fs)
- Duplicated block (7 lines × 2) (src/Unquote/DynamicOperators.fs)
- Duplicated block (7 lines × 2) (src/Unquote/Evaluation.fs)
- Low coverage: AssertionFailedException.fs (AssertionFailedException.fs)
- Low coverage: Assertions.fs (Assertions.fs)
- Low coverage: Decompilation.fs (Decompilation.fs)
- Low coverage: DynamicOperators.fs (DynamicOperators.fs)
- Low coverage: Evaluation.fs (Evaluation.fs)
- Low coverage: EvaluationException.fs (EvaluationException.fs)
- Low coverage: Extensions.fs (Extensions.fs)
- Low coverage: ExtraPatterns.fs (ExtraPatterns.fs)
- Low coverage: List.fs (Utils/List.fs)
- Low coverage: Operators.fs (Operators.fs)
- Low coverage: Prelude.fs (Utils/Prelude.fs)
- Low coverage: Printf.fs (Utils/Printf.fs)
- Low coverage: Reduction.fs (Reduction.fs)
- No exposed public API
- Test reliability not included
- …and 2 more
New (22)
- Documentation: no contributor guidance (README.md)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- Duplicated block (5 lines × 2) (src/Unquote/Evaluation.fs)
- Duplicated block (6 lines × 2) (src/Unquote/AssertionFailedException.fs)
- Duplicated block (6 lines × 2) (src/Unquote/DynamicOperators.fs)
- Duplicated block (6–9 lines × 2) (src/Unquote/DynamicOperators.fs)
- Duplicated block (7 lines × 2) (src/Unquote/Evaluation.fs)
- Low coverage: src/Unquote/AssertionFailedException.fs (src/Unquote/AssertionFailedException.fs)
- Low coverage: src/Unquote/Assertions.fs (src/Unquote/Assertions.fs)
- Low coverage: src/Unquote/Decompilation.fs (src/Unquote/Decompilation.fs)
- Low coverage: src/Unquote/DynamicOperators.fs (src/Unquote/DynamicOperators.fs)
- Low coverage: src/Unquote/Evaluation.fs (src/Unquote/Evaluation.fs)
- Low coverage: src/Unquote/EvaluationException.fs (src/Unquote/EvaluationException.fs)
- Low coverage: src/Unquote/Extensions.fs (src/Unquote/Extensions.fs)
- Low coverage: src/Unquote/ExtraPatterns.fs (src/Unquote/ExtraPatterns.fs)
- Low coverage: src/Unquote/Operators.fs (src/Unquote/Operators.fs)
- Low coverage: src/Unquote/Reduction.fs (src/Unquote/Reduction.fs)
- Low coverage: src/Unquote/Utils/List.fs (src/Unquote/Utils/List.fs)
- Low coverage: src/Unquote/Utils/Prelude.fs (src/Unquote/Utils/Prelude.fs)
- …and 2 more
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
SwensenSoftware/unquote was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 24 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit db484646b683bf3d780d91e9a945821e77d84de4 — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-923689c465cf.