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.
Files changed (231) hide show
  1. package/README.md +47 -150
  2. package/package.json +1 -1
  3. package/template/agent/rules/CLAUDE.md +80 -0
  4. package/template/agent/rules/code-styles.md +31 -32
  5. package/template/agent/rules/debug-confirmation-policy.md +2 -0
  6. package/template/agent/rules/file-length-policy.md +2 -0
  7. package/template/agent/rules/git-policy.md +7 -0
  8. package/template/agent/rules/language-matching.md +2 -0
  9. package/template/agent/rules/scratch-scripts.md +39 -0
  10. package/template/agent/rules/superpowers.md +8 -51
  11. package/template/agent/skills/executing-plans/SKILL.md +17 -0
  12. package/template/agent/skills/systematic-debugging/SKILL.md +16 -0
  13. package/template/agent/skills/test-driven-development/SKILL.md +16 -0
  14. package/template/agent/skills/verification-before-completion/SKILL.md +22 -0
  15. package/template/agent/skills/writing-plans/SKILL.md +16 -0
  16. package/template/agent/skills/ai-integrated-product/SKILL.md +0 -57
  17. package/template/agent/skills/analytics-setup/SKILL.md +0 -51
  18. package/template/agent/skills/api-design/SKILL.md +0 -193
  19. package/template/agent/skills/app-store-optimizer/SKILL.md +0 -127
  20. package/template/agent/skills/auth-and-identity/SKILL.md +0 -167
  21. package/template/agent/skills/backend-developer/SKILL.md +0 -148
  22. package/template/agent/skills/bootstrapper-finance/SKILL.md +0 -55
  23. package/template/agent/skills/chrome-extension-developer/SKILL.md +0 -53
  24. package/template/agent/skills/community-manager/SKILL.md +0 -115
  25. package/template/agent/skills/content-marketer/SKILL.md +0 -111
  26. package/template/agent/skills/conversion-optimizer/SKILL.md +0 -142
  27. package/template/agent/skills/cto-architect/SKILL.md +0 -133
  28. package/template/agent/skills/customer-success-manager/SKILL.md +0 -126
  29. package/template/agent/skills/data-analyst/SKILL.md +0 -147
  30. package/template/agent/skills/devops-engineer/SKILL.md +0 -117
  31. package/template/agent/skills/email-infrastructure/SKILL.md +0 -164
  32. package/template/agent/skills/game-design/SKILL.md +0 -194
  33. package/template/agent/skills/game-developer/SKILL.md +0 -175
  34. package/template/agent/skills/growth-hacker/SKILL.md +0 -122
  35. package/template/agent/skills/idea-validator/SKILL.md +0 -55
  36. package/template/agent/skills/indie-legal/SKILL.md +0 -53
  37. package/template/agent/skills/influencer-marketer/SKILL.md +0 -141
  38. package/template/agent/skills/landing-page-builder/SKILL.md +0 -59
  39. package/template/agent/skills/launch-strategist/SKILL.md +0 -62
  40. package/template/agent/skills/market-researcher/SKILL.md +0 -53
  41. package/template/agent/skills/micro-saas-builder/SKILL.md +0 -56
  42. package/template/agent/skills/monetization-strategist/SKILL.md +0 -119
  43. package/template/agent/skills/paid-acquisition-specialist/SKILL.md +0 -119
  44. package/template/agent/skills/pricing-psychologist/SKILL.md +0 -58
  45. package/template/agent/skills/real-time-features/SKILL.md +0 -194
  46. package/template/agent/skills/retention-specialist/SKILL.md +0 -123
  47. package/template/agent/skills/rust-developer/SKILL.md +0 -281
  48. package/template/agent/skills/rust-developer/references/rust-rules/_sections.md +0 -231
  49. package/template/agent/skills/rust-developer/references/rust-rules/anti-clone-excessive.md +0 -124
  50. package/template/agent/skills/rust-developer/references/rust-rules/anti-collect-intermediate.md +0 -131
  51. package/template/agent/skills/rust-developer/references/rust-rules/anti-empty-catch.md +0 -132
  52. package/template/agent/skills/rust-developer/references/rust-rules/anti-expect-lazy.md +0 -95
  53. package/template/agent/skills/rust-developer/references/rust-rules/anti-format-hot-path.md +0 -141
  54. package/template/agent/skills/rust-developer/references/rust-rules/anti-index-over-iter.md +0 -125
  55. package/template/agent/skills/rust-developer/references/rust-rules/anti-lock-across-await.md +0 -127
  56. package/template/agent/skills/rust-developer/references/rust-rules/anti-over-abstraction.md +0 -120
  57. package/template/agent/skills/rust-developer/references/rust-rules/anti-panic-expected.md +0 -131
  58. package/template/agent/skills/rust-developer/references/rust-rules/anti-premature-optimize.md +0 -156
  59. package/template/agent/skills/rust-developer/references/rust-rules/anti-string-for-str.md +0 -122
  60. package/template/agent/skills/rust-developer/references/rust-rules/anti-stringly-typed.md +0 -167
  61. package/template/agent/skills/rust-developer/references/rust-rules/anti-type-erasure.md +0 -134
  62. package/template/agent/skills/rust-developer/references/rust-rules/anti-unwrap-abuse.md +0 -143
  63. package/template/agent/skills/rust-developer/references/rust-rules/anti-vec-for-slice.md +0 -121
  64. package/template/agent/skills/rust-developer/references/rust-rules/api-builder-must-use.md +0 -143
  65. package/template/agent/skills/rust-developer/references/rust-rules/api-builder-pattern.md +0 -187
  66. package/template/agent/skills/rust-developer/references/rust-rules/api-common-traits.md +0 -165
  67. package/template/agent/skills/rust-developer/references/rust-rules/api-default-impl.md +0 -177
  68. package/template/agent/skills/rust-developer/references/rust-rules/api-extension-trait.md +0 -163
  69. package/template/agent/skills/rust-developer/references/rust-rules/api-from-not-into.md +0 -146
  70. package/template/agent/skills/rust-developer/references/rust-rules/api-impl-asref.md +0 -142
  71. package/template/agent/skills/rust-developer/references/rust-rules/api-impl-into.md +0 -160
  72. package/template/agent/skills/rust-developer/references/rust-rules/api-must-use.md +0 -125
  73. package/template/agent/skills/rust-developer/references/rust-rules/api-newtype-safety.md +0 -162
  74. package/template/agent/skills/rust-developer/references/rust-rules/api-non-exhaustive.md +0 -177
  75. package/template/agent/skills/rust-developer/references/rust-rules/api-parse-dont-validate.md +0 -184
  76. package/template/agent/skills/rust-developer/references/rust-rules/api-sealed-trait.md +0 -168
  77. package/template/agent/skills/rust-developer/references/rust-rules/api-serde-optional.md +0 -182
  78. package/template/agent/skills/rust-developer/references/rust-rules/api-typestate.md +0 -199
  79. package/template/agent/skills/rust-developer/references/rust-rules/async-bounded-channel.md +0 -175
  80. package/template/agent/skills/rust-developer/references/rust-rules/async-broadcast-pubsub.md +0 -185
  81. package/template/agent/skills/rust-developer/references/rust-rules/async-cancellation-token.md +0 -203
  82. package/template/agent/skills/rust-developer/references/rust-rules/async-clone-before-await.md +0 -171
  83. package/template/agent/skills/rust-developer/references/rust-rules/async-join-parallel.md +0 -158
  84. package/template/agent/skills/rust-developer/references/rust-rules/async-joinset-structured.md +0 -195
  85. package/template/agent/skills/rust-developer/references/rust-rules/async-mpsc-queue.md +0 -171
  86. package/template/agent/skills/rust-developer/references/rust-rules/async-no-lock-await.md +0 -156
  87. package/template/agent/skills/rust-developer/references/rust-rules/async-oneshot-response.md +0 -191
  88. package/template/agent/skills/rust-developer/references/rust-rules/async-select-racing.md +0 -198
  89. package/template/agent/skills/rust-developer/references/rust-rules/async-spawn-blocking.md +0 -154
  90. package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-fs.md +0 -167
  91. package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-runtime.md +0 -169
  92. package/template/agent/skills/rust-developer/references/rust-rules/async-try-join.md +0 -172
  93. package/template/agent/skills/rust-developer/references/rust-rules/async-watch-latest.md +0 -189
  94. package/template/agent/skills/rust-developer/references/rust-rules/doc-all-public.md +0 -113
  95. package/template/agent/skills/rust-developer/references/rust-rules/doc-cargo-metadata.md +0 -147
  96. package/template/agent/skills/rust-developer/references/rust-rules/doc-errors-section.md +0 -122
  97. package/template/agent/skills/rust-developer/references/rust-rules/doc-examples-section.md +0 -161
  98. package/template/agent/skills/rust-developer/references/rust-rules/doc-hidden-setup.md +0 -149
  99. package/template/agent/skills/rust-developer/references/rust-rules/doc-intra-links.md +0 -138
  100. package/template/agent/skills/rust-developer/references/rust-rules/doc-link-types.md +0 -169
  101. package/template/agent/skills/rust-developer/references/rust-rules/doc-module-inner.md +0 -116
  102. package/template/agent/skills/rust-developer/references/rust-rules/doc-panics-section.md +0 -128
  103. package/template/agent/skills/rust-developer/references/rust-rules/doc-question-mark.md +0 -136
  104. package/template/agent/skills/rust-developer/references/rust-rules/doc-safety-section.md +0 -131
  105. package/template/agent/skills/rust-developer/references/rust-rules/err-anyhow-app.md +0 -179
  106. package/template/agent/skills/rust-developer/references/rust-rules/err-context-chain.md +0 -144
  107. package/template/agent/skills/rust-developer/references/rust-rules/err-custom-type.md +0 -152
  108. package/template/agent/skills/rust-developer/references/rust-rules/err-doc-errors.md +0 -145
  109. package/template/agent/skills/rust-developer/references/rust-rules/err-expect-bugs-only.md +0 -133
  110. package/template/agent/skills/rust-developer/references/rust-rules/err-from-impl.md +0 -152
  111. package/template/agent/skills/rust-developer/references/rust-rules/err-lowercase-msg.md +0 -124
  112. package/template/agent/skills/rust-developer/references/rust-rules/err-no-unwrap-prod.md +0 -115
  113. package/template/agent/skills/rust-developer/references/rust-rules/err-question-mark.md +0 -151
  114. package/template/agent/skills/rust-developer/references/rust-rules/err-result-over-panic.md +0 -130
  115. package/template/agent/skills/rust-developer/references/rust-rules/err-source-chain.md +0 -155
  116. package/template/agent/skills/rust-developer/references/rust-rules/err-thiserror-lib.md +0 -171
  117. package/template/agent/skills/rust-developer/references/rust-rules/lint-cargo-metadata.md +0 -138
  118. package/template/agent/skills/rust-developer/references/rust-rules/lint-deny-correctness.md +0 -107
  119. package/template/agent/skills/rust-developer/references/rust-rules/lint-missing-docs.md +0 -154
  120. package/template/agent/skills/rust-developer/references/rust-rules/lint-pedantic-selective.md +0 -118
  121. package/template/agent/skills/rust-developer/references/rust-rules/lint-rustfmt-check.md +0 -157
  122. package/template/agent/skills/rust-developer/references/rust-rules/lint-unsafe-doc.md +0 -133
  123. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-complexity.md +0 -131
  124. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-perf.md +0 -136
  125. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-style.md +0 -135
  126. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-suspicious.md +0 -122
  127. package/template/agent/skills/rust-developer/references/rust-rules/lint-workspace-lints.md +0 -172
  128. package/template/agent/skills/rust-developer/references/rust-rules/mem-arena-allocator.md +0 -168
  129. package/template/agent/skills/rust-developer/references/rust-rules/mem-arrayvec.md +0 -142
  130. package/template/agent/skills/rust-developer/references/rust-rules/mem-assert-type-size.md +0 -168
  131. package/template/agent/skills/rust-developer/references/rust-rules/mem-avoid-format.md +0 -147
  132. package/template/agent/skills/rust-developer/references/rust-rules/mem-box-large-variant.md +0 -158
  133. package/template/agent/skills/rust-developer/references/rust-rules/mem-boxed-slice.md +0 -139
  134. package/template/agent/skills/rust-developer/references/rust-rules/mem-clone-from.md +0 -147
  135. package/template/agent/skills/rust-developer/references/rust-rules/mem-compact-string.md +0 -149
  136. package/template/agent/skills/rust-developer/references/rust-rules/mem-reuse-collections.md +0 -174
  137. package/template/agent/skills/rust-developer/references/rust-rules/mem-smaller-integers.md +0 -159
  138. package/template/agent/skills/rust-developer/references/rust-rules/mem-smallvec.md +0 -138
  139. package/template/agent/skills/rust-developer/references/rust-rules/mem-thinvec.md +0 -142
  140. package/template/agent/skills/rust-developer/references/rust-rules/mem-with-capacity.md +0 -156
  141. package/template/agent/skills/rust-developer/references/rust-rules/mem-write-over-format.md +0 -172
  142. package/template/agent/skills/rust-developer/references/rust-rules/mem-zero-copy.md +0 -164
  143. package/template/agent/skills/rust-developer/references/rust-rules/name-acronym-word.md +0 -99
  144. package/template/agent/skills/rust-developer/references/rust-rules/name-as-free.md +0 -104
  145. package/template/agent/skills/rust-developer/references/rust-rules/name-consts-screaming.md +0 -94
  146. package/template/agent/skills/rust-developer/references/rust-rules/name-crate-no-rs.md +0 -78
  147. package/template/agent/skills/rust-developer/references/rust-rules/name-funcs-snake.md +0 -76
  148. package/template/agent/skills/rust-developer/references/rust-rules/name-into-ownership.md +0 -123
  149. package/template/agent/skills/rust-developer/references/rust-rules/name-is-has-bool.md +0 -127
  150. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-convention.md +0 -129
  151. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-method.md +0 -131
  152. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-type-match.md +0 -142
  153. package/template/agent/skills/rust-developer/references/rust-rules/name-lifetime-short.md +0 -86
  154. package/template/agent/skills/rust-developer/references/rust-rules/name-no-get-prefix.md +0 -154
  155. package/template/agent/skills/rust-developer/references/rust-rules/name-to-expensive.md +0 -118
  156. package/template/agent/skills/rust-developer/references/rust-rules/name-type-param-single.md +0 -92
  157. package/template/agent/skills/rust-developer/references/rust-rules/name-types-camel.md +0 -65
  158. package/template/agent/skills/rust-developer/references/rust-rules/name-variants-camel.md +0 -101
  159. package/template/agent/skills/rust-developer/references/rust-rules/opt-bounds-check.md +0 -161
  160. package/template/agent/skills/rust-developer/references/rust-rules/opt-cache-friendly.md +0 -187
  161. package/template/agent/skills/rust-developer/references/rust-rules/opt-codegen-units.md +0 -142
  162. package/template/agent/skills/rust-developer/references/rust-rules/opt-cold-unlikely.md +0 -152
  163. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-always-rare.md +0 -141
  164. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-never-cold.md +0 -181
  165. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-small.md +0 -160
  166. package/template/agent/skills/rust-developer/references/rust-rules/opt-likely-hint.md +0 -171
  167. package/template/agent/skills/rust-developer/references/rust-rules/opt-lto-release.md +0 -130
  168. package/template/agent/skills/rust-developer/references/rust-rules/opt-pgo-profile.md +0 -167
  169. package/template/agent/skills/rust-developer/references/rust-rules/opt-simd-portable.md +0 -144
  170. package/template/agent/skills/rust-developer/references/rust-rules/opt-target-cpu.md +0 -154
  171. package/template/agent/skills/rust-developer/references/rust-rules/own-arc-shared.md +0 -141
  172. package/template/agent/skills/rust-developer/references/rust-rules/own-borrow-over-clone.md +0 -95
  173. package/template/agent/skills/rust-developer/references/rust-rules/own-clone-explicit.md +0 -135
  174. package/template/agent/skills/rust-developer/references/rust-rules/own-copy-small.md +0 -124
  175. package/template/agent/skills/rust-developer/references/rust-rules/own-cow-conditional.md +0 -135
  176. package/template/agent/skills/rust-developer/references/rust-rules/own-lifetime-elision.md +0 -134
  177. package/template/agent/skills/rust-developer/references/rust-rules/own-move-large.md +0 -134
  178. package/template/agent/skills/rust-developer/references/rust-rules/own-mutex-interior.md +0 -105
  179. package/template/agent/skills/rust-developer/references/rust-rules/own-rc-single-thread.md +0 -65
  180. package/template/agent/skills/rust-developer/references/rust-rules/own-refcell-interior.md +0 -97
  181. package/template/agent/skills/rust-developer/references/rust-rules/own-rwlock-readers.md +0 -122
  182. package/template/agent/skills/rust-developer/references/rust-rules/own-slice-over-vec.md +0 -119
  183. package/template/agent/skills/rust-developer/references/rust-rules/perf-black-box-bench.md +0 -153
  184. package/template/agent/skills/rust-developer/references/rust-rules/perf-chain-avoid.md +0 -136
  185. package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-into.md +0 -133
  186. package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-once.md +0 -120
  187. package/template/agent/skills/rust-developer/references/rust-rules/perf-drain-reuse.md +0 -137
  188. package/template/agent/skills/rust-developer/references/rust-rules/perf-entry-api.md +0 -134
  189. package/template/agent/skills/rust-developer/references/rust-rules/perf-extend-batch.md +0 -150
  190. package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-lazy.md +0 -123
  191. package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-over-index.md +0 -113
  192. package/template/agent/skills/rust-developer/references/rust-rules/perf-profile-first.md +0 -175
  193. package/template/agent/skills/rust-developer/references/rust-rules/perf-release-profile.md +0 -149
  194. package/template/agent/skills/rust-developer/references/rust-rules/proj-bin-dir.md +0 -142
  195. package/template/agent/skills/rust-developer/references/rust-rules/proj-flat-small.md +0 -133
  196. package/template/agent/skills/rust-developer/references/rust-rules/proj-lib-main-split.md +0 -148
  197. package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-by-feature.md +0 -130
  198. package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-rs-dir.md +0 -120
  199. package/template/agent/skills/rust-developer/references/rust-rules/proj-prelude-module.md +0 -155
  200. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-crate-internal.md +0 -139
  201. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-super-parent.md +0 -135
  202. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-use-reexport.md +0 -162
  203. package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-deps.md +0 -186
  204. package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-large.md +0 -162
  205. package/template/agent/skills/rust-developer/references/rust-rules/test-arrange-act-assert.md +0 -160
  206. package/template/agent/skills/rust-developer/references/rust-rules/test-cfg-test-module.md +0 -151
  207. package/template/agent/skills/rust-developer/references/rust-rules/test-criterion-bench.md +0 -171
  208. package/template/agent/skills/rust-developer/references/rust-rules/test-descriptive-names.md +0 -142
  209. package/template/agent/skills/rust-developer/references/rust-rules/test-doctest-examples.md +0 -168
  210. package/template/agent/skills/rust-developer/references/rust-rules/test-fixture-raii.md +0 -151
  211. package/template/agent/skills/rust-developer/references/rust-rules/test-integration-dir.md +0 -144
  212. package/template/agent/skills/rust-developer/references/rust-rules/test-mock-traits.md +0 -189
  213. package/template/agent/skills/rust-developer/references/rust-rules/test-mockall-mocking.md +0 -226
  214. package/template/agent/skills/rust-developer/references/rust-rules/test-proptest-properties.md +0 -161
  215. package/template/agent/skills/rust-developer/references/rust-rules/test-should-panic.md +0 -130
  216. package/template/agent/skills/rust-developer/references/rust-rules/test-tokio-async.md +0 -154
  217. package/template/agent/skills/rust-developer/references/rust-rules/test-use-super.md +0 -127
  218. package/template/agent/skills/rust-developer/references/rust-rules/type-enum-states.md +0 -154
  219. package/template/agent/skills/rust-developer/references/rust-rules/type-generic-bounds.md +0 -142
  220. package/template/agent/skills/rust-developer/references/rust-rules/type-never-diverge.md +0 -146
  221. package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-ids.md +0 -160
  222. package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-validated.md +0 -159
  223. package/template/agent/skills/rust-developer/references/rust-rules/type-no-stringly.md +0 -144
  224. package/template/agent/skills/rust-developer/references/rust-rules/type-option-nullable.md +0 -137
  225. package/template/agent/skills/rust-developer/references/rust-rules/type-phantom-marker.md +0 -188
  226. package/template/agent/skills/rust-developer/references/rust-rules/type-repr-transparent.md +0 -143
  227. package/template/agent/skills/rust-developer/references/rust-rules/type-result-fallible.md +0 -131
  228. package/template/agent/skills/saas-architect/SKILL.md +0 -139
  229. package/template/agent/skills/security-engineer/SKILL.md +0 -133
  230. package/template/agent/skills/seo-specialist/SKILL.md +0 -130
  231. package/template/agent/skills/solo-founder-ops/SKILL.md +0 -56
@@ -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