| use super::*; |
| |
| type BT = &'static [&'static [&'static str]]; |
| |
| impl Backtraceish for BT { |
| type Frame = &'static [&'static str]; |
| fn frames(&self) -> &[Self::Frame] { |
| self |
| } |
| } |
| |
| impl Frameish for &'static [&'static str] { |
| type Symbol = &'static str; |
| fn symbols(&self) -> &[Self::Symbol] { |
| self |
| } |
| } |
| |
| impl Symbolish for &'static str { |
| fn name_str(&self) -> Option<&str> { |
| Some(self) |
| } |
| } |
| |
| fn process(bt: BT) -> Vec<&'static str> { |
| let mut result = vec![]; |
| for (frame, subframes) in short_frames_strict_impl(&bt) { |
| let symbols = &frame.symbols()[subframes]; |
| assert!(!symbols.is_empty()); |
| for symbol in symbols { |
| result.push(*symbol); |
| } |
| } |
| result |
| } |
| |
| #[test] |
| fn test_full() { |
| let bt: BT = &[&["hello"], &["there", "simple"], &["case"]]; |
| let expected = vec!["hello", "there", "simple", "case"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_empty() { |
| let bt: BT = &[]; |
| let expected: Vec<&str> = vec![]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_cursed_one_true_symbol1() { |
| let bt: BT = &[ |
| &["hello"], |
| &["__rust_end_short_backtrace_rust_begin_short_backtrace"], |
| &["there"], |
| ]; |
| let expected = vec![ |
| "hello", |
| "__rust_end_short_backtrace_rust_begin_short_backtrace", |
| "there", |
| ]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_cursed_one_true_symbol2() { |
| let bt: BT = &[ |
| &["hello"], |
| &["__rust_begin_short_backtrace_rust_end_short_backtrace"], |
| &["there"], |
| ]; |
| let expected: Vec<&str> = vec![ |
| "hello", |
| "__rust_begin_short_backtrace_rust_end_short_backtrace", |
| "there", |
| ]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_backwards1() { |
| let bt: BT = &[ |
| &["hello"], |
| &["__rust_begin_short_backtrace"], |
| &["real"], |
| &["frames"], |
| &["rust_end_short_backtrace"], |
| &["case"], |
| ]; |
| let expected = vec![ |
| "hello", |
| "__rust_begin_short_backtrace", |
| "real", |
| "frames", |
| "rust_end_short_backtrace", |
| "case", |
| ]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_backwards2() { |
| let bt: BT = &[ |
| &["hello"], |
| &["__rust_begin_short_backtrace", "real", "frames"], |
| &["rust_end_short_backtrace"], |
| &["case"], |
| ]; |
| let expected = vec![ |
| "hello", |
| "__rust_begin_short_backtrace", |
| "real", |
| "frames", |
| "rust_end_short_backtrace", |
| "case", |
| ]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_backwards3() { |
| let bt: BT = &[ |
| &["hello"], |
| &["__rust_begin_short_backtrace"], |
| &["real", "frames", "rust_end_short_backtrace"], |
| &["case"], |
| ]; |
| let expected = vec![ |
| "hello", |
| "__rust_begin_short_backtrace", |
| "real", |
| "frames", |
| "rust_end_short_backtrace", |
| "case", |
| ]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_backwards4() { |
| let bt: BT = &[ |
| &["hello"], |
| &[ |
| "__rust_begin_short_backtrace", |
| "real", |
| "frames", |
| "rust_end_short_backtrace", |
| ], |
| &["case"], |
| ]; |
| let expected = vec![ |
| "hello", |
| "__rust_begin_short_backtrace", |
| "real", |
| "frames", |
| "rust_end_short_backtrace", |
| "case", |
| ]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_begin_clamp_simple() { |
| let bt: BT = &[&["hello"], &["__rust_begin_short_backtrace"], &["case"]]; |
| let expected = vec!["hello"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_begin_clamp_left_edge() { |
| let bt: BT = &[&["__rust_begin_short_backtrace"], &["case"]]; |
| let expected: Vec<&str> = vec![]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_begin_clamp_right_edge() { |
| let bt: BT = &[&["hello"], &["__rust_begin_short_backtrace"]]; |
| let expected = vec!["hello"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_begin_clamp_empty() { |
| let bt: BT = &[&["__rust_begin_short_backtrace"]]; |
| let expected: Vec<&str> = vec![]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_begin_clamp_sub() { |
| let bt: BT = &[ |
| &["real"], |
| &["frames", "core::rust_begin_short_backtrace", "junk"], |
| &["junk"], |
| ]; |
| let expected = vec!["real", "frames"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_end_clamp_simple() { |
| let bt: BT = &[&["hello"], &["__rust_end_short_backtrace"], &["case"]]; |
| let expected = vec!["case"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_end_clamp_left_edge() { |
| let bt: BT = &[&["_rust_end_short_backtrace"], &["case"]]; |
| let expected = vec!["case"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_end_clamp_right_edge() { |
| let bt: BT = &[&["hello"], &["__rust_end_short_backtrace"]]; |
| let expected: Vec<&str> = vec![]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_end_clamp_empty() { |
| let bt: BT = &[&["__rust_end_short_backtrace"]]; |
| let expected: Vec<&str> = vec![]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_end_clamp_sub() { |
| let bt: BT = &[ |
| &["junk"], |
| &["junk", "__rust_end_short_backtrace", "real"], |
| &["frames"], |
| ]; |
| let expected = vec!["real", "frames"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_both_simple() { |
| let bt: BT = &[ |
| &["hello"], |
| &["__rust_end_short_backtrace"], |
| &["real"], |
| &["frames"], |
| &["rust_begin_short_backtrace"], |
| &["case"], |
| ]; |
| let expected = vec!["real", "frames"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_both_multiball_various() { |
| let bt: BT = &[ |
| &["hello"], |
| &["__rust_end_short_backtrace"], |
| &["core::rust_end_short_backtrace"], |
| &["junk"], |
| &["rust_end_short_backtrace"], |
| &["real"], |
| &["frames"], |
| &["rust_begin_short_backtrace"], |
| &["_rust_begin_short_backtrace"], |
| &["junk"], |
| &["core::rust_begin_short_backtrace"], |
| &["case"], |
| ]; |
| let expected = vec!["real", "frames"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_both_multiball_identical() { |
| let bt: BT = &[ |
| &["hello"], |
| &["rust_end_short_backtrace"], |
| &["rust_end_short_backtrace"], |
| &["real"], |
| &["frames"], |
| &["rust_begin_short_backtrace"], |
| &["rust_begin_short_backtrace"], |
| &["case"], |
| ]; |
| let expected = vec!["real", "frames"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_both_multiball_invert1() { |
| let bt: BT = &[ |
| &["hello"], |
| &["rust_end_short_backtrace"], |
| &["real"], |
| &["frames"], |
| &["rust_begin_short_backtrace"], |
| &["junk"], |
| &["rust_end_short_backtrace"], |
| &["case"], |
| ]; |
| let expected = vec![ |
| "hello", |
| "rust_end_short_backtrace", |
| "real", |
| "frames", |
| "rust_begin_short_backtrace", |
| "junk", |
| "rust_end_short_backtrace", |
| "case", |
| ]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_both_multiball_invert2() { |
| let bt: BT = &[ |
| &["hello"], |
| &["rust_begin_short_backtrace"], |
| &["junk"], |
| &["rust_end_short_backtrace"], |
| &["real"], |
| &["frames"], |
| &["rust_begin_short_backtrace"], |
| &["case"], |
| ]; |
| let expected = vec![ |
| "hello", |
| "rust_begin_short_backtrace", |
| "junk", |
| "rust_end_short_backtrace", |
| "real", |
| "frames", |
| "rust_begin_short_backtrace", |
| "case", |
| ]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_both_adjacent() { |
| let bt: BT = &[ |
| &["hello"], |
| &["__rust_end_short_backtrace"], |
| &["rust_begin_short_backtrace"], |
| &["case"], |
| ]; |
| let expected: Vec<&str> = vec![]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_both_left_edge() { |
| let bt: BT = &[ |
| &["__rust_end_short_backtrace"], |
| &["real"], |
| &["frames"], |
| &["rust_begin_short_backtrace"], |
| &["case"], |
| ]; |
| let expected = vec!["real", "frames"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_both_right_edge() { |
| let bt: BT = &[ |
| &["hello"], |
| &["__rust_end_short_backtrace"], |
| &["real"], |
| &["frames"], |
| &["rust_begin_short_backtrace"], |
| ]; |
| let expected = vec!["real", "frames"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_both_spanned() { |
| let bt: BT = &[ |
| &["__rust_end_short_backtrace"], |
| &["real"], |
| &["frames"], |
| &["__rust_begin_short_backtrace"], |
| ]; |
| let expected = vec!["real", "frames"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_both_spanned_empty() { |
| let bt: BT = &[ |
| &["rust_end_short_backtrace"], |
| &["rust_begin_short_backtrace"], |
| ]; |
| let expected: Vec<&str> = vec![]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_one_super_frame_2() { |
| let bt: BT = &[&[ |
| "rust_end_short_backtrace", |
| "real", |
| "frames", |
| "rust_begin_short_backtrace", |
| ]]; |
| let expected = vec!["real", "frames"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_one_super_frame_1() { |
| let bt: BT = &[&[ |
| "rust_end_short_backtrace", |
| "real", |
| "rust_begin_short_backtrace", |
| ]]; |
| let expected = vec!["real"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_one_super_frame_0() { |
| let bt: BT = &[&["rust_end_short_backtrace", "rust_begin_short_backtrace"]]; |
| let expected: Vec<&str> = vec![]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_complex1() { |
| let bt: BT = &[ |
| &["junk"], |
| &["junk", "__rust_end_short_backtrace", "real"], |
| &["frames"], |
| &["here", "__rust_begin_short_backtrace", "junk"], |
| &["junk"], |
| ]; |
| let expected = vec!["real", "frames", "here"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_complex2() { |
| let bt: BT = &[ |
| &["junk"], |
| &["__rust_end_short_backtrace", "real"], |
| &["frames"], |
| &["here", "__rust_begin_short_backtrace", "junk"], |
| &["junk"], |
| ]; |
| let expected = vec!["real", "frames", "here"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_complex3() { |
| let bt: BT = &[ |
| &["junk"], |
| &["junk", "__rust_end_short_backtrace", "real"], |
| &["frames"], |
| &["here", "__rust_begin_short_backtrace"], |
| &["junk"], |
| ]; |
| let expected = vec!["real", "frames", "here"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_complex4() { |
| let bt: BT = &[ |
| &["junk"], |
| &["junk", "__rust_end_short_backtrace"], |
| &["real", "frames"], |
| &["here", "__rust_begin_short_backtrace"], |
| &["junk"], |
| ]; |
| let expected = vec!["real", "frames", "here"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_complex5() { |
| let bt: BT = &[ |
| &["junk"], |
| &["junk", "__rust_end_short_backtrace", "real"], |
| &["frames", "here"], |
| &["__rust_begin_short_backtrace"], |
| &["junk"], |
| ]; |
| let expected = vec!["real", "frames", "here"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_complex6() { |
| let bt: BT = &[ |
| &["junk"], |
| &[ |
| "junk", |
| "__rust_end_short_backtrace", |
| "real", |
| "frames", |
| "here", |
| ], |
| &["__rust_begin_short_backtrace"], |
| &["junk"], |
| ]; |
| let expected = vec!["real", "frames", "here"]; |
| assert_eq!(process(bt), expected); |
| } |
| |
| #[test] |
| fn test_complex7() { |
| let bt: BT = &[ |
| &["junk"], |
| &["junk", "__rust_end_short_backtrace"], |
| &["real", "frames", "here", "__rust_begin_short_backtrace"], |
| &["junk"], |
| ]; |
| let expected = vec!["real", "frames", "here"]; |
| assert_eq!(process(bt), expected); |
| } |