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!(), } }