frontend 0.4.0

rustc's frontend with no LLVM and no std: parsing through MIR, as a library
// `#![no_std]`: these arrive with the standard prelude and name no path, so a `std::`
// search cannot see them - and a `#[derive]` can use them without the name appearing
// in this file at all, which is why they are not trimmed by inspection.
use alloc::borrow::ToOwned;
use alloc::boxed::Box;
use alloc::format;
use alloc::string::{String, ToString};
use alloc::vec;
use alloc::vec::Vec;

use super::super::tests::TestGraph;
use super::*;

#[test]
fn diamond_post_order() {
    let graph = TestGraph::new(0, &[(0, 1), (0, 2), (1, 3), (2, 3)]);

    let result = post_order_from(&graph, 0);
    assert_eq!(result, vec![3, 1, 2, 0]);
}

#[test]
fn is_cyclic() {
    use super::super::is_cyclic;

    let diamond_acyclic = TestGraph::new(0, &[(0, 1), (0, 2), (1, 3), (2, 3)]);
    let diamond_cyclic = TestGraph::new(0, &[(0, 1), (1, 2), (2, 3), (3, 0)]);

    assert!(!is_cyclic(&diamond_acyclic));
    assert!(is_cyclic(&diamond_cyclic));
}

#[test]
fn dfs() {
    let graph = TestGraph::new(0, &[(0, 1), (0, 2), (1, 3), (2, 3), (3, 0)]);

    let result: Vec<usize> = DepthFirstSearch::new(&graph).with_start_node(0).collect();
    assert_eq!(result, vec![0, 2, 3, 1]);
}

#[test]
fn dfs_debug() {
    let graph = TestGraph::new(0, &[(0, 1), (0, 2), (1, 3), (2, 3), (3, 0)]);
    let mut dfs = DepthFirstSearch::new(&graph).with_start_node(0);
    dfs.complete_search();
    assert_eq!(format!("{{0, 1, 2, 3}}"), format!("{:?}", dfs));
}