use vb6parse::{ConcreteSyntaxTree, FormFile, SourceFile};
use std::fmt::Write;
#[test]
fn deeply_nested_controls() {
let mut form = String::from("Begin VB.Form Form1\n");
let depth = 100;
for i in 0..depth {
let _ = writeln!(form, " Begin VB.Frame Frame{i}");
}
for _ in 0..depth {
form.push_str(" End\n");
}
form.push_str("End\n");
let source = SourceFile::from_string("test.frm", form);
let (result, _errors) = FormFile::parse(&source).unpack();
assert!(result.is_some());
}
#[test]
fn extremely_nested_controls_depth_limit() {
let mut form = String::from("Begin VB.Form Form1\n");
let depth = 1100;
for i in 0..depth {
let _ = writeln!(form, " Begin VB.Frame Frame{i}");
}
for _ in 0..depth {
form.push_str(" End\n");
}
form.push_str("End\n");
let source = SourceFile::from_string("test.frm", form);
let (result, _errors) = FormFile::parse(&source).unpack();
assert!(result.is_some());
}
#[test]
fn deeply_nested_expressions() {
let mut code = String::from("Sub Test()\n");
code.push_str(" x = ");
let depth = 50; for _ in 0..depth {
code.push('(');
}
code.push_str("42");
for _ in 0..depth {
code.push(')');
}
code.push_str("\nEnd Sub\n");
let (result, _errors) = ConcreteSyntaxTree::from_text("test.bas", &code).unpack();
assert!(result.is_some());
}
#[test]
fn extremely_nested_expressions_no_limit() {
let mut code = String::from("Sub Test()\n");
code.push_str(" x = ");
let depth = 2000;
for _ in 0..depth {
code.push('(');
}
code.push_str("42");
for _ in 0..depth {
code.push(')');
}
code.push_str("\nEnd Sub\n");
let (result, _errors) = ConcreteSyntaxTree::from_text("test.bas", &code).unpack();
assert!(
result.is_some(),
"Expression parsing should handle arbitrary depth with iterative approach"
);
}
#[test]
fn deeply_nested_if_statements() {
let mut code = String::from("Sub Test()\n");
let depth = 50;
for i in 0..depth {
let _ = writeln!(code, " If x{i} Then");
}
code.push_str(" y = 1\n");
for _ in 0..depth {
code.push_str(" End If\n");
}
code.push_str("End Sub\n");
let (result, _errors) = ConcreteSyntaxTree::from_text("test.bas", &code).unpack();
assert!(result.is_some());
}
#[test]
fn deeply_nested_for_loops() {
let mut code = String::from("Sub Test()\n");
let depth = 50;
for i in 0..depth {
let _ = writeln!(code, " For i{i} = 1 To 10");
}
let _ = writeln!(code, " x = 1");
for i in (0..depth).rev() {
let _ = writeln!(code, " Next i{i}");
}
let _ = writeln!(code, "End Sub");
let (result, _errors) = ConcreteSyntaxTree::from_text("test.bas", &code).unpack();
assert!(result.is_some());
}
#[test]
fn nested_property_groups() {
let mut form = String::from("Begin VB.Form Form1\n");
form.push_str(" Begin VB.Label Label1\n");
let depth = 10;
for i in 0..depth {
let _ = writeln!(form, " BeginProperty PropGroup{i}");
let _ = writeln!(form, " Name = \"Test\"");
}
for _ in 0..depth {
let _ = writeln!(form, " EndProperty");
}
let _ = writeln!(form, " End");
let _ = writeln!(form, "End");
let source = SourceFile::from_string("test.frm", form);
let (result, _errors) = FormFile::parse(&source).unpack();
assert!(result.is_some());
}
#[test]
fn extremely_nested_property_groups() {
let mut form = String::from("Begin VB.Form Form1\n");
form.push_str(" Begin VB.Label Label1\n");
let depth = 150;
for i in 0..depth {
let _ = writeln!(form, " BeginProperty PropGroup{i}");
let _ = writeln!(form, " Name = \"Test\"");
}
for _ in 0..depth {
let _ = writeln!(form, " EndProperty");
}
let _ = writeln!(form, " End");
let _ = writeln!(form, "End");
let source = SourceFile::from_string("test.frm", form);
let (result, _errors) = FormFile::parse(&source).unpack();
assert!(result.is_some());
}