Documentation
use diml::{Node, parse};

fn with_name(node: &Node, name: &str) -> Vec<String> {
    node.with_name(name)
        .map(|node| node.name().to_string())
        .collect::<Vec<String>>()
}

fn with_names(node: &Node, names: &[&str]) -> Vec<String> {
    node.with_names(names)
        .map(|node| node.name().to_string())
        .collect::<Vec<String>>()
}

fn excluding_name(node: &Node, name: &str) -> Vec<String> {
    node.excluding_name(name)
        .map(|node| node.name().to_string())
        .collect::<Vec<String>>()
}

fn excluding_names(node: &Node, names: &[&str]) -> Vec<String> {
    node.excluding_names(names)
        .map(|node| node.name().to_string())
        .collect::<Vec<String>>()
}

#[test]
fn _0001() {
    let input = r".A
    .B
    .B
    .C
    .D
    .D
    .D
";
    let root = parse(input).unwrap();
    assert_eq!(1, root.children().len());
    let node = root.children().next().unwrap();
    assert_eq!(6, node.children().len());
    assert_eq!("A", node.name());
    assert_eq!("\n", node.content());
    assert_eq!(vec!["B", "B"], with_name(node, "B"));
    assert_eq!(vec!["C"], with_name(node, "C"));
    assert_eq!(vec!["D", "D", "D"], with_name(node, "D"));
    assert_eq!(0, with_name(node, "E").len());
}

#[test]
fn _0002() {
    let input = r".A
    .B
    .B
    .C
    .D
    .D
    .D
";
    let root = parse(input).unwrap();
    let node = root.children().next().unwrap();
    assert_eq!(vec!["C", "D", "D", "D"], excluding_name(node, "B"));
    assert_eq!(vec!["B", "B", "D", "D", "D"], excluding_name(node, "C"));
    assert_eq!(vec!["B", "B", "C"], excluding_name(node, "D"));
}

#[test]
fn _0003() {
    let input = r".A
    .B
    .B
    .C
    .D
    .D
    .D
";
    let root = parse(input).unwrap();
    let node = root.children().next().unwrap();
    assert_eq!(vec!["B", "B"], with_names(node, &["B"]));
    assert_eq!(vec!["B", "B", "D", "D", "D"], with_names(node, &["B", "D"]));
    assert_eq!(vec!["B", "B", "C"], with_names(node, &["C", "B"]));
}

#[test]
fn _0004() {
    let input = r".A
    .B
    .B
    .C
    .D
    .D
    .D
";
    let root = parse(input).unwrap();
    let node = root.children().next().unwrap();
    assert_eq!(vec!["C", "D", "D", "D"], excluding_names(node, &["B"]));
    assert_eq!(vec!["C"], excluding_names(node, &["B", "D"]));
    assert_eq!(vec!["D", "D", "D"], excluding_names(node, &["C", "B"]));
}

#[test]
fn _0005() {
    let input = r".A
    .B
    .C
    .D
    .E
    .F
    .G
";
    let root = parse(input).unwrap();
    let node = root.children().next().unwrap();
    assert_eq!(6, node.children().count());
    assert_eq!(6, node.children().len());
    assert_eq!(
        vec!["G", "F", "E", "D", "C", "B"],
        node.children()
            .rev()
            .map(|node| node.name().to_string())
            .collect::<Vec<String>>()
    );
}