@h1dr0n/skill-pool 0.1.0

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 (189) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +296 -0
  3. package/bin/cli.js +157 -0
  4. package/package.json +41 -0
  5. package/skills/api/agents/backend-specialist.md +69 -0
  6. package/skills/api/agents/database-optimizer.md +176 -0
  7. package/skills/api/manifest.yaml +20 -0
  8. package/skills/api/rules/auth-security.md +45 -0
  9. package/skills/api/skills/api-patterns/SKILL.md +81 -0
  10. package/skills/api/skills/api-patterns/api-style.md +42 -0
  11. package/skills/api/skills/api-patterns/auth.md +24 -0
  12. package/skills/api/skills/api-patterns/documentation.md +26 -0
  13. package/skills/api/skills/api-patterns/graphql.md +41 -0
  14. package/skills/api/skills/api-patterns/rate-limiting.md +31 -0
  15. package/skills/api/skills/api-patterns/response.md +37 -0
  16. package/skills/api/skills/api-patterns/rest.md +40 -0
  17. package/skills/api/skills/api-patterns/scripts/api_validator.py +211 -0
  18. package/skills/api/skills/api-patterns/security-testing.md +122 -0
  19. package/skills/api/skills/api-patterns/trpc.md +41 -0
  20. package/skills/api/skills/api-patterns/versioning.md +22 -0
  21. package/skills/api/skills/database-patterns.md +126 -0
  22. package/skills/api/skills/deployment-patterns.md +105 -0
  23. package/skills/api/skills/docker-patterns.md +135 -0
  24. package/skills/common/agents/code-reviewer.md +78 -0
  25. package/skills/common/agents/planner.md +80 -0
  26. package/skills/common/agents/security-reviewer.md +82 -0
  27. package/skills/common/agents/software-architect.md +81 -0
  28. package/skills/common/manifest.yaml +25 -0
  29. package/skills/common/rules/coding-style.md +39 -0
  30. package/skills/common/rules/git-workflow.md +33 -0
  31. package/skills/common/rules/security.md +25 -0
  32. package/skills/common/skills/architecture/SKILL.md +55 -0
  33. package/skills/common/skills/architecture/context-discovery.md +43 -0
  34. package/skills/common/skills/architecture/examples.md +94 -0
  35. package/skills/common/skills/architecture/pattern-selection.md +68 -0
  36. package/skills/common/skills/architecture/patterns-reference.md +50 -0
  37. package/skills/common/skills/architecture/trade-off-analysis.md +77 -0
  38. package/skills/common/skills/brainstorming/SKILL.md +163 -0
  39. package/skills/common/skills/brainstorming/dynamic-questioning.md +350 -0
  40. package/skills/common/skills/clean-code.md +99 -0
  41. package/skills/common/skills/code-review-checklist.md +86 -0
  42. package/skills/common/skills/plan-writing/SKILL.md +152 -0
  43. package/skills/common/skills/skill-feedback.md +94 -0
  44. package/skills/common/skills/tdd-workflow.md +130 -0
  45. package/skills/common/skills/verification-loop.md +112 -0
  46. package/skills/cpp/agents/cpp-build-resolver.md +90 -0
  47. package/skills/cpp/agents/cpp-reviewer.md +72 -0
  48. package/skills/cpp/manifest.yaml +15 -0
  49. package/skills/cpp/skills/cpp-coding-standards.md +722 -0
  50. package/skills/cpp/skills/cpp-testing.md +323 -0
  51. package/skills/devops/agents/devops-automator.md +376 -0
  52. package/skills/devops/agents/sre.md +90 -0
  53. package/skills/devops/manifest.yaml +20 -0
  54. package/skills/devops/skills/deployment-patterns.md +427 -0
  55. package/skills/devops/skills/deployment-procedures/SKILL.md +241 -0
  56. package/skills/devops/skills/docker-patterns.md +364 -0
  57. package/skills/devops/skills/e2e-testing.md +326 -0
  58. package/skills/devops/skills/github-ops.md +144 -0
  59. package/skills/django/manifest.yaml +16 -0
  60. package/skills/django/skills/django-patterns.md +734 -0
  61. package/skills/django/skills/django-security.md +593 -0
  62. package/skills/django/skills/django-tdd.md +729 -0
  63. package/skills/django/skills/django-verification.md +469 -0
  64. package/skills/dotnet/agents/csharp-reviewer.md +101 -0
  65. package/skills/dotnet/manifest.yaml +14 -0
  66. package/skills/dotnet/skills/csharp-testing.md +321 -0
  67. package/skills/dotnet/skills/dotnet-patterns.md +321 -0
  68. package/skills/go/agents/code-reviewer.md +76 -0
  69. package/skills/go/agents/go-build-resolver.md +94 -0
  70. package/skills/go/agents/go-reviewer.md +76 -0
  71. package/skills/go/manifest.yaml +17 -0
  72. package/skills/go/rules/go-style.md +55 -0
  73. package/skills/go/skills/golang-patterns.md +674 -0
  74. package/skills/go/skills/golang-testing.md +720 -0
  75. package/skills/java/agents/java-build-resolver.md +153 -0
  76. package/skills/java/agents/java-reviewer.md +92 -0
  77. package/skills/java/manifest.yaml +18 -0
  78. package/skills/java/skills/java-coding-standards.md +147 -0
  79. package/skills/java/skills/jpa-patterns.md +151 -0
  80. package/skills/java/skills/springboot-patterns.md +314 -0
  81. package/skills/java/skills/springboot-security.md +272 -0
  82. package/skills/kotlin/agents/kotlin-build-resolver.md +118 -0
  83. package/skills/kotlin/agents/kotlin-reviewer.md +159 -0
  84. package/skills/kotlin/manifest.yaml +17 -0
  85. package/skills/kotlin/skills/kotlin-coroutines-flows.md +284 -0
  86. package/skills/kotlin/skills/kotlin-patterns.md +711 -0
  87. package/skills/kotlin/skills/kotlin-testing.md +824 -0
  88. package/skills/laravel/manifest.yaml +15 -0
  89. package/skills/laravel/skills/laravel-patterns.md +409 -0
  90. package/skills/laravel/skills/laravel-security.md +279 -0
  91. package/skills/laravel/skills/laravel-tdd.md +277 -0
  92. package/skills/laravel/skills/laravel-verification.md +173 -0
  93. package/skills/mobile/agents/dart-build-resolver.md +201 -0
  94. package/skills/mobile/agents/flutter-reviewer.md +243 -0
  95. package/skills/mobile/manifest.yaml +19 -0
  96. package/skills/mobile/skills/android-clean-architecture.md +339 -0
  97. package/skills/mobile/skills/dart-flutter-patterns.md +563 -0
  98. package/skills/mobile/skills/swiftui-patterns.md +259 -0
  99. package/skills/nestjs/manifest.yaml +13 -0
  100. package/skills/nestjs/skills/nestjs-patterns.md +230 -0
  101. package/skills/perl/manifest.yaml +13 -0
  102. package/skills/perl/skills/perl-patterns.md +504 -0
  103. package/skills/perl/skills/perl-security.md +503 -0
  104. package/skills/perl/skills/perl-testing.md +475 -0
  105. package/skills/python/agents/python-reviewer.md +98 -0
  106. package/skills/python/manifest.yaml +18 -0
  107. package/skills/python/rules/python-style.md +69 -0
  108. package/skills/python/skills/python-patterns/SKILL.md +441 -0
  109. package/skills/python/skills/python-patterns.md +90 -0
  110. package/skills/python/skills/python-testing.md +81 -0
  111. package/skills/rust/agents/rust-build-resolver.md +148 -0
  112. package/skills/rust/agents/rust-reviewer.md +94 -0
  113. package/skills/rust/manifest.yaml +16 -0
  114. package/skills/rust/rules/rust-style.md +107 -0
  115. package/skills/rust/skills/rust-patterns.md +499 -0
  116. package/skills/rust/skills/rust-testing.md +500 -0
  117. package/skills/security/agents/accessibility-auditor.md +316 -0
  118. package/skills/security/agents/security-reviewer.md +108 -0
  119. package/skills/security/manifest.yaml +19 -0
  120. package/skills/security/skills/red-team-tactics/SKILL.md +199 -0
  121. package/skills/security/skills/security-bounty-hunter.md +99 -0
  122. package/skills/security/skills/security-review.md +495 -0
  123. package/skills/security/skills/security-scan.md +165 -0
  124. package/skills/security/skills/vulnerability-scanner/SKILL.md +276 -0
  125. package/skills/security/skills/vulnerability-scanner/checklists.md +121 -0
  126. package/skills/security/skills/vulnerability-scanner/scripts/security_scan.py +458 -0
  127. package/skills/swift/manifest.yaml +16 -0
  128. package/skills/swift/skills/swift-actor-persistence.md +142 -0
  129. package/skills/swift/skills/swift-concurrency.md +216 -0
  130. package/skills/swift/skills/swift-protocol-di-testing.md +190 -0
  131. package/skills/swift/skills/swiftui-patterns.md +259 -0
  132. package/skills/unity/agents/game-designer.md +167 -0
  133. package/skills/unity/agents/unity-architect.md +52 -0
  134. package/skills/unity/agents/unity-editor-tool-developer.md +310 -0
  135. package/skills/unity/agents/unity-multiplayer-engineer.md +321 -0
  136. package/skills/unity/agents/unity-shader-graph-artist.md +269 -0
  137. package/skills/unity/manifest.yaml +21 -0
  138. package/skills/unity/rules/csharp-patterns.md +48 -0
  139. package/skills/unity/rules/unity-specific.md +53 -0
  140. package/skills/unity/skills/systematic-debugging.md +92 -0
  141. package/skills/unity/skills/unity-architecture.md +173 -0
  142. package/skills/unreal/agents/level-designer.md +208 -0
  143. package/skills/unreal/agents/technical-artist.md +229 -0
  144. package/skills/unreal/agents/unreal-multiplayer-architect.md +313 -0
  145. package/skills/unreal/agents/unreal-systems-engineer.md +310 -0
  146. package/skills/unreal/agents/unreal-technical-artist.md +256 -0
  147. package/skills/unreal/agents/unreal-world-builder.md +273 -0
  148. package/skills/unreal/manifest.yaml +21 -0
  149. package/skills/unreal/skills/unreal-patterns.md +183 -0
  150. package/skills/web/agents/frontend-specialist.md +71 -0
  151. package/skills/web/agents/ui-designer.md +383 -0
  152. package/skills/web/agents/ux-architect.md +469 -0
  153. package/skills/web/manifest.yaml +22 -0
  154. package/skills/web/rules/accessibility.md +54 -0
  155. package/skills/web/rules/css-performance.md +52 -0
  156. package/skills/web/skills/e2e-testing.md +132 -0
  157. package/skills/web/skills/frontend-design/SKILL.md +452 -0
  158. package/skills/web/skills/frontend-design/animation-guide.md +331 -0
  159. package/skills/web/skills/frontend-design/color-system.md +311 -0
  160. package/skills/web/skills/frontend-design/decision-trees.md +418 -0
  161. package/skills/web/skills/frontend-design/motion-graphics.md +306 -0
  162. package/skills/web/skills/frontend-design/scripts/accessibility_checker.py +183 -0
  163. package/skills/web/skills/frontend-design/scripts/ux_audit.py +722 -0
  164. package/skills/web/skills/frontend-design/typography-system.md +345 -0
  165. package/skills/web/skills/frontend-design/ux-psychology.md +1116 -0
  166. package/skills/web/skills/frontend-design/visual-effects.md +383 -0
  167. package/skills/web/skills/react-nextjs.md +135 -0
  168. package/skills/web/skills/tailwind-patterns/SKILL.md +269 -0
  169. package/src/adapters/antigravity.js +164 -0
  170. package/src/adapters/claude.js +188 -0
  171. package/src/adapters/cursor.js +161 -0
  172. package/src/adapters/index.js +67 -0
  173. package/src/adapters/windsurf.js +158 -0
  174. package/src/commands/add.js +266 -0
  175. package/src/commands/create.js +127 -0
  176. package/src/commands/diff.js +78 -0
  177. package/src/commands/info.js +88 -0
  178. package/src/commands/init.js +224 -0
  179. package/src/commands/install.js +90 -0
  180. package/src/commands/list.js +54 -0
  181. package/src/commands/remove.js +101 -0
  182. package/src/commands/targets.js +32 -0
  183. package/src/commands/update.js +57 -0
  184. package/src/core/manifest.js +57 -0
  185. package/src/core/plugins.js +86 -0
  186. package/src/core/resolver.js +84 -0
  187. package/src/core/tracker.js +49 -0
  188. package/src/utils/fs.js +80 -0
  189. package/src/utils/git.js +52 -0
@@ -0,0 +1,500 @@
1
+ ---
2
+ name: rust-testing
3
+ description: Rust testing patterns including unit tests, integration tests, async testing, property-based testing, mocking, and coverage. Follows TDD methodology.
4
+ origin: ECC
5
+ ---
6
+
7
+ # Rust Testing Patterns
8
+
9
+ Comprehensive Rust testing patterns for writing reliable, maintainable tests following TDD methodology.
10
+
11
+ ## When to Use
12
+
13
+ - Writing new Rust functions, methods, or traits
14
+ - Adding test coverage to existing code
15
+ - Creating benchmarks for performance-critical code
16
+ - Implementing property-based tests for input validation
17
+ - Following TDD workflow in Rust projects
18
+
19
+ ## How It Works
20
+
21
+ 1. **Identify target code** — Find the function, trait, or module to test
22
+ 2. **Write a test** — Use `#[test]` in a `#[cfg(test)]` module, rstest for parameterized tests, or proptest for property-based tests
23
+ 3. **Mock dependencies** — Use mockall to isolate the unit under test
24
+ 4. **Run tests (RED)** — Verify the test fails with the expected error
25
+ 5. **Implement (GREEN)** — Write minimal code to pass
26
+ 6. **Refactor** — Improve while keeping tests green
27
+ 7. **Check coverage** — Use cargo-llvm-cov, target 80%+
28
+
29
+ ## TDD Workflow for Rust
30
+
31
+ ### The RED-GREEN-REFACTOR Cycle
32
+
33
+ ```
34
+ RED → Write a failing test first
35
+ GREEN → Write minimal code to pass the test
36
+ REFACTOR → Improve code while keeping tests green
37
+ REPEAT → Continue with next requirement
38
+ ```
39
+
40
+ ### Step-by-Step TDD in Rust
41
+
42
+ ```rust
43
+ // RED: Write test first, use todo!() as placeholder
44
+ pub fn add(a: i32, b: i32) -> i32 { todo!() }
45
+
46
+ #[cfg(test)]
47
+ mod tests {
48
+ use super::*;
49
+ #[test]
50
+ fn test_add() { assert_eq!(add(2, 3), 5); }
51
+ }
52
+ // cargo test → panics at 'not yet implemented'
53
+ ```
54
+
55
+ ```rust
56
+ // GREEN: Replace todo!() with minimal implementation
57
+ pub fn add(a: i32, b: i32) -> i32 { a + b }
58
+ // cargo test → PASS, then REFACTOR while keeping tests green
59
+ ```
60
+
61
+ ## Unit Tests
62
+
63
+ ### Module-Level Test Organization
64
+
65
+ ```rust
66
+ // src/user.rs
67
+ pub struct User {
68
+ pub name: String,
69
+ pub email: String,
70
+ }
71
+
72
+ impl User {
73
+ pub fn new(name: impl Into<String>, email: impl Into<String>) -> Result<Self, String> {
74
+ let email = email.into();
75
+ if !email.contains('@') {
76
+ return Err(format!("invalid email: {email}"));
77
+ }
78
+ Ok(Self { name: name.into(), email })
79
+ }
80
+
81
+ pub fn display_name(&self) -> &str {
82
+ &self.name
83
+ }
84
+ }
85
+
86
+ #[cfg(test)]
87
+ mod tests {
88
+ use super::*;
89
+
90
+ #[test]
91
+ fn creates_user_with_valid_email() {
92
+ let user = User::new("Alice", "alice@example.com").unwrap();
93
+ assert_eq!(user.display_name(), "Alice");
94
+ assert_eq!(user.email, "alice@example.com");
95
+ }
96
+
97
+ #[test]
98
+ fn rejects_invalid_email() {
99
+ let result = User::new("Bob", "not-an-email");
100
+ assert!(result.is_err());
101
+ assert!(result.unwrap_err().contains("invalid email"));
102
+ }
103
+ }
104
+ ```
105
+
106
+ ### Assertion Macros
107
+
108
+ ```rust
109
+ assert_eq!(2 + 2, 4); // Equality
110
+ assert_ne!(2 + 2, 5); // Inequality
111
+ assert!(vec![1, 2, 3].contains(&2)); // Boolean
112
+ assert_eq!(value, 42, "expected 42 but got {value}"); // Custom message
113
+ assert!((0.1_f64 + 0.2 - 0.3).abs() < f64::EPSILON); // Float comparison
114
+ ```
115
+
116
+ ## Error and Panic Testing
117
+
118
+ ### Testing `Result` Returns
119
+
120
+ ```rust
121
+ #[test]
122
+ fn parse_returns_error_for_invalid_input() {
123
+ let result = parse_config("}{invalid");
124
+ assert!(result.is_err());
125
+
126
+ // Assert specific error variant
127
+ let err = result.unwrap_err();
128
+ assert!(matches!(err, ConfigError::ParseError(_)));
129
+ }
130
+
131
+ #[test]
132
+ fn parse_succeeds_for_valid_input() -> Result<(), Box<dyn std::error::Error>> {
133
+ let config = parse_config(r#"{"port": 8080}"#)?;
134
+ assert_eq!(config.port, 8080);
135
+ Ok(()) // Test fails if any ? returns Err
136
+ }
137
+ ```
138
+
139
+ ### Testing Panics
140
+
141
+ ```rust
142
+ #[test]
143
+ #[should_panic]
144
+ fn panics_on_empty_input() {
145
+ process(&[]);
146
+ }
147
+
148
+ #[test]
149
+ #[should_panic(expected = "index out of bounds")]
150
+ fn panics_with_specific_message() {
151
+ let v: Vec<i32> = vec![];
152
+ let _ = v[0];
153
+ }
154
+ ```
155
+
156
+ ## Integration Tests
157
+
158
+ ### File Structure
159
+
160
+ ```text
161
+ my_crate/
162
+ ├── src/
163
+ │ └── lib.rs
164
+ ├── tests/ # Integration tests
165
+ │ ├── api_test.rs # Each file is a separate test binary
166
+ │ ├── db_test.rs
167
+ │ └── common/ # Shared test utilities
168
+ │ └── mod.rs
169
+ ```
170
+
171
+ ### Writing Integration Tests
172
+
173
+ ```rust
174
+ // tests/api_test.rs
175
+ use my_crate::{App, Config};
176
+
177
+ #[test]
178
+ fn full_request_lifecycle() {
179
+ let config = Config::test_default();
180
+ let app = App::new(config);
181
+
182
+ let response = app.handle_request("/health");
183
+ assert_eq!(response.status, 200);
184
+ assert_eq!(response.body, "OK");
185
+ }
186
+ ```
187
+
188
+ ## Async Tests
189
+
190
+ ### With Tokio
191
+
192
+ ```rust
193
+ #[tokio::test]
194
+ async fn fetches_data_successfully() {
195
+ let client = TestClient::new().await;
196
+ let result = client.get("/data").await;
197
+ assert!(result.is_ok());
198
+ assert_eq!(result.unwrap().items.len(), 3);
199
+ }
200
+
201
+ #[tokio::test]
202
+ async fn handles_timeout() {
203
+ use std::time::Duration;
204
+ let result = tokio::time::timeout(
205
+ Duration::from_millis(100),
206
+ slow_operation(),
207
+ ).await;
208
+
209
+ assert!(result.is_err(), "should have timed out");
210
+ }
211
+ ```
212
+
213
+ ## Test Organization Patterns
214
+
215
+ ### Parameterized Tests with `rstest`
216
+
217
+ ```rust
218
+ use rstest::{rstest, fixture};
219
+
220
+ #[rstest]
221
+ #[case("hello", 5)]
222
+ #[case("", 0)]
223
+ #[case("rust", 4)]
224
+ fn test_string_length(#[case] input: &str, #[case] expected: usize) {
225
+ assert_eq!(input.len(), expected);
226
+ }
227
+
228
+ // Fixtures
229
+ #[fixture]
230
+ fn test_db() -> TestDb {
231
+ TestDb::new_in_memory()
232
+ }
233
+
234
+ #[rstest]
235
+ fn test_insert(test_db: TestDb) {
236
+ test_db.insert("key", "value");
237
+ assert_eq!(test_db.get("key"), Some("value".into()));
238
+ }
239
+ ```
240
+
241
+ ### Test Helpers
242
+
243
+ ```rust
244
+ #[cfg(test)]
245
+ mod tests {
246
+ use super::*;
247
+
248
+ /// Creates a test user with sensible defaults.
249
+ fn make_user(name: &str) -> User {
250
+ User::new(name, &format!("{name}@test.com")).unwrap()
251
+ }
252
+
253
+ #[test]
254
+ fn user_display() {
255
+ let user = make_user("alice");
256
+ assert_eq!(user.display_name(), "alice");
257
+ }
258
+ }
259
+ ```
260
+
261
+ ## Property-Based Testing with `proptest`
262
+
263
+ ### Basic Property Tests
264
+
265
+ ```rust
266
+ use proptest::prelude::*;
267
+
268
+ proptest! {
269
+ #[test]
270
+ fn encode_decode_roundtrip(input in ".*") {
271
+ let encoded = encode(&input);
272
+ let decoded = decode(&encoded).unwrap();
273
+ assert_eq!(input, decoded);
274
+ }
275
+
276
+ #[test]
277
+ fn sort_preserves_length(mut vec in prop::collection::vec(any::<i32>(), 0..100)) {
278
+ let original_len = vec.len();
279
+ vec.sort();
280
+ assert_eq!(vec.len(), original_len);
281
+ }
282
+
283
+ #[test]
284
+ fn sort_produces_ordered_output(mut vec in prop::collection::vec(any::<i32>(), 0..100)) {
285
+ vec.sort();
286
+ for window in vec.windows(2) {
287
+ assert!(window[0] <= window[1]);
288
+ }
289
+ }
290
+ }
291
+ ```
292
+
293
+ ### Custom Strategies
294
+
295
+ ```rust
296
+ use proptest::prelude::*;
297
+
298
+ fn valid_email() -> impl Strategy<Value = String> {
299
+ ("[a-z]{1,10}", "[a-z]{1,5}")
300
+ .prop_map(|(user, domain)| format!("{user}@{domain}.com"))
301
+ }
302
+
303
+ proptest! {
304
+ #[test]
305
+ fn accepts_valid_emails(email in valid_email()) {
306
+ assert!(User::new("Test", &email).is_ok());
307
+ }
308
+ }
309
+ ```
310
+
311
+ ## Mocking with `mockall`
312
+
313
+ ### Trait-Based Mocking
314
+
315
+ ```rust
316
+ use mockall::{automock, predicate::eq};
317
+
318
+ #[automock]
319
+ trait UserRepository {
320
+ fn find_by_id(&self, id: u64) -> Option<User>;
321
+ fn save(&self, user: &User) -> Result<(), StorageError>;
322
+ }
323
+
324
+ #[test]
325
+ fn service_returns_user_when_found() {
326
+ let mut mock = MockUserRepository::new();
327
+ mock.expect_find_by_id()
328
+ .with(eq(42))
329
+ .times(1)
330
+ .returning(|_| Some(User { id: 42, name: "Alice".into() }));
331
+
332
+ let service = UserService::new(Box::new(mock));
333
+ let user = service.get_user(42).unwrap();
334
+ assert_eq!(user.name, "Alice");
335
+ }
336
+
337
+ #[test]
338
+ fn service_returns_none_when_not_found() {
339
+ let mut mock = MockUserRepository::new();
340
+ mock.expect_find_by_id()
341
+ .returning(|_| None);
342
+
343
+ let service = UserService::new(Box::new(mock));
344
+ assert!(service.get_user(99).is_none());
345
+ }
346
+ ```
347
+
348
+ ## Doc Tests
349
+
350
+ ### Executable Documentation
351
+
352
+ ```rust
353
+ /// Adds two numbers together.
354
+ ///
355
+ /// # Examples
356
+ ///
357
+ /// ```
358
+ /// use my_crate::add;
359
+ ///
360
+ /// assert_eq!(add(2, 3), 5);
361
+ /// assert_eq!(add(-1, 1), 0);
362
+ /// ```
363
+ pub fn add(a: i32, b: i32) -> i32 {
364
+ a + b
365
+ }
366
+
367
+ /// Parses a config string.
368
+ ///
369
+ /// # Errors
370
+ ///
371
+ /// Returns `Err` if the input is not valid TOML.
372
+ ///
373
+ /// ```no_run
374
+ /// use my_crate::parse_config;
375
+ ///
376
+ /// let config = parse_config(r#"port = 8080"#).unwrap();
377
+ /// assert_eq!(config.port, 8080);
378
+ /// ```
379
+ ///
380
+ /// ```no_run
381
+ /// use my_crate::parse_config;
382
+ ///
383
+ /// assert!(parse_config("}{invalid").is_err());
384
+ /// ```
385
+ pub fn parse_config(input: &str) -> Result<Config, ParseError> {
386
+ todo!()
387
+ }
388
+ ```
389
+
390
+ ## Benchmarking with Criterion
391
+
392
+ ```toml
393
+ # Cargo.toml
394
+ [dev-dependencies]
395
+ criterion = { version = "0.5", features = ["html_reports"] }
396
+
397
+ [[bench]]
398
+ name = "benchmark"
399
+ harness = false
400
+ ```
401
+
402
+ ```rust
403
+ // benches/benchmark.rs
404
+ use criterion::{black_box, criterion_group, criterion_main, Criterion};
405
+
406
+ fn fibonacci(n: u64) -> u64 {
407
+ match n {
408
+ 0 | 1 => n,
409
+ _ => fibonacci(n - 1) + fibonacci(n - 2),
410
+ }
411
+ }
412
+
413
+ fn bench_fibonacci(c: &mut Criterion) {
414
+ c.bench_function("fib 20", |b| b.iter(|| fibonacci(black_box(20))));
415
+ }
416
+
417
+ criterion_group!(benches, bench_fibonacci);
418
+ criterion_main!(benches);
419
+ ```
420
+
421
+ ## Test Coverage
422
+
423
+ ### Running Coverage
424
+
425
+ ```bash
426
+ # Install: cargo install cargo-llvm-cov (or use taiki-e/install-action in CI)
427
+ cargo llvm-cov # Summary
428
+ cargo llvm-cov --html # HTML report
429
+ cargo llvm-cov --lcov > lcov.info # LCOV format for CI
430
+ cargo llvm-cov --fail-under-lines 80 # Fail if below threshold
431
+ ```
432
+
433
+ ### Coverage Targets
434
+
435
+ | Code Type | Target |
436
+ |-----------|--------|
437
+ | Critical business logic | 100% |
438
+ | Public API | 90%+ |
439
+ | General code | 80%+ |
440
+ | Generated / FFI bindings | Exclude |
441
+
442
+ ## Testing Commands
443
+
444
+ ```bash
445
+ cargo test # Run all tests
446
+ cargo test -- --nocapture # Show println output
447
+ cargo test test_name # Run tests matching pattern
448
+ cargo test --lib # Unit tests only
449
+ cargo test --test api_test # Integration tests only
450
+ cargo test --doc # Doc tests only
451
+ cargo test --no-fail-fast # Don't stop on first failure
452
+ cargo test -- --ignored # Run ignored tests
453
+ ```
454
+
455
+ ## Best Practices
456
+
457
+ **DO:**
458
+ - Write tests FIRST (TDD)
459
+ - Use `#[cfg(test)]` modules for unit tests
460
+ - Test behavior, not implementation
461
+ - Use descriptive test names that explain the scenario
462
+ - Prefer `assert_eq!` over `assert!` for better error messages
463
+ - Use `?` in tests that return `Result` for cleaner error output
464
+ - Keep tests independent — no shared mutable state
465
+
466
+ **DON'T:**
467
+ - Use `#[should_panic]` when you can test `Result::is_err()` instead
468
+ - Mock everything — prefer integration tests when feasible
469
+ - Ignore flaky tests — fix or quarantine them
470
+ - Use `sleep()` in tests — use channels, barriers, or `tokio::time::pause()`
471
+ - Skip error path testing
472
+
473
+ ## CI Integration
474
+
475
+ ```yaml
476
+ # GitHub Actions
477
+ test:
478
+ runs-on: ubuntu-latest
479
+ steps:
480
+ - uses: actions/checkout@v4
481
+ - uses: dtolnay/rust-toolchain@stable
482
+ with:
483
+ components: clippy, rustfmt
484
+
485
+ - name: Check formatting
486
+ run: cargo fmt --check
487
+
488
+ - name: Clippy
489
+ run: cargo clippy -- -D warnings
490
+
491
+ - name: Run tests
492
+ run: cargo test
493
+
494
+ - uses: taiki-e/install-action@cargo-llvm-cov
495
+
496
+ - name: Coverage
497
+ run: cargo llvm-cov --fail-under-lines 80
498
+ ```
499
+
500
+ **Remember**: Tests are documentation. They show how your code is meant to be used. Write them clearly and keep them up to date.