| 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); | |
| } | |
| } |