tests_impls!
{

  #[ test ]
  fn node()
  {
    use TheModule::prelude::*;
    let mut factory = TheFactory::< TheModule::IdentityWithInt >::make();

    let n1 = factory.node_making( 1 );
    let n1b = factory.node( 1 );
    a_id!( n1, n1b.id() );
    dbg!( &n1 );

    let node1a = factory.node( 1 );
    let node1b = factory.node( 1 );
    a_id!( node1a, node1b );

    let node1a = factory.node( &1 );
    let node1b = factory.node( &&1 );
    a_id!( node1a, node1b );

  }

  //

  #[ test ]
  fn make_default()
  {
    use TheModule::prelude::*;

    let mut factory : TheFactory::< TheModule::IdentityWithInt > = make!();
    let n1 = factory.node_making( 1 );
    let n1b = factory.node( 1 );
    a_id!( n1, n1b.id() );

  }

  //

  #[ test ]
  fn basic()
  {
    use TheModule::prelude::*;

    let mut factory = TheFactory::< TheModule::IdentityWithInt >::make();

    let a = factory.node_making( 1 );
    let b = factory.node_making( 2 );

    factory.node_add_out_node( a, b );
    factory.node_add_out_nodes( b, [ a, b ].into_iter() );

    a_id!( factory.nnodes(), 2 );
    a_id!( factory.nedges(), 3 );

    dbg!( factory.node( a ) );
    dbg!( factory.node( b ) );

    let got : HashSet< _ > = factory.out_nodes_ids( a ).collect();
    let exp = hset![ b ];
    a_id!( got, exp );
    let got : HashSet< _ > = factory.out_nodes_ids( b ).collect();
    let exp = hset![ a, b ];
    a_id!( got, exp );

    // let got : HashSet< _ > = factory.out_nodes_ids_2( a ).collect();
    // let exp = hset![ b ];
    // a_id!( got, exp );
    // let got : HashSet< _ > = factory.out_nodes_ids_2( b ).collect();
    // let exp = hset![ a, b ];
    // a_id!( got, exp );

    let got : HashSet< _ > = factory.out_edges( a ).map( | el | ( el.1.in_node, el.1.out_node ) ).collect();
    let exp = hset![ ( a, b ) ];
    a_id!( got, exp );
    let got : HashSet< _ > = factory.out_edges( b ).map( | el | ( el.1.in_node, el.1.out_node ) ).collect();
    let exp = hset![ ( b, a ), ( b, b ) ];
    a_id!( got, exp );

    // let got = factory.out_nodes_ids_2( a ).map( | id |
    // {
    //   // 13_i32
    //   ( id, factory.node( id ) )
    // });
    // use test_tools::inspect_type_of;
    // inspect_type_of!( got );

  }

  //

  #[ test ]
  fn make_with_edge_list()
  {
    use TheModule::prelude::*;

    let mut factory = TheFactory::< TheModule::IdentityWithInt >::make();

    factory.make_with_edge_list
    ([
      1, 2,
      2, 1,
      2, 2,
    ]);

    dbg!( factory.node( 1 ) );
    dbg!( factory.node( 2 ) );

    let exp = hset![ 2 ];
    let got : HashSet< _ > = factory.out_nodes_ids( 1 ).collect();
    a_id!( got, exp );
    let exp = hset![ 1, 2 ];
    let got : HashSet< _ > = factory.out_nodes_ids( 2 ).collect();
    a_id!( got, exp );

    let got : HashSet< _ > = factory.out_edges( 1 ).map( | el | ( el.1.in_node, el.1.out_node ) ).collect();
    let exp = hset![ ( factory.edge_id( 1 ), factory.edge_id( 2 ) ) ];
    a_id!( got, exp );
    let got : HashSet< _ > = factory.out_edges( 2 ).map( | el | ( el.1.in_node, el.1.out_node ) ).collect();
    let exp = hset![ ( factory.edge_id( 2 ), factory.edge_id( 1 ) ), ( factory.edge_id( 2 ), factory.edge_id( 2 ) ) ];
    // let exp = hset![ factory.edge_ids( 2, 1 ), factory.edge_ids( 2, 2 ) ];
    // let exp : HashSet< ( TheModule::IdentityWithInt, TheModule::IdentityWithInt ) > = hset![ ( 2, 1 ).into(), ( 2, 2 ).into() ];
    a_id!( got, exp );

  }

  //

  #[ test ]
  fn make_with_edge_list_string()
  {
    use TheModule::prelude::*;

    let mut factory = TheFactory::< TheModule::IdentityWithName >::make();

    factory.make_with_edge_list
    ([
      "A", "B",
      "B", "A",
      "B", "B",
    ]);

    dbg!( factory.node( "A" ) );
    dbg!( factory.node( "B" ) );

    let exp = hset![ "B" ];
    let got : HashSet< _ > = factory.out_nodes_ids( "A" ).collect();
    a_id!( got, exp );

    let exp = hset![ "A", "B" ];
    let got : HashSet< _ > = factory.out_nodes_ids( "B" ).collect();
    a_id!( got, exp );
  }

  //

  #[ test ]
  fn graph_print()
  {
    use TheModule::prelude::*;

    let mut factory = TheFactory::< TheModule::IdentityWithInt >::make();

    factory.make_with_edge_list
    ([
      1, 2,
      2, 1,
      2, 2,
    ]);

    let exp = r#"NodeFactory
  node::1
   - 2
  node::2
   - 1
   - 2"#;
    let got = format!( "{:?}", factory );
    println!( "{}", got );
    a_id!( got, exp );

  }

}

