Use when writing tests for serialization, validation, normalization, or pure functions - provides property catalog, pattern detection, and library reference for property-based testing
View on GitHubed3dai/ed3d-plugins
ed3d-house-style
January 25, 2026
Select agents to install to:
npx add-skill https://github.com/ed3dai/ed3d-plugins/blob/main/plugins/ed3d-house-style/skills/property-based-testing/SKILL.md -a claude-code --skill property-based-testingInstallation paths:
.claude/skills/property-based-testing/# Property-Based Testing ## Overview Property-based testing (PBT) generates random inputs and verifies that properties hold for all of them. Instead of testing specific examples, you test invariants. **When PBT beats example-based tests:** - Serialization pairs (encode/decode) - Pure functions with clear contracts - Validators and normalizers - Data structure operations ## Property Catalog | Property | Formula | When to Use | |----------|---------|-------------| | **Roundtrip** | `decode(encode(x)) == x` | Serialization, conversion pairs | | **Idempotence** | `f(f(x)) == f(x)` | Normalization, formatting, sorting | | **Invariant** | Property holds before/after | Any transformation | | **Commutativity** | `f(a, b) == f(b, a)` | Binary/set operations | | **Associativity** | `f(f(a,b), c) == f(a, f(b,c))` | Combining operations | | **Identity** | `f(x, identity) == x` | Operations with neutral element | | **Inverse** | `f(g(x)) == x` | encrypt/decrypt, compress/decompress | | **Oracle** | `new_impl(x) == reference(x)` | Optimization, refactoring | | **Easy to Verify** | `is_sorted(sort(x))` | Complex algorithms | | **No Exception** | No crash on valid input | Baseline (weakest) | **Strength hierarchy** (weakest to strongest): ``` No Exception -> Type Preservation -> Invariant -> Idempotence -> Roundtrip ``` Always aim for the strongest property that applies. ## Pattern Detection **Use PBT when you see:** | Pattern | Property | Priority | |---------|----------|----------| | `encode`/`decode`, `serialize`/`deserialize` | Roundtrip | HIGH | | `toJSON`/`fromJSON`, `pack`/`unpack` | Roundtrip | HIGH | | Pure functions with clear contracts | Multiple | HIGH | | `normalize`, `sanitize`, `canonicalize` | Idempotence | MEDIUM | | `is_valid`, `validate` with normalizers | Valid after normalize | MEDIUM | | Sorting, ordering, comparators | Idempotence + ordering | MEDIUM | | Custom collections (add/remove/get) | Invariants | MEDIUM | | Builder/factory patterns | Output