| use core::panic::Location; |
| |
| // Note: Some of the following tests depend on the source location, |
| // so please be careful when editing this file. |
| |
| mod file_a; |
| mod file_b; |
| mod file_c; |
| |
| // A small shuffled set of locations for testing, along with their true order. |
| const LOCATIONS: [(usize, &'static Location<'_>); 9] = [ |
| (7, file_c::two()), |
| (0, file_a::one()), |
| (3, file_b::one()), |
| (5, file_b::three()), |
| (8, file_c::three()), |
| (6, file_c::one()), |
| (2, file_a::three()), |
| (4, file_b::two()), |
| (1, file_a::two()), |
| ]; |
| |
| #[test] |
| fn location_const_caller() { |
| const _CALLER_REFERENCE: &Location<'static> = Location::caller(); |
| const _CALLER: Location<'static> = *Location::caller(); |
| } |
| |
| #[test] |
| fn location_const_file() { |
| const CALLER: &Location<'static> = Location::caller(); |
| const FILE: &str = CALLER.file(); |
| assert_eq!(FILE, file!()); |
| } |
| |
| #[test] |
| fn location_const_line() { |
| const CALLER: &Location<'static> = Location::caller(); |
| const LINE: u32 = CALLER.line(); |
| assert_eq!(LINE, 38); |
| } |
| |
| #[test] |
| fn location_const_column() { |
| const CALLER: &Location<'static> = Location::caller(); |
| const COLUMN: u32 = CALLER.column(); |
| assert_eq!(COLUMN, 40); |
| } |
| |
| #[test] |
| fn location_file_lifetime<'x>() { |
| // Verify that the returned `&str`s lifetime is derived from the generic |
| // lifetime 'a, not the lifetime of `&self`, when calling `Location::file`. |
| // Test failure is indicated by a compile failure, not a runtime panic. |
| let _: for<'a> fn(&'a Location<'x>) -> &'x str = Location::file; |
| } |
| |
| #[test] |
| fn location_debug() { |
| let f = format!("{:?}", Location::caller()); |
| assert!(f.contains(&format!("{:?}", file!()))); |
| assert!(f.contains("60")); |
| assert!(f.contains("29")); |
| } |
| |
| #[test] |
| fn location_eq() { |
| for (i, a) in LOCATIONS { |
| for (j, b) in LOCATIONS { |
| if i == j { |
| assert_eq!(a, b); |
| } else { |
| assert_ne!(a, b); |
| } |
| } |
| } |
| } |
| |
| #[test] |
| fn location_ord() { |
| let mut locations = LOCATIONS.clone(); |
| locations.sort_by_key(|(_o, l)| **l); |
| for (correct, (order, _l)) in locations.iter().enumerate() { |
| assert_eq!(correct, *order); |
| } |
| } |