Separate the IR evaluator, add an interesting stack-breaking case.
This commit is contained in:
@@ -46,11 +46,9 @@ pub use crate::syntax::ast::*;
|
||||
pub use crate::syntax::location::Location;
|
||||
pub use crate::syntax::parser::{ProgramParser, TopLevelParser};
|
||||
pub use crate::syntax::tokens::{LexerError, Token};
|
||||
#[cfg(test)]
|
||||
use ::pretty::Arena;
|
||||
use lalrpop_util::ParseError;
|
||||
#[cfg(test)]
|
||||
use proptest::{arbitrary::Arbitrary, prop_assert, prop_assert_eq};
|
||||
use proptest::{arbitrary::Arbitrary, prop_assert};
|
||||
use std::ops::Range;
|
||||
#[cfg(test)]
|
||||
use std::str::FromStr;
|
||||
@@ -324,27 +322,6 @@ fn order_of_operations() {
|
||||
}
|
||||
|
||||
proptest::proptest! {
|
||||
#[test]
|
||||
fn random_render_parses_equal(program: Program) {
|
||||
let mut file_database = SimpleFiles::new();
|
||||
let writer = ::pretty::termcolor::StandardStream::stderr(::pretty::termcolor::ColorChoice::Auto);
|
||||
let config = codespan_reporting::term::Config::default();
|
||||
let allocator = Arena::<()>::new();
|
||||
|
||||
let mut out_vector = vec![];
|
||||
prop_assert!(program.pretty(&allocator).render(80, &mut out_vector).is_ok());
|
||||
let string = std::str::from_utf8(&out_vector).expect("emitted valid string");
|
||||
let file_handle = file_database.add("test", string);
|
||||
let file_db_info = file_database.get(file_handle).expect("find thing just inserted");
|
||||
let parsed = Program::parse(file_handle, file_db_info.source());
|
||||
|
||||
if let Err(e) = &parsed {
|
||||
eprintln!("failed to parse:\n{}", string);
|
||||
codespan_reporting::term::emit(&mut writer.lock(), &config, &file_database, &e.into()).unwrap();
|
||||
}
|
||||
prop_assert_eq!(program, parsed.unwrap());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn random_syntaxes_validate(program: Program) {
|
||||
let (errors, _) = program.validate();
|
||||
@@ -354,6 +331,8 @@ proptest::proptest! {
|
||||
#[test]
|
||||
fn generated_run_or_overflow(program in Program::arbitrary_with(GenerationEnvironment::new(false))) {
|
||||
use crate::eval::{EvalError, PrimOpError};
|
||||
println!("-----------\nprogram:\n{}\n", program);
|
||||
println!("-----------\nresult:\n{:?}\n", program.eval());
|
||||
prop_assert!(matches!(program.eval(), Ok(_) | Err(EvalError::PrimOp(PrimOpError::MathFailure(_)))));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user