TEST(PreorderIterator, ComplexGraph) {
    Graph graph;

    for (size_t i = 0; i < 10; ++i)
        graph.CreateNode();

    graph.GetNode(0).AddChild(1);
    graph.GetNode(0).AddChild(6);
    graph.GetNode(0).AddChild(7);

    graph.GetNode(1).AddChild(2);
    graph.GetNode(1).AddChild(3);
    graph.GetNode(1).AddChild(4);
    graph.GetNode(1).AddChild(5);

    graph.GetNode(7).AddChild(8);

    graph.GetNode(8).AddChild(9);

    std::vector<NodeId> expected_nodes = {
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    std::vector<size_t> expected_depths = {
        0, 1, 2, 2, 2, 2, 1, 1, 2, 3};
    std::vector<size_t> expected_child_index = {
        0, 0, 0, 1, 2, 3, 1, 2, 0, 0};
    
    ExpectTraversal(expected_nodes, expected_depths, expected_child_index, graph);
}
TEST(PreorderIterator, SimpleGraph) {
    Graph graph;

    Node& root = graph.CreateNode();
    for (size_t i = 0; i < 10; ++i)
        root.AddChild(graph.CreateNode().id());

    std::vector<NodeId> expected_nodes = {
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    std::vector<size_t> expected_depths = {
        0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
    std::vector<size_t> expected_child_index = {
        0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    
    ExpectTraversal(expected_nodes, expected_depths, expected_child_index, graph);
}
TEST(PreorderIterator, VerticalGraph) {
    Graph graph;

    Node* lastNode = &graph.CreateNode();
    for (size_t i = 0; i < 10; ++i) {
        Node* newNode = &graph.CreateNode();
        lastNode->AddChild(newNode->id());
        lastNode = newNode;
    }

    std::vector<NodeId> expected_nodes = {
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    std::vector<size_t> expected_depths = {
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    std::vector<size_t> expected_child_index = {
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    
    ExpectTraversal(expected_nodes, expected_depths, expected_child_index, graph);
}