rust/ui_test/src/tests.rs

337 lines
10 KiB
Rust
Raw Normal View History

2022-05-25 11:08:41 -05:00
use std::path::{Path, PathBuf};
use crate::rustc_stderr::Level;
use crate::rustc_stderr::Message;
use super::*;
2022-05-25 11:08:41 -05:00
fn config() -> Config {
Config {
args: vec![],
target: None,
stderr_filters: vec![],
stdout_filters: vec![],
root_dir: PathBuf::from("$RUSTROOT"),
2022-05-25 11:08:41 -05:00
mode: Mode::Fail,
2022-05-30 03:27:41 -05:00
path_filter: vec![],
2022-05-25 11:08:41 -05:00
program: PathBuf::from("cake"),
output_conflict_handling: OutputConflictHandling::Error,
}
}
#[test]
fn issue_2156() -> Result<()> {
init();
2022-05-25 11:08:41 -05:00
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 path = Path::new("$DIR/<dummy>");
let comments = Comments::parse(path, s)?;
2022-05-25 11:08:41 -05:00
let mut errors = vec![];
let config = config();
let messages = vec![
vec![], vec![], vec![], vec![], vec![],
vec![
Message {
message:"Undefined Behavior: type validation failed: encountered a dangling reference (address 0x10 is unallocated)".to_string(),
level: Level::Error,
}
]
];
check_annotations(messages, vec![], Path::new("moobar"), &mut errors, &config, "", &comments);
match &errors[..] {
[
Error::PatternNotFound { definition_line: 5, .. },
Error::ErrorsWithoutPattern { path: Some((_, 5)), .. },
] => Ok(()),
_ => panic!("{:#?}", errors),
}
}
#[test]
fn find_pattern() -> Result<()> {
init();
let s = r"
use std::mem;
fn main() {
let _x: &i32 = unsafe { mem::transmute(16usize) }; //~ ERROR encountered a dangling reference (address 0x10 is unallocated)
}
";
let comments = Comments::parse(Path::new("<dummy>"), s)?;
let config = config();
{
let messages = vec![vec![], vec![], vec![], vec![], vec![], vec![
Message {
message: "Undefined Behavior: type validation failed: encountered a dangling reference (address 0x10 is unallocated)".to_string(),
level: Level::Error,
}
]
];
let mut errors = vec![];
check_annotations(
messages,
vec![],
Path::new("moobar"),
&mut errors,
&config,
"",
&comments,
);
match &errors[..] {
[] => {}
_ => panic!("{:#?}", errors),
}
}
// only difference to above is a wrong line number
{
let messages = vec![vec![], vec![], vec![], vec![], vec![
Message {
message: "Undefined Behavior: type validation failed: encountered a dangling reference (address 0x10 is unallocated)".to_string(),
level: Level::Error,
}
]
];
let mut errors = vec![];
check_annotations(
messages,
vec![],
Path::new("moobar"),
&mut errors,
&config,
"",
&comments,
);
match &errors[..] {
[
Error::PatternNotFound { definition_line: 5, .. },
Error::ErrorsWithoutPattern { path: Some((_, 4)), .. },
] => {}
_ => panic!("not the expected error: {:#?}", errors),
}
}
// only difference to first is a wrong level
{
let messages = vec![
vec![], vec![], vec![], vec![], vec![],
vec![
Message {
message: "Undefined Behavior: type validation failed: encountered a dangling reference (address 0x10 is unallocated)".to_string(),
level: Level::Note,
}
]
];
let mut errors = vec![];
check_annotations(
messages,
vec![],
Path::new("moobar"),
&mut errors,
&config,
"",
&comments,
);
match &errors[..] {
// Note no `ErrorsWithoutPattern`, because there are no `//~NOTE` in the test file, so we ignore them
[Error::PatternNotFound { definition_line: 5, .. }] => Ok(()),
_ => panic!("not the expected error: {:#?}", errors),
}
}
}
#[test]
fn duplicate_pattern() -> Result<()> {
init();
let s = r"
use std::mem;
fn main() {
let _x: &i32 = unsafe { mem::transmute(16usize) }; //~ ERROR encountered a dangling reference (address 0x10 is unallocated)
//~^ ERROR encountered a dangling reference (address 0x10 is unallocated)
}
";
let comments = Comments::parse(Path::new("<dummy>"), s)?;
let config = config();
let messages = vec![
vec![], vec![], vec![], vec![], vec![],
vec![
Message {
message: "Undefined Behavior: type validation failed: encountered a dangling reference (address 0x10 is unallocated)".to_string(),
level: Level::Error,
}
]
];
let mut errors = vec![];
check_annotations(messages, vec![], Path::new("moobar"), &mut errors, &config, "", &comments);
match &errors[..] {
[Error::PatternNotFound { definition_line: 6, .. }] => Ok(()),
_ => panic!("{:#?}", errors),
}
}
#[test]
fn missing_pattern() -> Result<()> {
init();
let s = r"
use std::mem;
fn main() {
let _x: &i32 = unsafe { mem::transmute(16usize) }; //~ ERROR encountered a dangling reference (address 0x10 is unallocated)
}
";
let comments = Comments::parse(Path::new("<dummy>"), s)?;
let config = config();
let messages = vec![
vec![], vec![], vec![], vec![], vec![],
vec![
Message {
message: "Undefined Behavior: type validation failed: encountered a dangling reference (address 0x10 is unallocated)".to_string(),
level: Level::Error,
},
Message {
message: "Undefined Behavior: type validation failed: encountered a dangling reference (address 0x10 is unallocated)".to_string(),
level: Level::Error,
}
]
];
let mut errors = vec![];
check_annotations(messages, vec![], Path::new("moobar"), &mut errors, &config, "", &comments);
match &errors[..] {
[Error::ErrorsWithoutPattern { path: Some((_, 5)), .. }] => Ok(()),
_ => panic!("{:#?}", errors),
}
}
#[test]
fn missing_warn_pattern() -> Result<()> {
init();
let s = r"
use std::mem;
fn main() {
let _x: &i32 = unsafe { mem::transmute(16usize) }; //~ ERROR encountered a dangling reference (address 0x10 is unallocated)
//~^ WARN cake
}
";
let comments = Comments::parse(Path::new("<dummy>"), s)?;
let config = config();
let messages= vec![
vec![],
vec![],
vec![],
vec![],
vec![],
vec![
Message {
message: "Undefined Behavior: type validation failed: encountered a dangling reference (address 0x10 is unallocated)".to_string(),
level: Level::Error,
},
Message {
message: "kaboom".to_string(),
level: Level::Warn,
},
Message {
message: "cake".to_string(),
level: Level::Warn,
},
],
];
let mut errors = vec![];
check_annotations(messages, vec![], Path::new("moobar"), &mut errors, &config, "", &comments);
match &errors[..] {
[Error::ErrorsWithoutPattern { path: Some((_, 5)), msgs, .. }] =>
match &msgs[..] {
[Message { message, level: Level::Warn }] if message == "kaboom" => Ok(()),
_ => panic!("{:#?}", msgs),
},
_ => panic!("{:#?}", errors),
}
}
#[test]
fn missing_implicit_warn_pattern() -> Result<()> {
init();
let s = r"
use std::mem;
fn main() {
let _x: &i32 = unsafe { mem::transmute(16usize) }; //~ ERROR encountered a dangling reference (address 0x10 is unallocated)
//~^ cake
}
";
let comments = Comments::parse(Path::new("<dummy>"), s)?;
let config = config();
let messages = vec![
vec![],
vec![],
vec![],
vec![],
vec![],
vec![
Message {
message: "Undefined Behavior: type validation failed: encountered a dangling reference (address 0x10 is unallocated)".to_string(),
level: Level::Error,
},
Message {
message: "kaboom".to_string(),
level: Level::Warn,
},
Message {
message: "cake".to_string(),
level: Level::Warn,
},
],
];
let mut errors = vec![];
check_annotations(messages, vec![], Path::new("moobar"), &mut errors, &config, "", &comments);
match &errors[..] {
[] => Ok(()),
_ => panic!("{:#?}", errors),
}
}
#[test]
fn implicit_err_pattern() -> Result<()> {
init();
let s = r"
use std::mem;
fn main() {
let _x: &i32 = unsafe { mem::transmute(16usize) }; //~ encountered a dangling reference (address 0x10 is unallocated)
}
2022-05-25 11:08:41 -05:00
";
let comments = Comments::parse(Path::new("<dummy>"), s)?;
let config = config();
let messages = vec![
vec![],
vec![],
vec![],
vec![],
vec![],
vec![
Message {
message: "Undefined Behavior: type validation failed: encountered a dangling reference (address 0x10 is unallocated)".to_string(),
level: Level::Error,
},
],
];
let mut errors = vec![];
check_annotations(messages, vec![], Path::new("moobar"), &mut errors, &config, "", &comments);
2022-05-25 11:08:41 -05:00
match &errors[..] {
[Error::ErrorPatternWithoutErrorAnnotation(_, 5)] => Ok(()),
_ => panic!("{:#?}", errors),
2022-05-25 11:08:41 -05:00
}
}
2022-07-07 03:15:21 -05:00
/// Call this from every test to initialize eyre only once across all tests.
pub fn init() {
2022-07-07 03:15:21 -05:00
static INIT: std::sync::Once = std::sync::Once::new();
INIT.call_once(|| color_eyre::install().unwrap());
}