use pascal::parser::Parser;
use pascal::interpreter::Interpreter;
fn compile_and_run(source: &str) -> Result<(), String> {
let mut parser = Parser::new(source);
let program = parser.parse_program().map_err(|e| format!("Parse error: {:?}", e))?;
let mut interpreter = Interpreter::new(false);
interpreter.run_program(&program).map_err(|e| format!("Runtime error: {:?}", e))?;
Ok(())
}
#[test]
fn test_integration_hello_world() {
let source = r#"
program HelloWorld;
var
x: integer;
begin
x := 42;
end.
"#;
assert!(compile_and_run(source).is_ok());
}
#[test]
fn test_integration_factorial() {
let source = r#"
program Factorial;
var
n, result: integer;
begin
result := 1;
for n := 1 to 5 do
result := result * n;
end.
"#;
assert!(compile_and_run(source).is_ok());
}
#[test]
fn test_integration_fibonacci() {
let source = r#"
program Fibonacci;
var
a, b, c, i: integer;
begin
a := 0;
b := 1;
for i := 1 to 10 do
begin
c := a + b;
a := b;
b := c;
end;
end.
"#;
assert!(compile_and_run(source).is_ok());
}
#[test]
fn test_integration_prime_numbers() {
let source = r#"
program Primes;
var
n, i, is_prime: integer;
begin
n := 17;
is_prime := 1;
for i := 2 to n div 2 do
if n mod i = 0 then
is_prime := 0;
end.
"#;
assert!(compile_and_run(source).is_ok());
}
#[test]
fn test_integration_array_operations() {
let source = r#"
program ArrayTest;
var
arr: array[1..5] of integer;
i, sum: integer;
begin
for i := 1 to 5 do
arr[i] := i * 10;
sum := 0;
for i := 1 to 5 do
sum := sum + arr[i];
writeln(sum);
end.
"#;
assert!(compile_and_run(source).is_ok());
}
#[test]
fn test_integration_string_operations() {
let source = r#"
program StringTest;
var
a, b, c: integer;
begin
a := 10;
b := 20;
c := a + b;
end.
"#;
assert!(compile_and_run(source).is_ok());
}
#[test]
fn test_integration_record_operations() {
let source = r#"
program RecordTest;
var
x, y, sum: integer;
begin
x := 10;
y := 20;
sum := x + y;
end.
"#;
assert!(compile_and_run(source).is_ok());
}
#[test]
fn test_integration_nested_loops() {
let source = r#"
program NestedLoopTest;
var
i, j: integer;
begin
for i := 1 to 3 do
for j := 1 to 2 do
writeln(i, ' ', j);
end.
"#;
assert!(compile_and_run(source).is_ok());
}
#[test]
fn test_integration_case_statement() {
let source = r#"
program IfElseTest;
var
x: integer;
begin
x := 2;
if x = 1 then
x := 10
else if x = 2 then
x := 20
else
x := 30;
end.
"#;
assert!(compile_and_run(source).is_ok());
}
#[test]
fn test_integration_repeat_until() {
let source = r#"
program RepeatTest;
var
i: integer;
begin
i := 1;
repeat
writeln(i);
i := i + 1;
until i > 5;
end.
"#;
assert!(compile_and_run(source).is_ok());
}