#![allow(dead_code)]
use rumoca::Compiler;
pub fn expect_success(source: &str, model: &str) {
let result = Compiler::new().model(model).compile_str(source, "test.mo");
assert!(
result.is_ok(),
"Expected '{}' to compile successfully.\nError: {:?}\nSource:\n{}",
model,
result.err(),
source
);
}
pub fn expect_failure(source: &str, model: &str) {
let result = Compiler::new().model(model).compile_str(source, "test.mo");
assert!(
result.is_err(),
"Expected '{}' to fail compilation, but it succeeded.\nSource:\n{}",
model,
source
);
}
pub fn expect_parse_success(source: &str) {
let result = rumoca::parse_source(source, "test.mo");
assert!(
result.is_ok(),
"Expected source to parse successfully.\nError: {:?}\nSource:\n{}",
result.err(),
source
);
}
pub fn expect_parse_failure(source: &str) {
let result = rumoca::parse_source(source, "test.mo");
assert!(
result.is_err(),
"Expected source to fail parsing, but it succeeded.\nSource:\n{}",
source
);
}
pub fn expect_balanced(source: &str, model: &str) {
let result = Compiler::new()
.model(model)
.compile_str(source, "test.mo")
.expect("Failed to compile");
assert!(
result.is_balanced(),
"Expected '{}' to be balanced. Status: {}",
model,
result.balance_status()
);
}
pub fn expect_unbalanced(source: &str, model: &str) {
let result = Compiler::new()
.model(model)
.compile_str(source, "test.mo")
.expect("Failed to compile");
assert!(
!result.is_balanced(),
"Expected '{}' to be unbalanced, but it was balanced.",
model
);
}
pub fn expect_balanced_with_count(
source: &str,
model: &str,
expected_eq: usize,
expected_unk: usize,
) {
let result = Compiler::new()
.model(model)
.compile_str(source, "test.mo")
.expect("Failed to compile");
let balance = result.dae().check_balance();
assert!(
result.is_balanced(),
"Expected '{}' to be balanced. Status: {}",
model,
result.balance_status()
);
assert_eq!(
balance.num_equations, expected_eq,
"Expected {} equations but got {} for model '{}'",
expected_eq, balance.num_equations, model
);
assert_eq!(
balance.num_unknowns, expected_unk,
"Expected {} unknowns but got {} for model '{}'",
expected_unk, balance.num_unknowns, model
);
}
pub fn expect_counts(source: &str, model: &str, expected_eq: usize, expected_unk: usize) {
let result = Compiler::new()
.model(model)
.compile_str(source, "test.mo")
.expect("Failed to compile");
let balance = result.dae().check_balance();
assert_eq!(
balance.num_equations,
expected_eq,
"Expected {} equations but got {} for model '{}'.\nBalance: {}",
expected_eq,
balance.num_equations,
model,
result.balance_status()
);
assert_eq!(
balance.num_unknowns,
expected_unk,
"Expected {} unknowns but got {} for model '{}'.\nBalance: {}",
expected_unk,
balance.num_unknowns,
model,
result.balance_status()
);
}
pub fn expect_failure_with_message(source: &str, model: &str, expected_message: &str) {
let result = Compiler::new().model(model).compile_str(source, "test.mo");
match result {
Ok(_) => panic!(
"Expected '{}' to fail compilation, but it succeeded.\nSource:\n{}",
model, source
),
Err(e) => {
let error_msg = format!("{:?}", e);
assert!(
error_msg.contains(expected_message),
"Expected error message to contain '{}' but got:\n{}\nSource:\n{}",
expected_message,
error_msg,
source
);
}
}
}
pub fn expect_parse_failure_with_message(source: &str, expected_message: &str) {
let result = rumoca::parse_source(source, "test.mo");
match result {
Ok(_) => panic!(
"Expected source to fail parsing, but it succeeded.\nSource:\n{}",
source
),
Err(e) => {
let error_msg = format!("{:?}", e);
assert!(
error_msg.contains(expected_message),
"Expected error message to contain '{}' but got:\n{}\nSource:\n{}",
expected_message,
error_msg,
source
);
}
}
}
pub fn expect_multi_file_success(files: &[(&str, &str)], main_model: &str) {
use std::fs;
use tempfile::TempDir;
let temp_dir = TempDir::new().expect("Failed to create temp directory");
let mut file_paths: Vec<String> = Vec::new();
for (filename, source) in files {
let path = temp_dir.path().join(filename);
fs::write(&path, source).expect("Failed to write test file");
file_paths.push(path.to_string_lossy().to_string());
}
let path_refs: Vec<&str> = file_paths.iter().map(|s| s.as_str()).collect();
let result = Compiler::new().model(main_model).compile_files(&path_refs);
assert!(
result.is_ok(),
"Expected multi-file compilation to succeed for model '{}'.\nError: {:?}",
main_model,
result.err()
);
}
pub fn expect_multi_file_failure(files: &[(&str, &str)], main_model: &str) {
use std::fs;
use tempfile::TempDir;
let temp_dir = TempDir::new().expect("Failed to create temp directory");
let mut file_paths: Vec<String> = Vec::new();
for (filename, source) in files {
let path = temp_dir.path().join(filename);
fs::write(&path, source).expect("Failed to write test file");
file_paths.push(path.to_string_lossy().to_string());
}
let path_refs: Vec<&str> = file_paths.iter().map(|s| s.as_str()).collect();
let result = Compiler::new().model(main_model).compile_files(&path_refs);
assert!(
result.is_err(),
"Expected multi-file compilation to fail for model '{}', but it succeeded.",
main_model
);
}
pub mod chapter_01;
pub mod chapter_02;
pub mod chapter_03;
pub mod chapter_04;
pub mod chapter_05;
pub mod chapter_06;
pub mod chapter_07;
pub mod chapter_08;
pub mod chapter_09;
pub mod chapter_10;
pub mod chapter_11;
pub mod chapter_12;
pub mod chapter_13;
pub mod chapter_14;
pub mod chapter_15;
pub mod chapter_16;
pub mod chapter_17;
pub mod chapter_18;
pub mod integration;