1#[cfg(test)]
5mod tests {
6 use crate::{
7 LearningManager, Decision, DecisionContext, RuleScope, PatternValidator,
8 };
9 use std::path::PathBuf;
10
11 fn create_test_decision(
12 decision_type: &str,
13 input: serde_json::Value,
14 output: serde_json::Value,
15 ) -> Decision {
16 let context = DecisionContext {
17 project_path: PathBuf::from("/project"),
18 file_path: PathBuf::from("/project/src/main.rs"),
19 line_number: 10,
20 agent_type: "test_agent".to_string(),
21 };
22
23 Decision::new(context, decision_type.to_string(), input, output)
24 }
25
26 #[tokio::test]
27 async fn test_pattern_validation_workflow() {
28 let manager = LearningManager::new(RuleScope::Session);
29
30 let decision1 = create_test_decision(
32 "code_generation",
33 serde_json::json!({"input": "test"}),
34 serde_json::json!({"output": "result"}),
35 );
36
37 let decision2 = create_test_decision(
38 "code_generation",
39 serde_json::json!({"input": "test"}),
40 serde_json::json!({"output": "result"}),
41 );
42
43 let decision3 = create_test_decision(
44 "code_generation",
45 serde_json::json!({"input": "test"}),
46 serde_json::json!({"output": "result"}),
47 );
48
49 manager.capture_decision(decision1).await.unwrap();
51 manager.capture_decision(decision2).await.unwrap();
52 manager.capture_decision(decision3).await.unwrap();
53
54 let patterns = manager.extract_patterns().await.unwrap();
56 assert_eq!(patterns.len(), 1);
57
58 let pattern_id = patterns[0].id.clone();
60 manager.store_pattern(patterns[0].clone()).await.unwrap();
61
62 let validation_result = manager
64 .validate_pattern_comprehensive(&patterns[0])
65 .await
66 .unwrap();
67
68 assert!(validation_result.is_valid);
69 assert!(validation_result.validation_score > 0.7);
70 assert_eq!(validation_result.matching_decisions, 3);
71
72 manager
74 .update_pattern_confidence(&pattern_id, validation_result.confidence_recommendation)
75 .await
76 .unwrap();
77
78 let updated_pattern = manager.get_pattern(&pattern_id).await.unwrap();
80 assert!(updated_pattern.confidence > 0.0);
81 }
82
83 #[tokio::test]
84 async fn test_pattern_validation_with_mismatches() {
85 let manager = LearningManager::new(RuleScope::Session);
86
87 let decision1 = create_test_decision(
89 "code_generation",
90 serde_json::json!({"input": "test"}),
91 serde_json::json!({"output": "result"}),
92 );
93
94 let decision2 = create_test_decision(
95 "code_generation",
96 serde_json::json!({"input": "test"}),
97 serde_json::json!({"output": "result"}),
98 );
99
100 let decision3 = create_test_decision(
101 "code_generation",
102 serde_json::json!({"input": "different"}),
103 serde_json::json!({"output": "different"}),
104 );
105
106 let decision4 = create_test_decision(
107 "code_generation",
108 serde_json::json!({"input": "test"}),
109 serde_json::json!({"output": "result"}),
110 );
111
112 manager.capture_decision(decision1).await.unwrap();
114 manager.capture_decision(decision2).await.unwrap();
115 manager.capture_decision(decision3).await.unwrap();
116 manager.capture_decision(decision4).await.unwrap();
117
118 let patterns = manager.extract_patterns().await.unwrap();
120 assert_eq!(patterns.len(), 1);
121
122 let pattern_id = patterns[0].id.clone();
124 manager.store_pattern(patterns[0].clone()).await.unwrap();
125
126 let validation_result = manager
128 .validate_pattern_comprehensive(&patterns[0])
129 .await
130 .unwrap();
131
132 assert!(validation_result.is_valid);
134 assert!(validation_result.validation_score > 0.7);
135 assert_eq!(validation_result.matching_decisions, 3);
136 assert_eq!(validation_result.mismatches.len(), 1);
137 }
138
139 #[tokio::test]
140 async fn test_validate_and_update_pattern() {
141 let manager = LearningManager::new(RuleScope::Session);
142
143 let decision1 = create_test_decision(
145 "code_generation",
146 serde_json::json!({"input": "test"}),
147 serde_json::json!({"output": "result"}),
148 );
149
150 let decision2 = create_test_decision(
151 "code_generation",
152 serde_json::json!({"input": "test"}),
153 serde_json::json!({"output": "result"}),
154 );
155
156 manager.capture_decision(decision1).await.unwrap();
158 manager.capture_decision(decision2).await.unwrap();
159
160 let patterns = manager.extract_patterns().await.unwrap();
162 let pattern_id = patterns[0].id.clone();
163 manager.store_pattern(patterns[0].clone()).await.unwrap();
164
165 let initial_pattern = manager.get_pattern(&pattern_id).await.unwrap();
167 let initial_confidence = initial_pattern.confidence;
168
169 let validation_result = manager.validate_and_update_pattern(&pattern_id).await.unwrap();
171
172 assert!(validation_result.is_valid);
173
174 let updated_pattern = manager.get_pattern(&pattern_id).await.unwrap();
176 assert_ne!(updated_pattern.confidence, initial_confidence);
177 }
178
179 #[tokio::test]
180 async fn test_validate_multiple_patterns() {
181 let manager = LearningManager::new(RuleScope::Session);
182
183 let decision1 = create_test_decision(
186 "code_generation",
187 serde_json::json!({"input": "test"}),
188 serde_json::json!({"output": "result"}),
189 );
190
191 let decision2 = create_test_decision(
192 "code_generation",
193 serde_json::json!({"input": "test"}),
194 serde_json::json!({"output": "result"}),
195 );
196
197 let decision3 = create_test_decision(
198 "code_generation",
199 serde_json::json!({"input": "test"}),
200 serde_json::json!({"output": "result"}),
201 );
202
203 let decision4 = create_test_decision(
204 "refactoring",
205 serde_json::json!({"input": "test"}),
206 serde_json::json!({"output": "result"}),
207 );
208
209 let decision5 = create_test_decision(
210 "refactoring",
211 serde_json::json!({"input": "test"}),
212 serde_json::json!({"output": "result"}),
213 );
214
215 let decision6 = create_test_decision(
216 "refactoring",
217 serde_json::json!({"input": "test"}),
218 serde_json::json!({"output": "result"}),
219 );
220
221 manager.capture_decision(decision1).await.unwrap();
223 manager.capture_decision(decision2).await.unwrap();
224 manager.capture_decision(decision3).await.unwrap();
225 manager.capture_decision(decision4).await.unwrap();
226 manager.capture_decision(decision5).await.unwrap();
227 manager.capture_decision(decision6).await.unwrap();
228
229 let patterns = manager.extract_patterns().await.unwrap();
231 assert_eq!(patterns.len(), 2);
232
233 for pattern in &patterns {
235 manager.store_pattern(pattern.clone()).await.unwrap();
236 }
237
238 let validation_results = manager.validate_patterns(&patterns).await.unwrap();
240
241 assert_eq!(validation_results.len(), 2);
242 for result in &validation_results {
247 assert!(result.validation_score >= 0.0 && result.validation_score <= 1.0);
249 }
250 }
251
252 #[tokio::test]
253 async fn test_pattern_validation_statistics() {
254 let manager = LearningManager::new(RuleScope::Session);
255
256 let decision1 = create_test_decision(
258 "code_generation",
259 serde_json::json!({"input": "test"}),
260 serde_json::json!({"output": "result"}),
261 );
262
263 let decision2 = create_test_decision(
264 "code_generation",
265 serde_json::json!({"input": "test"}),
266 serde_json::json!({"output": "result"}),
267 );
268
269 manager.capture_decision(decision1).await.unwrap();
271 manager.capture_decision(decision2).await.unwrap();
272
273 let patterns = manager.extract_patterns().await.unwrap();
275 for pattern in &patterns {
276 manager.store_pattern(pattern.clone()).await.unwrap();
277 }
278
279 let stats = manager.get_pattern_validation_statistics().await.unwrap();
281
282 assert_eq!(stats.total_patterns, 1);
283 assert_eq!(stats.valid_patterns, 1);
284 assert_eq!(stats.invalid_patterns, 0);
285 assert!(stats.average_validation_score > 0.7);
286 }
287
288 #[tokio::test]
289 async fn test_pattern_validator_directly() {
290 let validator = PatternValidator::new();
291
292 let mut pattern = crate::LearnedPattern::new(
294 "code_generation".to_string(),
295 "Test pattern".to_string(),
296 );
297
298 pattern.examples.push(crate::PatternExample {
299 input: serde_json::json!({"input": "test"}),
300 output: serde_json::json!({"output": "result"}),
301 context: serde_json::json!({}),
302 });
303
304 let decision1 = create_test_decision(
306 "code_generation",
307 serde_json::json!({"input": "test"}),
308 serde_json::json!({"output": "result"}),
309 );
310
311 let decision2 = create_test_decision(
312 "code_generation",
313 serde_json::json!({"input": "test"}),
314 serde_json::json!({"output": "result"}),
315 );
316
317 let result = validator
319 .validate_pattern(&pattern, &[decision1, decision2])
320 .unwrap();
321
322 assert!(result.is_valid);
323 assert_eq!(result.matching_decisions, 2);
324 assert!(result.confidence_recommendation > 0.4);
328 }
329
330 #[tokio::test]
331 async fn test_pattern_validation_with_no_decisions() {
332 let manager = LearningManager::new(RuleScope::Session);
333
334 let pattern = crate::LearnedPattern::new(
336 "code_generation".to_string(),
337 "Test pattern".to_string(),
338 );
339
340 let validation_result = manager
342 .validate_pattern_comprehensive(&pattern)
343 .await
344 .unwrap();
345
346 assert!(!validation_result.is_valid);
347 assert_eq!(validation_result.validation_score, 0.0);
348 assert_eq!(validation_result.matching_decisions, 0);
349 }
350
351 #[tokio::test]
352 async fn test_pattern_validation_confidence_update_workflow() {
353 let manager = LearningManager::new(RuleScope::Session);
354
355 let decision1 = create_test_decision(
357 "code_generation",
358 serde_json::json!({"input": "test"}),
359 serde_json::json!({"output": "result"}),
360 );
361
362 let decision2 = create_test_decision(
363 "code_generation",
364 serde_json::json!({"input": "test"}),
365 serde_json::json!({"output": "result"}),
366 );
367
368 manager.capture_decision(decision1).await.unwrap();
370 manager.capture_decision(decision2).await.unwrap();
371
372 let patterns = manager.extract_patterns().await.unwrap();
374 let pattern_id = patterns[0].id.clone();
375 manager.store_pattern(patterns[0].clone()).await.unwrap();
376
377 let initial_pattern = manager.get_pattern(&pattern_id).await.unwrap();
379 let initial_confidence = initial_pattern.confidence;
380
381 let validation_result = manager
383 .validate_pattern_comprehensive(&patterns[0])
384 .await
385 .unwrap();
386
387 manager
389 .update_pattern_confidence(&pattern_id, 0.9)
390 .await
391 .unwrap();
392
393 let final_pattern = manager.get_pattern(&pattern_id).await.unwrap();
395 assert!(final_pattern.confidence > initial_confidence);
396 }
397}