Proptest testing!
This commit is contained in:
@@ -2,6 +2,7 @@ use codespan_reporting::{diagnostic::Diagnostic, files::SimpleFiles};
|
||||
use lalrpop_util::lalrpop_mod;
|
||||
use logos::Logos;
|
||||
|
||||
mod arbitrary;
|
||||
pub mod ast;
|
||||
mod location;
|
||||
mod simplify;
|
||||
@@ -18,8 +19,12 @@ pub use crate::syntax::ast::*;
|
||||
pub use crate::syntax::location::Location;
|
||||
use crate::syntax::parser::ProgramParser;
|
||||
pub use crate::syntax::tokens::{LexerError, Token};
|
||||
#[cfg(test)]
|
||||
use ::pretty::{Arena, Pretty};
|
||||
use lalrpop_util::ParseError;
|
||||
#[cfg(test)]
|
||||
use proptest::{prop_assert, prop_assert_eq};
|
||||
#[cfg(test)]
|
||||
use std::str::FromStr;
|
||||
use thiserror::Error;
|
||||
|
||||
@@ -236,3 +241,32 @@ 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();
|
||||
prop_assert!(errors.is_empty());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user