stress_test/
stress_test.rs

1use ascii_dag::graph::DAG;
2
3fn main() {
4    println!("=== Stress Test: Breaking the Renderer ===\n");
5
6    // Test 1: Very long vs very short labels
7    println!("1. Mixed Label Lengths:");
8    let dag = DAG::from_edges(
9        &[
10            (1, "A"),
11            (2, "VeryVeryVeryLongErrorNameThatShouldBreakAlignment"),
12            (3, "B"),
13            (4, "AnotherExtremelyLongDiagnosticMessageHere"),
14            (5, "C"),
15        ],
16        &[
17            (1, 2), // Short -> Long
18            (2, 3), // Long -> Short
19            (3, 4), // Short -> Long
20            (4, 5), // Long -> Short
21        ],
22    );
23    println!("{}\n", dag.render());
24
25    // Test 2: Extreme convergence (many -> one)
26    println!("2. Extreme Convergence (10 errors -> 1):");
27    let mut dag = DAG::new();
28    dag.add_node(1, "E1");
29    dag.add_node(2, "E2");
30    dag.add_node(3, "E3");
31    dag.add_node(4, "E4");
32    dag.add_node(5, "E5");
33    dag.add_node(6, "E6");
34    dag.add_node(7, "E7");
35    dag.add_node(8, "E8");
36    dag.add_node(9, "E9");
37    dag.add_node(10, "E10");
38    dag.add_node(11, "Final");
39
40    for i in 1..=10 {
41        dag.add_edge(i, 11);
42    }
43    println!("{}\n", dag.render());
44
45    // Test 3: Extreme divergence (one -> many)
46    println!("3. Extreme Divergence (1 -> 8):");
47    let dag = DAG::from_edges(
48        &[
49            (1, "Root"),
50            (2, "Child1"),
51            (3, "Child2"),
52            (4, "Child3"),
53            (5, "Child4"),
54            (6, "Child5"),
55            (7, "Child6"),
56            (8, "Child7"),
57            (9, "Child8"),
58        ],
59        &[
60            (1, 2),
61            (1, 3),
62            (1, 4),
63            (1, 5),
64            (1, 6),
65            (1, 7),
66            (1, 8),
67            (1, 9),
68        ],
69    );
70    println!("{}\n", dag.render());
71
72    // Test 4: Complex multi-layer DAG
73    println!("4. Complex Multi-Layer DAG:");
74    let dag = DAG::from_edges(
75        &[
76            (1, "L1A"),
77            (2, "L1B"),
78            (3, "L1C"), // Layer 1: 3 nodes
79            (4, "L2A"),
80            (5, "L2B"), // Layer 2: 2 nodes
81            (6, "L3A"),
82            (7, "L3B"),
83            (8, "L3C"),   // Layer 3: 3 nodes
84            (9, "Final"), // Layer 4: 1 node
85        ],
86        &[
87            // Layer 1 -> Layer 2
88            (1, 4),
89            (2, 4),
90            (3, 5),
91            // Layer 2 -> Layer 3
92            (4, 6),
93            (4, 7),
94            (5, 7),
95            (5, 8),
96            // Layer 3 -> Layer 4
97            (6, 9),
98            (7, 9),
99            (8, 9),
100        ],
101    );
102    println!("{}\n", dag.render());
103
104    // Test 5: Single character labels
105    println!("5. Single Character Labels:");
106    let dag = DAG::from_edges(
107        &[(1, "A"), (2, "B"), (3, "C"), (4, "D"), (5, "E")],
108        &[(1, 3), (2, 3), (3, 4), (3, 5)],
109    );
110    println!("{}\n", dag.render());
111
112    // Test 6: Empty label (edge case)
113    println!("6. Empty/Minimal Labels:");
114    let dag = DAG::from_edges(&[(1, ""), (2, "X"), (3, "")], &[(1, 2), (2, 3)]);
115    println!("{}\n", dag.render());
116
117    // Test 7: Unicode in labels
118    println!("7. Unicode Characters in Labels:");
119    let dag = DAG::from_edges(
120        &[(1, "🔴 Error"), (2, "⚠️ Warning"), (3, "✓ Fixed")],
121        &[(1, 2), (2, 3)],
122    );
123    println!("{}\n", dag.render());
124
125    // Test 8: Mixed long and short with convergence
126    println!("8. Mixed Lengths + Convergence:");
127    let dag = DAG::from_edges(
128        &[
129            (1, "ShortError1"),
130            (2, "ThisIsAnExtremelyLongErrorMessageThatGoesOnAndOn"),
131            (3, "Err3"),
132            (4, "AnotherVeryLongDiagnosticNameHereForTesting"),
133            (5, "Result"),
134        ],
135        &[(1, 5), (2, 5), (3, 5), (4, 5)],
136    );
137    println!("{}\n", dag.render());
138
139    // Test 9: Deep nesting
140    println!("9. Deep Nesting (10 levels):");
141    let dag = DAG::from_edges(
142        &[
143            (1, "Level1"),
144            (2, "Level2"),
145            (3, "Level3"),
146            (4, "Level4"),
147            (5, "Level5"),
148            (6, "Level6"),
149            (7, "Level7"),
150            (8, "Level8"),
151            (9, "Level9"),
152            (10, "Level10"),
153        ],
154        &[
155            (1, 2),
156            (2, 3),
157            (3, 4),
158            (4, 5),
159            (5, 6),
160            (6, 7),
161            (7, 8),
162            (8, 9),
163            (9, 10),
164        ],
165    );
166    println!("{}\n", dag.render());
167
168    // Test 10: Wide graph (5 parallel chains)
169    println!("10. Wide Graph (5 parallel chains):");
170    let dag = DAG::from_edges(
171        &[
172            (1, "C0L0"),
173            (2, "C0L1"),
174            (3, "C0L2"),
175            (4, "C1L0"),
176            (5, "C1L1"),
177            (6, "C1L2"),
178            (7, "C2L0"),
179            (8, "C2L1"),
180            (9, "C2L2"),
181            (10, "C3L0"),
182            (11, "C3L1"),
183            (12, "C3L2"),
184            (13, "C4L0"),
185            (14, "C4L1"),
186            (15, "C4L2"),
187        ],
188        &[
189            (1, 2),
190            (2, 3),
191            (4, 5),
192            (5, 6),
193            (7, 8),
194            (8, 9),
195            (10, 11),
196            (11, 12),
197            (13, 14),
198            (14, 15),
199        ],
200    );
201    println!("{}\n", dag.render());
202
203    // Test 11: Diamond within diamond
204    println!("11. Diamond within Diamond:");
205    let dag = DAG::from_edges(
206        &[
207            (1, "Root"),
208            (2, "L1"),
209            (3, "R1"),
210            (4, "L2"),
211            (5, "R2"),
212            (6, "L3"),
213            (7, "R3"),
214            (8, "Merge1"),
215            (9, "Merge2"),
216        ],
217        &[
218            (1, 2),
219            (1, 3), // Root splits
220            (2, 4),
221            (2, 5), // Left splits
222            (3, 6),
223            (3, 7), // Right splits
224            (4, 8),
225            (5, 8), // Left converges
226            (6, 9),
227            (7, 9), // Right converges
228        ],
229    );
230    println!("{}\n", dag.render());
231
232    println!("=== Stress Test Complete ===");
233}