blob: f1b3b4cbf90d5ccec102d758f6e73e48bdee8561 [file] [log] [blame]
use crate::{
parser::{Condition, Pattern},
Error,
};
use super::Comments;
#[test]
fn parse_simple_comment() {
let s = r"
use std::mem;
fn main() {
let _x: &i32 = unsafe { mem::transmute(16usize) }; //~ ERROR: encountered a dangling reference (address $HEX is unallocated)
}
";
let comments = Comments::parse(s).unwrap();
println!("parsed comments: {:#?}", comments);
assert_eq!(comments.revisioned.len(), 1);
let revisioned = &comments.revisioned[&vec![]];
assert_eq!(revisioned.error_matches[0].pattern.line().get(), 5);
match &*revisioned.error_matches[0].pattern {
Pattern::SubString(s) => {
assert_eq!(
s,
"encountered a dangling reference (address $HEX is unallocated)"
)
}
other => panic!("expected substring, got {other:?}"),
}
}
#[test]
fn parse_missing_level() {
let s = r"
use std::mem;
fn main() {
let _x: &i32 = unsafe { mem::transmute(16usize) }; //~ encountered a dangling reference (address $HEX is unallocated)
}
";
let errors = Comments::parse(s).unwrap_err();
println!("parsed comments: {:#?}", errors);
assert_eq!(errors.len(), 1);
match &errors[0] {
Error::InvalidComment { msg, span } if span.line_start.get() == 5 => {
assert_eq!(msg, "unknown level `encountered`")
}
_ => unreachable!(),
}
}
#[test]
fn parse_slash_slash_at() {
let s = r"
//@ error-in-other-file: foomp
use std::mem;
";
let comments = Comments::parse(s).unwrap();
println!("parsed comments: {:#?}", comments);
assert_eq!(comments.revisioned.len(), 1);
let revisioned = &comments.revisioned[&vec![]];
let pat = &revisioned.error_in_other_files[0];
assert_eq!(format!("{:?}", **pat), r#"SubString("foomp")"#);
assert_eq!(pat.line().get(), 2);
}
#[test]
fn parse_regex_error_pattern() {
let s = r"
//@ error-in-other-file: /foomp/
use std::mem;
";
let comments = Comments::parse(s).unwrap();
println!("parsed comments: {:#?}", comments);
assert_eq!(comments.revisioned.len(), 1);
let revisioned = &comments.revisioned[&vec![]];
let pat = &revisioned.error_in_other_files[0];
assert_eq!(format!("{:?}", **pat), r#"Regex(Regex("foomp"))"#);
assert_eq!(pat.line().get(), 2);
}
#[test]
fn parse_slash_slash_at_fail() {
let s = r"
//@ error-patttern foomp
use std::mem;
";
let errors = Comments::parse(s).unwrap_err();
println!("parsed comments: {:#?}", errors);
assert_eq!(errors.len(), 2);
match &errors[0] {
Error::InvalidComment { msg, span } if span.line_start.get() == 2 => {
assert!(msg.contains("must be followed by `:`"))
}
_ => unreachable!(),
}
match &errors[1] {
Error::InvalidComment { msg, span } if span.line_start.get() == 2 => {
assert_eq!(msg, "`error-patttern` is not a command known to `ui_test`, did you mean `error-pattern`?");
}
_ => unreachable!(),
}
}
#[test]
fn missing_colon_fail() {
let s = r"
//@stderr-per-bitwidth hello
use std::mem;
";
let errors = Comments::parse(s).unwrap_err();
println!("parsed comments: {:#?}", errors);
assert_eq!(errors.len(), 1);
match &errors[0] {
Error::InvalidComment { msg, span } if span.line_start.get() == 2 => {
assert!(msg.contains("must be followed by `:`"))
}
_ => unreachable!(),
}
}
#[test]
fn parse_x86_64() {
let s = r"//@ only-target-x86_64-unknown-linux";
let comments = Comments::parse(s).unwrap();
println!("parsed comments: {:#?}", comments);
assert_eq!(comments.revisioned.len(), 1);
let revisioned = &comments.revisioned[&vec![]];
assert_eq!(revisioned.only.len(), 1);
match &revisioned.only[0] {
Condition::Target(t) => assert_eq!(t, "x86_64-unknown-linux"),
_ => unreachable!(),
}
}