// cspell:ignore pyperformance nqueens pidigits
#![allow(clippy::tests_outside_test_module)]
use rustpython::{InterpreterBuilder, InterpreterBuilderExt};
use std::{fs, path::Path};
const PYPERFORMANCE_BENCHMARKS: &[&str] = &[
"base64.py",
"decimal_factorial.py",
"deepcopy.py",
"deltablue.py",
"float.py",
"generators.py",
"json_dumps.py",
"nqueens.py",
"pickle.py",
"pidigits.py",
"regex_effbot.py",
"richards.py",
"unpickle.py",
];
#[test]
fn pyperformance_benchmarks_run_in_rustpython() {
let benchmark_dir = Path::new("benches/benchmarks");
for name in PYPERFORMANCE_BENCHMARKS {
let path = benchmark_dir.join(name);
let source = fs::read_to_string(&path)
.unwrap_or_else(|err| panic!("failed to read {}: {err}", path.display()));
let source_path = path.to_string_lossy();
InterpreterBuilder::new()
.init_stdlib()
.interpreter()
.enter(|vm| {
let code = vm
.compile(&source, rustpython::vm::compiler::Mode::Exec, &*source_path)
.unwrap_or_else(|err| panic!("failed to compile {}: {err}", path.display()));
let scope = vm.new_scope_with_builtins();
if let Err(err) = vm.run_code_obj(code, scope) {
vm.print_exception(&err);
panic!("failed to execute {}", path.display());
}
});
}
}
#[test]
fn pyperformance_benchmarks_restore_interpreter_state() {
let source = r#"
import decimal
import pickle
import sys
missing = object()
pickle_module = sys.modules.get("pickle", missing)
pickle_accelerator = sys.modules.get("_pickle", missing)
decimal_precision = decimal.getcontext().prec
for path in (
"benches/benchmarks/pickle.py",
"benches/benchmarks/unpickle.py",
"benches/benchmarks/decimal_factorial.py",
):
with open(path) as benchmark_file:
benchmark_source = benchmark_file.read()
exec(compile(benchmark_source, path, "exec"), {})
assert sys.modules.get("pickle", missing) is pickle_module
assert sys.modules.get("_pickle", missing) is pickle_accelerator
assert decimal.getcontext().prec == decimal_precision
"#;
InterpreterBuilder::new()
.init_stdlib()
.interpreter()
.enter(|vm| {
if let Err(err) = vm.run_simple_string(source) {
vm.print_exception(&err);
panic!("pyperformance benchmarks leaked interpreter state");
}
});
}