1#[cfg(test)]
10mod tests {
11 use super::*;
12 use crate::types::{GroupId, NodeId, Position};
13 use crate::graph::{Graph, Node};
14 use crate::groups::manager::GroupManager;
15 use std::collections::HashSet;
16
17 fn create_test_nodes() -> Vec<NodeId> {
18 vec![
19 NodeId::new("node1"),
20 NodeId::new("node2"),
21 NodeId::new("node3"),
22 ]
23 }
24
25 #[test]
26 fn test_create_group_from_nodes() {
27 let mut manager = GroupManager::new();
28 let nodes = create_test_nodes();
29 let members: HashSet<NodeId> = nodes.into_iter().take(2).collect();
30 let group_id = GroupId::new("test_group");
31
32 let result = manager.create_group(group_id.clone(), members.clone());
33
34 assert!(result.is_ok());
35
36 let group = manager.get_group(&group_id).unwrap();
37 assert_eq!(group.members.len(), 2);
38 assert!(group.contains_node(&NodeId::new("node1")));
39 assert!(group.contains_node(&NodeId::new("node2")));
40 }
41
42 #[test]
43 fn test_empty_group_creation_fails() {
44 let mut manager = GroupManager::new();
45 let empty_members = HashSet::new();
46 let group_id = GroupId::new("empty_group");
47
48 let result = manager.create_group(group_id, empty_members);
49
50 assert!(result.is_err());
51 assert!(matches!(result, Err(crate::error::FlowError::InvalidOperation { .. })));
52 }
53
54 #[test]
55 fn test_node_already_in_group_fails() {
56 let mut manager = GroupManager::new();
57 let nodes = create_test_nodes();
58 let members1: HashSet<NodeId> = [nodes[0].clone()].into_iter().collect();
59 let members2: HashSet<NodeId> = [nodes[0].clone()].into_iter().collect();
60
61 let group_id1 = GroupId::new("group1");
62 let group_id2 = GroupId::new("group2");
63
64 manager.create_group(group_id1, members1).unwrap();
65
66 let result = manager.create_group(group_id2, members2);
67 assert!(result.is_err());
68 }
69
70 #[test]
71 fn test_duplicate_group_creation_fails() {
72 let mut manager = GroupManager::new();
73 let nodes = create_test_nodes();
74 let members: HashSet<NodeId> = [nodes[0].clone()].into_iter().collect();
75 let group_id = GroupId::new("duplicate_group");
76
77 manager.create_group(group_id.clone(), members.clone()).unwrap();
78
79 let result = manager.create_group(group_id, members);
80 assert!(result.is_err());
81 }
82
83 #[test]
84 fn test_get_group() {
85 let mut manager = GroupManager::new();
86 let nodes = create_test_nodes();
87 let members: HashSet<NodeId> = [nodes[0].clone()].into_iter().collect();
88 let group_id = GroupId::new("test_group");
89
90 manager.create_group(group_id.clone(), members).unwrap();
91
92 let group = manager.get_group(&group_id);
93 assert!(group.is_some());
94 assert_eq!(group.unwrap().id, group_id);
95 }
96
97 #[test]
98 fn test_get_nonexistent_group() {
99 let manager = GroupManager::new();
100 let group_id = GroupId::new("nonexistent");
101
102 let group = manager.get_group(&group_id);
103 assert!(group.is_none());
104 }
105
106 #[test]
107 fn test_get_node_group() {
108 let mut manager = GroupManager::new();
109 let nodes = create_test_nodes();
110 let members: HashSet<NodeId> = [nodes[0].clone()].into_iter().collect();
111 let group_id = GroupId::new("test_group");
112
113 manager.create_group(group_id.clone(), members).unwrap();
114
115 let node_group = manager.get_node_group(&nodes[0]);
116 assert!(node_group.is_some());
117 assert_eq!(node_group.unwrap(), &group_id);
118 }
119
120 #[test]
121 fn test_get_ungrouped_node() {
122 let manager = GroupManager::new();
123 let node_id = NodeId::new("ungrouped");
124
125 let node_group = manager.get_node_group(&node_id);
126 assert!(node_group.is_none());
127 }
128
129 #[test]
130 fn test_dissolve_group() {
131 let mut manager = GroupManager::new();
132 let nodes = create_test_nodes();
133 let members: HashSet<NodeId> = nodes.iter().take(2).cloned().collect();
134 let group_id = GroupId::new("test_group");
135
136 manager.create_group(group_id.clone(), members.clone()).unwrap();
137 assert_eq!(manager.group_count(), 1);
138
139 let dissolved_members = manager.dissolve_group(&group_id).unwrap();
140 assert_eq!(dissolved_members, members);
141 assert_eq!(manager.group_count(), 0);
142
143 for node_id in &members {
145 assert!(manager.get_node_group(node_id).is_none());
146 }
147 }
148
149 #[test]
150 fn test_dissolve_nonexistent_group() {
151 let mut manager = GroupManager::new();
152 let group_id = GroupId::new("nonexistent");
153
154 let result = manager.dissolve_group(&group_id);
155 assert!(result.is_err());
156 }
157
158 #[test]
159 fn test_add_node_to_group() {
160 let mut manager = GroupManager::new();
161 let nodes = create_test_nodes();
162 let initial_members: HashSet<NodeId> = [nodes[0].clone()].into_iter().collect();
163 let group_id = GroupId::new("test_group");
164
165 manager.create_group(group_id.clone(), initial_members).unwrap();
166
167 let result = manager.add_node_to_group(&group_id, nodes[1].clone());
168 assert!(result.is_ok());
169
170 let group = manager.get_group(&group_id).unwrap();
171 assert_eq!(group.member_count(), 2);
172 assert!(group.contains_node(&nodes[1]));
173 assert!(manager.get_node_group(&nodes[1]).is_some());
174 }
175
176 #[test]
177 fn test_add_node_to_nonexistent_group() {
178 let mut manager = GroupManager::new();
179 let node_id = NodeId::new("test_node");
180 let group_id = GroupId::new("nonexistent");
181
182 let result = manager.add_node_to_group(&group_id, node_id);
183 assert!(result.is_err());
184 }
185
186 #[test]
187 fn test_add_node_already_in_group() {
188 let mut manager = GroupManager::new();
189 let nodes = create_test_nodes();
190 let members: HashSet<NodeId> = [nodes[0].clone()].into_iter().collect();
191 let group_id = GroupId::new("test_group");
192
193 manager.create_group(group_id.clone(), members).unwrap();
194
195 let result = manager.add_node_to_group(&group_id, nodes[0].clone());
196 assert!(result.is_err());
197 }
198
199 #[test]
200 fn test_remove_node_from_group() {
201 let mut manager = GroupManager::new();
202 let nodes = create_test_nodes();
203 let members: HashSet<NodeId> = nodes.iter().take(2).cloned().collect();
204 let group_id = GroupId::new("test_group");
205
206 manager.create_group(group_id.clone(), members.clone()).unwrap();
207
208 let result = manager.remove_node_from_group(&group_id, &nodes[0]);
209 assert!(result.is_ok());
210
211 let group = manager.get_group(&group_id).unwrap();
212 assert_eq!(group.member_count(), 1);
213 assert!(!group.contains_node(&nodes[0]));
214 assert!(manager.get_node_group(&nodes[0]).is_none());
215 }
216
217 #[test]
218 fn test_remove_node_from_nonexistent_group() {
219 let mut manager = GroupManager::new();
220 let node_id = NodeId::new("test_node");
221 let group_id = GroupId::new("nonexistent");
222
223 let result = manager.remove_node_from_group(&group_id, &node_id);
224 assert!(result.is_err());
225 }
226
227 #[test]
228 fn test_remove_node_not_in_group() {
229 let mut manager = GroupManager::new();
230 let nodes = create_test_nodes();
231 let members: HashSet<NodeId> = [nodes[0].clone()].into_iter().collect();
232 let group_id = GroupId::new("test_group");
233
234 manager.create_group(group_id.clone(), members).unwrap();
235
236 let result = manager.remove_node_from_group(&group_id, &nodes[1]);
237 assert!(result.is_err());
238 }
239
240 #[test]
241 fn test_remove_last_node_dissolves_group() {
242 let mut manager = GroupManager::new();
243 let node_id = NodeId::new("test_node");
244 let members: HashSet<NodeId> = [node_id.clone()].into_iter().collect();
245 let group_id = GroupId::new("test_group");
246
247 manager.create_group(group_id.clone(), members).unwrap();
248 assert_eq!(manager.group_count(), 1);
249
250 let result = manager.remove_node_from_group(&group_id, &node_id);
251 assert!(result.is_ok());
252 assert_eq!(manager.group_count(), 0);
253 assert!(manager.get_group(&group_id).is_none());
254 }
255
256 #[test]
257 fn test_set_group_name() {
258 let mut manager = GroupManager::new();
259 let nodes = create_test_nodes();
260 let members: HashSet<NodeId> = [nodes[0].clone()].into_iter().collect();
261 let group_id = GroupId::new("test_group");
262
263 manager.create_group(group_id.clone(), members).unwrap();
264
265 let result = manager.set_group_name(&group_id, Some("New Name".to_string()));
266 assert!(result.is_ok());
267
268 let group = manager.get_group(&group_id).unwrap();
269 assert_eq!(group.name, Some("New Name".to_string()));
270 }
271
272 #[test]
273 fn test_set_group_name_nonexistent() {
274 let mut manager = GroupManager::new();
275 let group_id = GroupId::new("nonexistent");
276
277 let result = manager.set_group_name(&group_id, Some("Name".to_string()));
278 assert!(result.is_err());
279 }
280
281 #[test]
282 fn test_calculate_group_bounds() {
283 let mut manager = GroupManager::new();
284 let mut graph = Graph::<(), ()>::new();
285
286 let mut node1 = Node::simple("node1", Position::new(100.0, 100.0));
288 let mut node2 = Node::simple("node2", Position::new(200.0, 150.0));
289 node1.set_size(crate::types::Size::new(50.0, 30.0));
290 node2.set_size(crate::types::Size::new(50.0, 30.0));
291 graph.add_node(node1).unwrap();
292 graph.add_node(node2).unwrap();
293
294 let members: HashSet<NodeId> = ["node1", "node2"].iter().map(|&s| NodeId::new(s)).collect();
295 let group_id = GroupId::new("test_group");
296 manager.create_group(group_id.clone(), members).unwrap();
297
298 let result = manager.calculate_group_bounds(&group_id, &graph);
299 assert!(result.is_ok());
300
301 let group = manager.get_group(&group_id).unwrap();
302 assert_eq!(group.position, Position::new(100.0, 100.0));
303 assert_eq!(group.size.width, 150.0); assert_eq!(group.size.height, 80.0); }
306
307 #[test]
308 fn test_calculate_group_bounds_nonexistent() {
309 let mut manager = GroupManager::new();
310 let graph = Graph::<(), ()>::new();
311 let group_id = GroupId::new("nonexistent");
312
313 let result = manager.calculate_group_bounds(&group_id, &graph);
314 assert!(result.is_err());
315 }
316
317 #[test]
318 fn test_group_bounds_empty_group() {
319 let mut manager = GroupManager::new();
320 let graph = Graph::<(), ()>::new();
321 let group_id = GroupId::new("empty_group");
322
323 let empty_members = HashSet::new();
325 let result = manager.create_group(group_id.clone(), empty_members);
326 assert!(result.is_err()); }
328
329 #[test]
330 fn test_group_ids() {
331 let mut manager = GroupManager::new();
332 let nodes = create_test_nodes();
333
334 let group_id1 = GroupId::new("group1");
335 let group_id2 = GroupId::new("group2");
336 let members1: HashSet<NodeId> = [nodes[0].clone()].into_iter().collect();
337 let members2: HashSet<NodeId> = [nodes[1].clone()].into_iter().collect();
338
339 manager.create_group(group_id1.clone(), members1).unwrap();
340 manager.create_group(group_id2.clone(), members2).unwrap();
341
342 let group_ids = manager.group_ids();
343 assert_eq!(group_ids.len(), 2);
344 assert!(group_ids.contains(&group_id1));
345 assert!(group_ids.contains(&group_id2));
346 }
347
348 #[test]
349 fn test_has_group() {
350 let mut manager = GroupManager::new();
351 let nodes = create_test_nodes();
352 let members: HashSet<NodeId> = [nodes[0].clone()].into_iter().collect();
353 let group_id = GroupId::new("test_group");
354
355 assert!(!manager.has_group(&group_id));
356
357 manager.create_group(group_id.clone(), members).unwrap();
358
359 assert!(manager.has_group(&group_id));
360 }
361
362 #[test]
363 fn test_group_count() {
364 let mut manager = GroupManager::new();
365 let nodes = create_test_nodes();
366
367 assert_eq!(manager.group_count(), 0);
368
369 let group_id1 = GroupId::new("group1");
370 let group_id2 = GroupId::new("group2");
371 let members1: HashSet<NodeId> = [nodes[0].clone()].into_iter().collect();
372 let members2: HashSet<NodeId> = [nodes[1].clone()].into_iter().collect();
373
374 manager.create_group(group_id1, members1).unwrap();
375 assert_eq!(manager.group_count(), 1);
376
377 manager.create_group(group_id2, members2).unwrap();
378 assert_eq!(manager.group_count(), 2);
379 }
380
381 #[test]
382 fn test_is_node_grouped() {
383 let mut manager = GroupManager::new();
384 let nodes = create_test_nodes();
385 let members: HashSet<NodeId> = [nodes[0].clone()].into_iter().collect();
386 let group_id = GroupId::new("test_group");
387
388 assert!(!manager.is_node_grouped(&nodes[0]));
389
390 manager.create_group(group_id, members).unwrap();
391
392 assert!(manager.is_node_grouped(&nodes[0]));
393 assert!(!manager.is_node_grouped(&nodes[1]));
394 }
395
396 #[test]
399 fn test_start_group_drag() {
400 let mut manager = GroupManager::new();
401 let mut graph = Graph::<(), ()>::new();
402
403 let node1 = Node::simple("node1", Position::new(100.0, 100.0));
404 graph.add_node(node1).unwrap();
405
406 let members: HashSet<NodeId> = [NodeId::new("node1")].into_iter().collect();
407 let group_id = GroupId::new("test_group");
408 manager.create_group(group_id.clone(), members).unwrap();
409
410 let result = manager.start_group_drag(&group_id, Position::zero(), &graph);
411 assert!(result.is_ok());
412 assert!(manager.is_group_dragging());
413 assert_eq!(manager.get_dragging_group(), Some(&group_id));
414 }
415
416 #[test]
417 fn test_start_group_drag_nonexistent() {
418 let mut manager = GroupManager::new();
419 let graph = Graph::<(), ()>::new();
420 let group_id = GroupId::new("nonexistent");
421
422 let result = manager.start_group_drag(&group_id, Position::zero(), &graph);
423 assert!(result.is_err());
424 }
425
426 #[test]
427 fn test_start_group_drag_already_dragging() {
428 let mut manager = GroupManager::new();
429 let mut graph = Graph::<(), ()>::new();
430
431 let node1 = Node::simple("node1", Position::new(100.0, 100.0));
432 graph.add_node(node1).unwrap();
433
434 let members: HashSet<NodeId> = [NodeId::new("node1")].into_iter().collect();
435 let group_id = GroupId::new("test_group");
436 manager.create_group(group_id.clone(), members).unwrap();
437
438 manager.start_group_drag(&group_id, Position::zero(), &graph).unwrap();
439
440 let result = manager.start_group_drag(&group_id, Position::zero(), &graph);
441 assert!(result.is_err());
442 }
443
444 #[test]
445 fn test_update_group_drag() {
446 let mut manager = GroupManager::new();
447 let mut graph = Graph::<(), ()>::new();
448
449 let node1 = Node::simple("node1", Position::new(100.0, 100.0));
450 let node2 = Node::simple("node2", Position::new(200.0, 150.0));
451 graph.add_node(node1).unwrap();
452 graph.add_node(node2).unwrap();
453
454 let members: HashSet<NodeId> = ["node1", "node2"].iter().map(|&s| NodeId::new(s)).collect();
455 let group_id = GroupId::new("test_group");
456 manager.create_group(group_id.clone(), members).unwrap();
457
458 manager
459 .start_group_drag(&group_id, Position::new(125.0, 110.0), &graph)
460 .unwrap();
461
462 let new_pos = Position::new(175.0, 135.0);
463 let result = manager.update_group_drag(new_pos, &mut graph);
464
465 assert!(result.is_ok());
466 let delta = result.unwrap();
467 assert_eq!(delta, Position::new(50.0, 25.0));
468 assert_eq!(
469 manager.get_drag_delta(),
470 Some(Position::new(50.0, 25.0))
471 );
472
473 let node1_after = graph.get_node(&NodeId::new("node1")).unwrap();
475 let node2_after = graph.get_node(&NodeId::new("node2")).unwrap();
476 assert_eq!(node1_after.position, Position::new(150.0, 125.0));
477 assert_eq!(node2_after.position, Position::new(250.0, 175.0));
478 }
479
480 #[test]
481 fn test_complete_group_drag() {
482 let mut manager = GroupManager::new();
483 let mut graph = Graph::<(), ()>::new();
484
485 let node1 = Node::simple("node1", Position::new(100.0, 100.0));
486 graph.add_node(node1).unwrap();
487
488 let members: HashSet<NodeId> = [NodeId::new("node1")].into_iter().collect();
489 let group_id = GroupId::new("test_group");
490 manager.create_group(group_id.clone(), members).unwrap();
491 manager
492 .start_group_drag(&group_id, Position::zero(), &graph)
493 .unwrap();
494
495 let result = manager.complete_group_drag();
496
497 assert!(result.is_ok());
498 assert_eq!(result.unwrap(), group_id);
499 assert!(!manager.is_group_dragging());
500 assert_eq!(manager.get_dragging_group(), None);
501 }
502
503 #[test]
504 fn test_cancel_group_drag() {
505 let mut manager = GroupManager::new();
506 let mut graph = Graph::<(), ()>::new();
507
508 let node1 = Node::simple("node1", Position::new(100.0, 100.0));
509 let node2 = Node::simple("node2", Position::new(200.0, 150.0));
510 graph.add_node(node1).unwrap();
511 graph.add_node(node2).unwrap();
512
513 let members: HashSet<NodeId> = ["node1", "node2"].iter().map(|&s| NodeId::new(s)).collect();
514 let group_id = GroupId::new("test_group");
515 manager.create_group(group_id.clone(), members).unwrap();
516
517 manager
518 .start_group_drag(&group_id, Position::zero(), &graph)
519 .unwrap();
520 manager
521 .update_group_drag(Position::new(50.0, 25.0), &mut graph)
522 .unwrap();
523
524 assert_eq!(
526 graph.get_node(&NodeId::new("node1")).unwrap().position,
527 Position::new(150.0, 125.0)
528 );
529
530 let result = manager.cancel_group_drag(&mut graph);
532
533 assert!(result.is_ok());
534 assert_eq!(result.unwrap(), group_id);
535 assert!(!manager.is_group_dragging());
536
537 assert_eq!(
539 graph.get_node(&NodeId::new("node1")).unwrap().position,
540 Position::new(100.0, 100.0)
541 );
542 assert_eq!(
543 graph.get_node(&NodeId::new("node2")).unwrap().position,
544 Position::new(200.0, 150.0)
545 );
546 }
547
548 #[test]
549 fn test_drag_operations_without_active_drag() {
550 let mut graph = Graph::<(), ()>::new();
551 let mut manager = GroupManager::new();
552
553 let result = manager.update_group_drag(Position::zero(), &mut graph);
555 assert!(result.is_err());
556 assert!(matches!(result, Err(crate::error::FlowError::InvalidOperation { .. })));
557
558 let result = manager.complete_group_drag();
560 assert!(result.is_err());
561
562 let result = manager.cancel_group_drag(&mut graph);
564 assert!(result.is_err());
565 }
566}