agy-superpowers 5.2.2 → 5.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -150
- package/package.json +1 -1
- package/template/agent/rules/CLAUDE.md +80 -0
- package/template/agent/rules/code-styles.md +31 -32
- package/template/agent/rules/debug-confirmation-policy.md +2 -0
- package/template/agent/rules/file-length-policy.md +2 -0
- package/template/agent/rules/git-policy.md +7 -0
- package/template/agent/rules/language-matching.md +2 -0
- package/template/agent/rules/scratch-scripts.md +39 -0
- package/template/agent/rules/superpowers.md +8 -51
- package/template/agent/skills/executing-plans/SKILL.md +17 -0
- package/template/agent/skills/systematic-debugging/SKILL.md +16 -0
- package/template/agent/skills/test-driven-development/SKILL.md +16 -0
- package/template/agent/skills/verification-before-completion/SKILL.md +22 -0
- package/template/agent/skills/writing-plans/SKILL.md +16 -0
- package/template/agent/skills/ai-integrated-product/SKILL.md +0 -57
- package/template/agent/skills/analytics-setup/SKILL.md +0 -51
- package/template/agent/skills/api-design/SKILL.md +0 -193
- package/template/agent/skills/app-store-optimizer/SKILL.md +0 -127
- package/template/agent/skills/auth-and-identity/SKILL.md +0 -167
- package/template/agent/skills/backend-developer/SKILL.md +0 -148
- package/template/agent/skills/bootstrapper-finance/SKILL.md +0 -55
- package/template/agent/skills/chrome-extension-developer/SKILL.md +0 -53
- package/template/agent/skills/community-manager/SKILL.md +0 -115
- package/template/agent/skills/content-marketer/SKILL.md +0 -111
- package/template/agent/skills/conversion-optimizer/SKILL.md +0 -142
- package/template/agent/skills/cto-architect/SKILL.md +0 -133
- package/template/agent/skills/customer-success-manager/SKILL.md +0 -126
- package/template/agent/skills/data-analyst/SKILL.md +0 -147
- package/template/agent/skills/devops-engineer/SKILL.md +0 -117
- package/template/agent/skills/email-infrastructure/SKILL.md +0 -164
- package/template/agent/skills/game-design/SKILL.md +0 -194
- package/template/agent/skills/game-developer/SKILL.md +0 -175
- package/template/agent/skills/growth-hacker/SKILL.md +0 -122
- package/template/agent/skills/idea-validator/SKILL.md +0 -55
- package/template/agent/skills/indie-legal/SKILL.md +0 -53
- package/template/agent/skills/influencer-marketer/SKILL.md +0 -141
- package/template/agent/skills/landing-page-builder/SKILL.md +0 -59
- package/template/agent/skills/launch-strategist/SKILL.md +0 -62
- package/template/agent/skills/market-researcher/SKILL.md +0 -53
- package/template/agent/skills/micro-saas-builder/SKILL.md +0 -56
- package/template/agent/skills/monetization-strategist/SKILL.md +0 -119
- package/template/agent/skills/paid-acquisition-specialist/SKILL.md +0 -119
- package/template/agent/skills/pricing-psychologist/SKILL.md +0 -58
- package/template/agent/skills/real-time-features/SKILL.md +0 -194
- package/template/agent/skills/retention-specialist/SKILL.md +0 -123
- package/template/agent/skills/rust-developer/SKILL.md +0 -281
- package/template/agent/skills/rust-developer/references/rust-rules/_sections.md +0 -231
- package/template/agent/skills/rust-developer/references/rust-rules/anti-clone-excessive.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/anti-collect-intermediate.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/anti-empty-catch.md +0 -132
- package/template/agent/skills/rust-developer/references/rust-rules/anti-expect-lazy.md +0 -95
- package/template/agent/skills/rust-developer/references/rust-rules/anti-format-hot-path.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/anti-index-over-iter.md +0 -125
- package/template/agent/skills/rust-developer/references/rust-rules/anti-lock-across-await.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/anti-over-abstraction.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/anti-panic-expected.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/anti-premature-optimize.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/anti-string-for-str.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/anti-stringly-typed.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/anti-type-erasure.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/anti-unwrap-abuse.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/anti-vec-for-slice.md +0 -121
- package/template/agent/skills/rust-developer/references/rust-rules/api-builder-must-use.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/api-builder-pattern.md +0 -187
- package/template/agent/skills/rust-developer/references/rust-rules/api-common-traits.md +0 -165
- package/template/agent/skills/rust-developer/references/rust-rules/api-default-impl.md +0 -177
- package/template/agent/skills/rust-developer/references/rust-rules/api-extension-trait.md +0 -163
- package/template/agent/skills/rust-developer/references/rust-rules/api-from-not-into.md +0 -146
- package/template/agent/skills/rust-developer/references/rust-rules/api-impl-asref.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/api-impl-into.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/api-must-use.md +0 -125
- package/template/agent/skills/rust-developer/references/rust-rules/api-newtype-safety.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/api-non-exhaustive.md +0 -177
- package/template/agent/skills/rust-developer/references/rust-rules/api-parse-dont-validate.md +0 -184
- package/template/agent/skills/rust-developer/references/rust-rules/api-sealed-trait.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/api-serde-optional.md +0 -182
- package/template/agent/skills/rust-developer/references/rust-rules/api-typestate.md +0 -199
- package/template/agent/skills/rust-developer/references/rust-rules/async-bounded-channel.md +0 -175
- package/template/agent/skills/rust-developer/references/rust-rules/async-broadcast-pubsub.md +0 -185
- package/template/agent/skills/rust-developer/references/rust-rules/async-cancellation-token.md +0 -203
- package/template/agent/skills/rust-developer/references/rust-rules/async-clone-before-await.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/async-join-parallel.md +0 -158
- package/template/agent/skills/rust-developer/references/rust-rules/async-joinset-structured.md +0 -195
- package/template/agent/skills/rust-developer/references/rust-rules/async-mpsc-queue.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/async-no-lock-await.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/async-oneshot-response.md +0 -191
- package/template/agent/skills/rust-developer/references/rust-rules/async-select-racing.md +0 -198
- package/template/agent/skills/rust-developer/references/rust-rules/async-spawn-blocking.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-fs.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-runtime.md +0 -169
- package/template/agent/skills/rust-developer/references/rust-rules/async-try-join.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/async-watch-latest.md +0 -189
- package/template/agent/skills/rust-developer/references/rust-rules/doc-all-public.md +0 -113
- package/template/agent/skills/rust-developer/references/rust-rules/doc-cargo-metadata.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/doc-errors-section.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/doc-examples-section.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/doc-hidden-setup.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/doc-intra-links.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/doc-link-types.md +0 -169
- package/template/agent/skills/rust-developer/references/rust-rules/doc-module-inner.md +0 -116
- package/template/agent/skills/rust-developer/references/rust-rules/doc-panics-section.md +0 -128
- package/template/agent/skills/rust-developer/references/rust-rules/doc-question-mark.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/doc-safety-section.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/err-anyhow-app.md +0 -179
- package/template/agent/skills/rust-developer/references/rust-rules/err-context-chain.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/err-custom-type.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/err-doc-errors.md +0 -145
- package/template/agent/skills/rust-developer/references/rust-rules/err-expect-bugs-only.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/err-from-impl.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/err-lowercase-msg.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/err-no-unwrap-prod.md +0 -115
- package/template/agent/skills/rust-developer/references/rust-rules/err-question-mark.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/err-result-over-panic.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/err-source-chain.md +0 -155
- package/template/agent/skills/rust-developer/references/rust-rules/err-thiserror-lib.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/lint-cargo-metadata.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/lint-deny-correctness.md +0 -107
- package/template/agent/skills/rust-developer/references/rust-rules/lint-missing-docs.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/lint-pedantic-selective.md +0 -118
- package/template/agent/skills/rust-developer/references/rust-rules/lint-rustfmt-check.md +0 -157
- package/template/agent/skills/rust-developer/references/rust-rules/lint-unsafe-doc.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-complexity.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-perf.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-style.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-suspicious.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/lint-workspace-lints.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/mem-arena-allocator.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/mem-arrayvec.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/mem-assert-type-size.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/mem-avoid-format.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/mem-box-large-variant.md +0 -158
- package/template/agent/skills/rust-developer/references/rust-rules/mem-boxed-slice.md +0 -139
- package/template/agent/skills/rust-developer/references/rust-rules/mem-clone-from.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/mem-compact-string.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/mem-reuse-collections.md +0 -174
- package/template/agent/skills/rust-developer/references/rust-rules/mem-smaller-integers.md +0 -159
- package/template/agent/skills/rust-developer/references/rust-rules/mem-smallvec.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/mem-thinvec.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/mem-with-capacity.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/mem-write-over-format.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/mem-zero-copy.md +0 -164
- package/template/agent/skills/rust-developer/references/rust-rules/name-acronym-word.md +0 -99
- package/template/agent/skills/rust-developer/references/rust-rules/name-as-free.md +0 -104
- package/template/agent/skills/rust-developer/references/rust-rules/name-consts-screaming.md +0 -94
- package/template/agent/skills/rust-developer/references/rust-rules/name-crate-no-rs.md +0 -78
- package/template/agent/skills/rust-developer/references/rust-rules/name-funcs-snake.md +0 -76
- package/template/agent/skills/rust-developer/references/rust-rules/name-into-ownership.md +0 -123
- package/template/agent/skills/rust-developer/references/rust-rules/name-is-has-bool.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-convention.md +0 -129
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-method.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-type-match.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/name-lifetime-short.md +0 -86
- package/template/agent/skills/rust-developer/references/rust-rules/name-no-get-prefix.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/name-to-expensive.md +0 -118
- package/template/agent/skills/rust-developer/references/rust-rules/name-type-param-single.md +0 -92
- package/template/agent/skills/rust-developer/references/rust-rules/name-types-camel.md +0 -65
- package/template/agent/skills/rust-developer/references/rust-rules/name-variants-camel.md +0 -101
- package/template/agent/skills/rust-developer/references/rust-rules/opt-bounds-check.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/opt-cache-friendly.md +0 -187
- package/template/agent/skills/rust-developer/references/rust-rules/opt-codegen-units.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/opt-cold-unlikely.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-always-rare.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-never-cold.md +0 -181
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-small.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/opt-likely-hint.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/opt-lto-release.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/opt-pgo-profile.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/opt-simd-portable.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/opt-target-cpu.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/own-arc-shared.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/own-borrow-over-clone.md +0 -95
- package/template/agent/skills/rust-developer/references/rust-rules/own-clone-explicit.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/own-copy-small.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/own-cow-conditional.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/own-lifetime-elision.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/own-move-large.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/own-mutex-interior.md +0 -105
- package/template/agent/skills/rust-developer/references/rust-rules/own-rc-single-thread.md +0 -65
- package/template/agent/skills/rust-developer/references/rust-rules/own-refcell-interior.md +0 -97
- package/template/agent/skills/rust-developer/references/rust-rules/own-rwlock-readers.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/own-slice-over-vec.md +0 -119
- package/template/agent/skills/rust-developer/references/rust-rules/perf-black-box-bench.md +0 -153
- package/template/agent/skills/rust-developer/references/rust-rules/perf-chain-avoid.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-into.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-once.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/perf-drain-reuse.md +0 -137
- package/template/agent/skills/rust-developer/references/rust-rules/perf-entry-api.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/perf-extend-batch.md +0 -150
- package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-lazy.md +0 -123
- package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-over-index.md +0 -113
- package/template/agent/skills/rust-developer/references/rust-rules/perf-profile-first.md +0 -175
- package/template/agent/skills/rust-developer/references/rust-rules/perf-release-profile.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/proj-bin-dir.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/proj-flat-small.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/proj-lib-main-split.md +0 -148
- package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-by-feature.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-rs-dir.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/proj-prelude-module.md +0 -155
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-crate-internal.md +0 -139
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-super-parent.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-use-reexport.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-deps.md +0 -186
- package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-large.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/test-arrange-act-assert.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/test-cfg-test-module.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/test-criterion-bench.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/test-descriptive-names.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/test-doctest-examples.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/test-fixture-raii.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/test-integration-dir.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/test-mock-traits.md +0 -189
- package/template/agent/skills/rust-developer/references/rust-rules/test-mockall-mocking.md +0 -226
- package/template/agent/skills/rust-developer/references/rust-rules/test-proptest-properties.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/test-should-panic.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/test-tokio-async.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/test-use-super.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/type-enum-states.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/type-generic-bounds.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/type-never-diverge.md +0 -146
- package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-ids.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-validated.md +0 -159
- package/template/agent/skills/rust-developer/references/rust-rules/type-no-stringly.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/type-option-nullable.md +0 -137
- package/template/agent/skills/rust-developer/references/rust-rules/type-phantom-marker.md +0 -188
- package/template/agent/skills/rust-developer/references/rust-rules/type-repr-transparent.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/type-result-fallible.md +0 -131
- package/template/agent/skills/saas-architect/SKILL.md +0 -139
- package/template/agent/skills/security-engineer/SKILL.md +0 -133
- package/template/agent/skills/seo-specialist/SKILL.md +0 -130
- package/template/agent/skills/solo-founder-ops/SKILL.md +0 -56
package/template/agent/skills/rust-developer/references/rust-rules/test-descriptive-names.md
DELETED
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
# test-descriptive-names
|
|
2
|
-
|
|
3
|
-
> Use descriptive test names that explain what is being tested
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Test names appear in test output and serve as documentation. A good test name tells you what behavior is being verified without reading the test body. When a test fails, a descriptive name immediately tells you what broke.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
#[test]
|
|
13
|
-
fn test1() { ... }
|
|
14
|
-
|
|
15
|
-
#[test]
|
|
16
|
-
fn test_parse() { ... } // Parse what? What behavior?
|
|
17
|
-
|
|
18
|
-
#[test]
|
|
19
|
-
fn it_works() { ... }
|
|
20
|
-
|
|
21
|
-
#[test]
|
|
22
|
-
fn test_function() { ... }
|
|
23
|
-
|
|
24
|
-
// Failure output: "test test_parse ... FAILED"
|
|
25
|
-
// What failed? No idea.
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Good
|
|
29
|
-
|
|
30
|
-
```rust
|
|
31
|
-
#[test]
|
|
32
|
-
fn parse_returns_error_for_empty_input() { ... }
|
|
33
|
-
|
|
34
|
-
#[test]
|
|
35
|
-
fn parse_handles_unicode_characters() { ... }
|
|
36
|
-
|
|
37
|
-
#[test]
|
|
38
|
-
fn user_creation_requires_valid_email() { ... }
|
|
39
|
-
|
|
40
|
-
#[test]
|
|
41
|
-
fn expired_token_is_rejected() { ... }
|
|
42
|
-
|
|
43
|
-
// Failure output: "test parse_returns_error_for_empty_input ... FAILED"
|
|
44
|
-
// Immediately know what broke!
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
## Naming Patterns
|
|
48
|
-
|
|
49
|
-
```rust
|
|
50
|
-
// Pattern: function_condition_expected_result
|
|
51
|
-
#[test]
|
|
52
|
-
fn parse_valid_json_returns_document() { ... }
|
|
53
|
-
|
|
54
|
-
#[test]
|
|
55
|
-
fn parse_invalid_json_returns_syntax_error() { ... }
|
|
56
|
-
|
|
57
|
-
// Pattern: scenario_expectation
|
|
58
|
-
#[test]
|
|
59
|
-
fn empty_cart_has_zero_total() { ... }
|
|
60
|
-
|
|
61
|
-
#[test]
|
|
62
|
-
fn adding_item_increases_cart_total() { ... }
|
|
63
|
-
|
|
64
|
-
// Pattern: when_given_then (BDD-style)
|
|
65
|
-
#[test]
|
|
66
|
-
fn when_user_not_found_then_returns_404() { ... }
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
## Edge Cases
|
|
70
|
-
|
|
71
|
-
```rust
|
|
72
|
-
#[test]
|
|
73
|
-
fn handles_empty_string() { ... }
|
|
74
|
-
|
|
75
|
-
#[test]
|
|
76
|
-
fn handles_max_length_input() { ... }
|
|
77
|
-
|
|
78
|
-
#[test]
|
|
79
|
-
fn handles_unicode_emoji() { ... }
|
|
80
|
-
|
|
81
|
-
#[test]
|
|
82
|
-
fn handles_null_bytes() { ... }
|
|
83
|
-
|
|
84
|
-
#[test]
|
|
85
|
-
fn handles_concurrent_access() { ... }
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## Error Cases
|
|
89
|
-
|
|
90
|
-
```rust
|
|
91
|
-
#[test]
|
|
92
|
-
fn rejects_negative_quantity() { ... }
|
|
93
|
-
|
|
94
|
-
#[test]
|
|
95
|
-
fn returns_error_for_invalid_email_format() { ... }
|
|
96
|
-
|
|
97
|
-
#[test]
|
|
98
|
-
fn panics_on_double_initialization() { ... }
|
|
99
|
-
|
|
100
|
-
#[test]
|
|
101
|
-
fn timeout_returns_timeout_error() { ... }
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
## Module Organization
|
|
105
|
-
|
|
106
|
-
```rust
|
|
107
|
-
#[cfg(test)]
|
|
108
|
-
mod tests {
|
|
109
|
-
use super::*;
|
|
110
|
-
|
|
111
|
-
mod parsing {
|
|
112
|
-
use super::*;
|
|
113
|
-
|
|
114
|
-
#[test]
|
|
115
|
-
fn accepts_valid_json() { ... }
|
|
116
|
-
|
|
117
|
-
#[test]
|
|
118
|
-
fn rejects_trailing_comma() { ... }
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
mod validation {
|
|
122
|
-
use super::*;
|
|
123
|
-
|
|
124
|
-
#[test]
|
|
125
|
-
fn requires_name_field() { ... }
|
|
126
|
-
|
|
127
|
-
#[test]
|
|
128
|
-
fn email_must_contain_at_symbol() { ... }
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// Test output:
|
|
133
|
-
// tests::parsing::accepts_valid_json
|
|
134
|
-
// tests::parsing::rejects_trailing_comma
|
|
135
|
-
// tests::validation::requires_name_field
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
## See Also
|
|
139
|
-
|
|
140
|
-
- [test-arrange-act-assert](./test-arrange-act-assert.md) - Test structure
|
|
141
|
-
- [test-cfg-test-module](./test-cfg-test-module.md) - Test module organization
|
|
142
|
-
- [doc-examples-section](./doc-examples-section.md) - Documentation tests
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
# test-doctest-examples
|
|
2
|
-
|
|
3
|
-
> Keep documentation examples as executable doctests
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Doctests are examples in documentation that are automatically tested. They serve dual purposes: demonstrating usage to readers and verifying the examples compile and work. When your API changes, failing doctests catch outdated documentation.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
/// Parses a number from a string.
|
|
13
|
-
///
|
|
14
|
-
/// Example:
|
|
15
|
-
/// let n = parse("42"); // Not tested!
|
|
16
|
-
/// assert_eq!(n, 42);
|
|
17
|
-
pub fn parse(s: &str) -> i32 {
|
|
18
|
-
s.parse().unwrap()
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// Documentation can become outdated:
|
|
22
|
-
/// Adds two numbers.
|
|
23
|
-
///
|
|
24
|
-
/// ```
|
|
25
|
-
/// let sum = add(1, 2, 3); // Wrong number of args - not caught!
|
|
26
|
-
/// ```
|
|
27
|
-
pub fn add(a: i32, b: i32) -> i32 {
|
|
28
|
-
a + b
|
|
29
|
-
}
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Good
|
|
33
|
-
|
|
34
|
-
```rust
|
|
35
|
-
/// Parses a number from a string.
|
|
36
|
-
///
|
|
37
|
-
/// # Examples
|
|
38
|
-
///
|
|
39
|
-
/// ```
|
|
40
|
-
/// use my_crate::parse;
|
|
41
|
-
///
|
|
42
|
-
/// let n = parse("42");
|
|
43
|
-
/// assert_eq!(n, 42);
|
|
44
|
-
/// ```
|
|
45
|
-
pub fn parse(s: &str) -> i32 {
|
|
46
|
-
s.parse().unwrap()
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/// Adds two numbers.
|
|
50
|
-
///
|
|
51
|
-
/// # Examples
|
|
52
|
-
///
|
|
53
|
-
/// ```
|
|
54
|
-
/// use my_crate::add;
|
|
55
|
-
///
|
|
56
|
-
/// let sum = add(1, 2);
|
|
57
|
-
/// assert_eq!(sum, 3);
|
|
58
|
-
/// ```
|
|
59
|
-
pub fn add(a: i32, b: i32) -> i32 {
|
|
60
|
-
a + b
|
|
61
|
-
}
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## Hiding Setup Code
|
|
65
|
-
|
|
66
|
-
```rust
|
|
67
|
-
/// Processes data from a file.
|
|
68
|
-
///
|
|
69
|
-
/// # Examples
|
|
70
|
-
///
|
|
71
|
-
/// ```
|
|
72
|
-
/// # use std::io::Write;
|
|
73
|
-
/// # let mut file = tempfile::NamedTempFile::new().unwrap();
|
|
74
|
-
/// # writeln!(file, "test data").unwrap();
|
|
75
|
-
/// # let path = file.path();
|
|
76
|
-
/// use my_crate::process_file;
|
|
77
|
-
///
|
|
78
|
-
/// let result = process_file(path)?;
|
|
79
|
-
/// assert!(!result.is_empty());
|
|
80
|
-
/// # Ok::<(), Box<dyn std::error::Error>>(())
|
|
81
|
-
/// ```
|
|
82
|
-
pub fn process_file(path: &Path) -> Result<String, Error> {
|
|
83
|
-
std::fs::read_to_string(path).map_err(Error::from)
|
|
84
|
-
}
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
## Showing Error Handling
|
|
88
|
-
|
|
89
|
-
```rust
|
|
90
|
-
/// Parses and validates an email address.
|
|
91
|
-
///
|
|
92
|
-
/// # Examples
|
|
93
|
-
///
|
|
94
|
-
/// ```
|
|
95
|
-
/// use my_crate::Email;
|
|
96
|
-
///
|
|
97
|
-
/// let email = Email::parse("user@example.com")?;
|
|
98
|
-
/// assert_eq!(email.domain(), "example.com");
|
|
99
|
-
/// # Ok::<(), my_crate::EmailError>(())
|
|
100
|
-
/// ```
|
|
101
|
-
///
|
|
102
|
-
/// # Errors
|
|
103
|
-
///
|
|
104
|
-
/// Returns error for invalid format:
|
|
105
|
-
///
|
|
106
|
-
/// ```
|
|
107
|
-
/// use my_crate::Email;
|
|
108
|
-
///
|
|
109
|
-
/// assert!(Email::parse("not-an-email").is_err());
|
|
110
|
-
/// ```
|
|
111
|
-
pub fn parse(s: &str) -> Result<Email, EmailError> {
|
|
112
|
-
// ...
|
|
113
|
-
}
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
## no_run and ignore
|
|
117
|
-
|
|
118
|
-
```rust
|
|
119
|
-
/// Starts the server.
|
|
120
|
-
///
|
|
121
|
-
/// ```no_run
|
|
122
|
-
/// use my_crate::Server;
|
|
123
|
-
///
|
|
124
|
-
/// // This compiles but doesn't run (would block forever)
|
|
125
|
-
/// Server::new().run();
|
|
126
|
-
/// ```
|
|
127
|
-
pub fn run(&self) { ... }
|
|
128
|
-
|
|
129
|
-
/// Platform-specific example.
|
|
130
|
-
///
|
|
131
|
-
/// ```ignore
|
|
132
|
-
/// // This might not compile on all platforms
|
|
133
|
-
/// use windows_specific::Feature;
|
|
134
|
-
/// ```
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
## compile_fail
|
|
138
|
-
|
|
139
|
-
```rust
|
|
140
|
-
/// This type is not Clone.
|
|
141
|
-
///
|
|
142
|
-
/// ```compile_fail
|
|
143
|
-
/// use my_crate::UniqueHandle;
|
|
144
|
-
///
|
|
145
|
-
/// let a = UniqueHandle::new();
|
|
146
|
-
/// let b = a.clone(); // Error: Clone not implemented
|
|
147
|
-
/// ```
|
|
148
|
-
pub struct UniqueHandle { ... }
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
## Running Doctests
|
|
152
|
-
|
|
153
|
-
```bash
|
|
154
|
-
# Run all tests including doctests
|
|
155
|
-
cargo test
|
|
156
|
-
|
|
157
|
-
# Run only doctests
|
|
158
|
-
cargo test --doc
|
|
159
|
-
|
|
160
|
-
# Run doctests for specific item
|
|
161
|
-
cargo test --doc my_function
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
## See Also
|
|
165
|
-
|
|
166
|
-
- [doc-examples-section](./doc-examples-section.md) - Documentation structure
|
|
167
|
-
- [doc-hidden-setup](./doc-hidden-setup.md) - Hiding setup code
|
|
168
|
-
- [doc-question-mark](./doc-question-mark.md) - Error handling in examples
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
# test-fixture-raii
|
|
2
|
-
|
|
3
|
-
> Use RAII pattern (Drop trait) for automatic test cleanup
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Tests often need setup and teardown—creating temp files, starting servers, setting environment variables. Using RAII (Resource Acquisition Is Initialization) with Drop ensures cleanup happens automatically, even if the test panics. This prevents test pollution and resource leaks.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
#[test]
|
|
13
|
-
fn test_with_temp_file() {
|
|
14
|
-
let path = ".agent/tmp/test_file.txt";
|
|
15
|
-
std::fs::write(path, "test data").unwrap();
|
|
16
|
-
|
|
17
|
-
let result = process_file(path);
|
|
18
|
-
|
|
19
|
-
std::fs::remove_file(path).unwrap(); // Might not run if test panics!
|
|
20
|
-
assert!(result.is_ok());
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
#[test]
|
|
24
|
-
fn test_with_env_var() {
|
|
25
|
-
std::env::set_var("MY_VAR", "test_value");
|
|
26
|
-
|
|
27
|
-
let result = read_config();
|
|
28
|
-
|
|
29
|
-
std::env::remove_var("MY_VAR"); // Might not run if test panics!
|
|
30
|
-
assert!(result.is_ok());
|
|
31
|
-
}
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## Good
|
|
35
|
-
|
|
36
|
-
```rust
|
|
37
|
-
use tempfile::NamedTempFile;
|
|
38
|
-
|
|
39
|
-
#[test]
|
|
40
|
-
fn test_with_temp_file() {
|
|
41
|
-
// Arrange - file deleted automatically when `file` drops
|
|
42
|
-
let file = NamedTempFile::new().unwrap();
|
|
43
|
-
std::fs::write(file.path(), "test data").unwrap();
|
|
44
|
-
|
|
45
|
-
// Act
|
|
46
|
-
let result = process_file(file.path());
|
|
47
|
-
|
|
48
|
-
// Assert - file cleaned up even if assertion panics
|
|
49
|
-
assert!(result.is_ok());
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Custom RAII guard for environment variables
|
|
53
|
-
struct EnvGuard {
|
|
54
|
-
key: String,
|
|
55
|
-
original: Option<String>,
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
impl EnvGuard {
|
|
59
|
-
fn set(key: &str, value: &str) -> Self {
|
|
60
|
-
let original = std::env::var(key).ok();
|
|
61
|
-
std::env::set_var(key, value);
|
|
62
|
-
EnvGuard {
|
|
63
|
-
key: key.to_string(),
|
|
64
|
-
original,
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
impl Drop for EnvGuard {
|
|
70
|
-
fn drop(&mut self) {
|
|
71
|
-
match &self.original {
|
|
72
|
-
Some(v) => std::env::set_var(&self.key, v),
|
|
73
|
-
None => std::env::remove_var(&self.key),
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
#[test]
|
|
79
|
-
fn test_with_env_var() {
|
|
80
|
-
let _guard = EnvGuard::set("MY_VAR", "test_value");
|
|
81
|
-
|
|
82
|
-
let result = read_config();
|
|
83
|
-
|
|
84
|
-
assert!(result.is_ok());
|
|
85
|
-
} // MY_VAR automatically restored
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## Common RAII Patterns
|
|
89
|
-
|
|
90
|
-
```rust
|
|
91
|
-
// Temporary directory
|
|
92
|
-
use tempfile::TempDir;
|
|
93
|
-
|
|
94
|
-
#[test]
|
|
95
|
-
fn test_with_temp_dir() {
|
|
96
|
-
let dir = TempDir::new().unwrap();
|
|
97
|
-
let file_path = dir.path().join("test.txt");
|
|
98
|
-
std::fs::write(&file_path, "data").unwrap();
|
|
99
|
-
|
|
100
|
-
// dir and all contents deleted on drop
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Server guard
|
|
104
|
-
struct TestServer {
|
|
105
|
-
handle: std::thread::JoinHandle<()>,
|
|
106
|
-
shutdown: std::sync::mpsc::Sender<()>,
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
impl Drop for TestServer {
|
|
110
|
-
fn drop(&mut self) {
|
|
111
|
-
let _ = self.shutdown.send(());
|
|
112
|
-
// Wait for server to stop
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// Database transaction rollback
|
|
117
|
-
struct TestTransaction<'a> {
|
|
118
|
-
conn: &'a mut Connection,
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
impl Drop for TestTransaction<'_> {
|
|
122
|
-
fn drop(&mut self) {
|
|
123
|
-
self.conn.execute("ROLLBACK").unwrap();
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
## scopeguard Crate
|
|
129
|
-
|
|
130
|
-
```rust
|
|
131
|
-
use scopeguard::defer;
|
|
132
|
-
|
|
133
|
-
#[test]
|
|
134
|
-
fn test_with_defer() {
|
|
135
|
-
let path = ".agent/tmp/test_file.txt";
|
|
136
|
-
std::fs::write(path, "data").unwrap();
|
|
137
|
-
|
|
138
|
-
defer! {
|
|
139
|
-
std::fs::remove_file(path).ok();
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// Test logic here
|
|
143
|
-
// File removed when scope exits
|
|
144
|
-
}
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
## See Also
|
|
148
|
-
|
|
149
|
-
- [test-arrange-act-assert](./test-arrange-act-assert.md) - Test structure
|
|
150
|
-
- [test-tokio-async](./test-tokio-async.md) - Async test cleanup
|
|
151
|
-
- [test-mock-traits](./test-mock-traits.md) - Mocking with RAII
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
# test-integration-dir
|
|
2
|
-
|
|
3
|
-
> Put integration tests in the `tests/` directory
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Integration tests live in `tests/` at the crate root, separate from `src/`. Each file in `tests/` is compiled as a separate crate, testing your library's public API as external users would. This separation ensures you're testing the real public interface, not implementation details.
|
|
8
|
-
|
|
9
|
-
## Structure
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
my_project/
|
|
13
|
-
├── Cargo.toml
|
|
14
|
-
├── src/
|
|
15
|
-
│ ├── lib.rs
|
|
16
|
-
│ └── internal.rs
|
|
17
|
-
└── tests/
|
|
18
|
-
├── integration_test.rs # Each file is a separate test binary
|
|
19
|
-
├── api_tests.rs
|
|
20
|
-
└── common/ # Shared test utilities
|
|
21
|
-
└── mod.rs
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## Bad
|
|
25
|
-
|
|
26
|
-
```rust
|
|
27
|
-
// src/lib.rs
|
|
28
|
-
// Mixing integration test logic in library code
|
|
29
|
-
#[test]
|
|
30
|
-
fn integration_test_full_workflow() {
|
|
31
|
-
// This is a unit test location, not integration
|
|
32
|
-
}
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## Good
|
|
36
|
-
|
|
37
|
-
```rust
|
|
38
|
-
// tests/integration_test.rs
|
|
39
|
-
use my_crate::{Client, Config}; // Uses public API only
|
|
40
|
-
|
|
41
|
-
#[test]
|
|
42
|
-
fn test_full_workflow() {
|
|
43
|
-
let config = Config::default();
|
|
44
|
-
let client = Client::new(config);
|
|
45
|
-
|
|
46
|
-
let result = client.process("input");
|
|
47
|
-
assert!(result.is_ok());
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
#[test]
|
|
51
|
-
fn test_error_handling() {
|
|
52
|
-
let client = Client::new(Config::strict());
|
|
53
|
-
|
|
54
|
-
let result = client.process("invalid");
|
|
55
|
-
assert!(matches!(result, Err(Error::InvalidInput { .. })));
|
|
56
|
-
}
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
## Shared Test Utilities
|
|
60
|
-
|
|
61
|
-
```rust
|
|
62
|
-
// tests/common/mod.rs
|
|
63
|
-
use my_crate::Config;
|
|
64
|
-
|
|
65
|
-
pub fn test_config() -> Config {
|
|
66
|
-
Config {
|
|
67
|
-
timeout: Duration::from_secs(5),
|
|
68
|
-
retries: 3,
|
|
69
|
-
debug: true,
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
pub fn setup_test_environment() {
|
|
74
|
-
// Set up test fixtures
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// tests/api_tests.rs
|
|
78
|
-
mod common;
|
|
79
|
-
|
|
80
|
-
use my_crate::Client;
|
|
81
|
-
|
|
82
|
-
#[test]
|
|
83
|
-
fn test_with_shared_config() {
|
|
84
|
-
common::setup_test_environment();
|
|
85
|
-
let client = Client::new(common::test_config());
|
|
86
|
-
// ...
|
|
87
|
-
}
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
## Organizing Many Tests
|
|
91
|
-
|
|
92
|
-
```rust
|
|
93
|
-
// tests/api/mod.rs
|
|
94
|
-
mod auth;
|
|
95
|
-
mod users;
|
|
96
|
-
mod orders;
|
|
97
|
-
|
|
98
|
-
// tests/api/auth.rs
|
|
99
|
-
use my_crate::auth::{login, logout};
|
|
100
|
-
|
|
101
|
-
#[test]
|
|
102
|
-
fn test_login_success() { ... }
|
|
103
|
-
|
|
104
|
-
#[test]
|
|
105
|
-
fn test_login_invalid_credentials() { ... }
|
|
106
|
-
|
|
107
|
-
// tests/api/users.rs
|
|
108
|
-
use my_crate::users::{create_user, get_user};
|
|
109
|
-
|
|
110
|
-
#[test]
|
|
111
|
-
fn test_create_user() { ... }
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
## Integration vs Unit Tests
|
|
115
|
-
|
|
116
|
-
| Unit Tests | Integration Tests |
|
|
117
|
-
|------------|-------------------|
|
|
118
|
-
| In `src/` with `#[cfg(test)]` | In `tests/` directory |
|
|
119
|
-
| Access private items | Public API only |
|
|
120
|
-
| Test individual functions | Test module interactions |
|
|
121
|
-
| Fast, isolated | May be slower |
|
|
122
|
-
| `cargo test --lib` | `cargo test --test '*'` |
|
|
123
|
-
|
|
124
|
-
## Running Specific Tests
|
|
125
|
-
|
|
126
|
-
```bash
|
|
127
|
-
# Run all tests
|
|
128
|
-
cargo test
|
|
129
|
-
|
|
130
|
-
# Run only integration tests
|
|
131
|
-
cargo test --test '*'
|
|
132
|
-
|
|
133
|
-
# Run specific integration test file
|
|
134
|
-
cargo test --test integration_test
|
|
135
|
-
|
|
136
|
-
# Run tests matching pattern
|
|
137
|
-
cargo test --test api_tests test_login
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
## See Also
|
|
141
|
-
|
|
142
|
-
- [test-cfg-test-module](./test-cfg-test-module.md) - Unit test modules
|
|
143
|
-
- [test-descriptive-names](./test-descriptive-names.md) - Test naming
|
|
144
|
-
- [test-tokio-async](./test-tokio-async.md) - Async integration tests
|