blob: d4d41129a76d0b0daf402fa65fa202aab60aeec7 [file] [log] [blame]
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);
}