rust/crates/ra_syntax/tests/test.rs

107 lines
3.1 KiB
Rust
Raw Normal View History

2018-09-16 11:54:24 +02:00
extern crate ra_syntax;
2018-08-25 13:26:34 +02:00
extern crate test_utils;
2018-08-13 16:42:43 +02:00
extern crate walkdir;
2018-01-07 12:56:08 +01:00
2018-07-30 14:25:52 +02:00
use std::{
fmt::Write,
2018-12-23 12:15:46 +01:00
path::{PathBuf, Component},
2018-07-30 14:25:52 +02:00
};
2018-01-07 12:56:08 +01:00
use test_utils::{project_dir, dir_tests, read_text, collect_tests};
2019-05-28 15:59:22 +02:00
use ra_syntax::{SourceFile, fuzz};
2018-08-25 11:10:35 +02:00
2018-08-11 09:03:03 +02:00
#[test]
fn lexer_tests() {
dir_tests(&test_data_dir(), &["lexer"], |text, _| {
2018-09-16 11:54:24 +02:00
let tokens = ra_syntax::tokenize(text);
2018-08-11 09:03:03 +02:00
dump_tokens(&tokens, text)
})
}
#[test]
fn parser_tests() {
2019-02-08 12:49:43 +01:00
dir_tests(&test_data_dir(), &["parser/inline/ok", "parser/ok"], |text, path| {
2019-05-28 15:59:22 +02:00
let parse = SourceFile::parse2(text);
let errors = parse.errors.as_slice();
2019-02-08 12:49:43 +01:00
assert_eq!(
2019-05-28 15:59:22 +02:00
errors,
2019-02-08 12:49:43 +01:00
&[] as &[ra_syntax::SyntaxError],
"There should be no errors in the file {:?}",
2019-05-28 15:59:22 +02:00
path.display(),
2019-02-08 12:49:43 +01:00
);
2019-05-28 15:59:22 +02:00
parse.debug_dump()
2019-02-08 12:49:43 +01:00
});
dir_tests(&test_data_dir(), &["parser/err", "parser/inline/err"], |text, path| {
2019-05-28 15:59:22 +02:00
let parse = SourceFile::parse2(text);
let errors = parse.errors.as_slice();
assert!(!errors.is_empty(), "There should be errors in the file {:?}", path.display());
parse.debug_dump()
2019-02-08 12:49:43 +01:00
});
}
#[test]
fn parser_fuzz_tests() {
for (_, text) in collect_tests(&test_data_dir(), &["parser/fuzz-failures"]) {
2019-03-21 18:05:12 +01:00
fuzz::check_parser(&text)
}
2018-08-25 13:45:17 +02:00
}
2019-03-21 18:06:48 +01:00
#[test]
fn reparse_fuzz_tests() {
for (_, text) in collect_tests(&test_data_dir(), &["reparse/fuzz-failures"]) {
let check = fuzz::CheckReparse::from_data(text.as_bytes()).unwrap();
println!("{:?}", check);
check.run();
}
}
2019-04-11 16:15:20 +02:00
/// Test that Rust-analyzer can parse and validate the rust-analyzer
2019-03-23 08:53:48 +01:00
/// FIXME: Use this as a benchmark
#[test]
fn self_hosting_parsing() {
use std::ffi::OsStr;
let dir = project_dir().join("crates");
let mut count = 0;
for entry in walkdir::WalkDir::new(dir)
.into_iter()
.filter_entry(|entry| {
!entry.path().components().any(|component| {
// Get all files which are not in the crates/ra_syntax/tests/data folder
component == Component::Normal(OsStr::new("data"))
})
})
.map(|e| e.unwrap())
.filter(|entry| {
// Get all `.rs ` files
!entry.path().is_dir() && (entry.path().extension() == Some(OsStr::new("rs")))
})
{
count += 1;
let text = read_text(entry.path());
2019-01-07 14:15:47 +01:00
let node = SourceFile::parse(&text);
let errors = node.errors();
2019-02-08 12:49:43 +01:00
assert_eq!(&*errors, &[], "There should be no errors in the file {:?}", entry);
}
assert!(
count > 30,
"self_hosting_parsing found too few files - is it running in the right directory?"
)
}
2018-01-07 12:56:08 +01:00
fn test_data_dir() -> PathBuf {
2018-09-16 11:54:24 +02:00
project_dir().join("crates/ra_syntax/tests/data")
2018-08-11 09:03:03 +02:00
}
2018-09-16 11:54:24 +02:00
fn dump_tokens(tokens: &[ra_syntax::Token], text: &str) -> String {
2018-08-11 09:03:03 +02:00
let mut acc = String::new();
let mut offset = 0;
for token in tokens {
let len: u32 = token.len.into();
let len = len as usize;
let token_text = &text[offset..offset + len];
offset += len;
write!(acc, "{:?} {} {:?}\n", token.kind, token.len, token_text).unwrap()
}
acc
2018-02-03 10:51:06 +01:00
}