// Use, modification and distribution is subject to the Boost Software 
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at 
// http://www.boost.org/LICENSE_1_0.txt) 
//
// Copyright 2005 Trustees of Indiana University 
// 
// Author:   Douglas Gregor 

#include <string> 
#include <fstream>                           // for file I/O

#include <boost/graph/adjacency_list.hpp> 
#include <boost/graph/graphviz.hpp> 
#include <boost/graph/iteration_macros.hpp> 

#include <boost/test/minimal.hpp> 
 
using namespace boost; 
 
typedef boost::adjacency_list<vecS,vecS,directedS, 
                              property<vertex_name_t,std::string>, 
                              property<edge_weight_t,double> > 
        Digraph; 
 
typedef boost::adjacency_list<vecS,vecS,undirectedS, 
                              property<vertex_name_t,std::string>, 
                              property<edge_weight_t,double> > 
        Graph; 
 
void test_graph_read_write(const std::string &filename) 
{ 
  std::ifstream in(filename.c_str()); 
  BOOST_REQUIRE(in); 

  Graph g; 

  dynamic_properties dp(ignore_other_properties); 

  dp.property("id",get(vertex_name,g));
  dp.property("weight",get(edge_weight,g));

  BOOST_CHECK(read_graphviz(in,g,dp,"id"));

  BOOST_CHECK(num_vertices(g) == 4);
  BOOST_CHECK(num_edges(g) == 4);

  typedef graph_traits<Graph>::vertex_descriptor Vertex; 
 
  std::map<std::string,Vertex> name_to_vertex;

  BGL_FORALL_VERTICES(v,g,Graph)
    name_to_vertex[get(vertex_name,g,v)] = v;

  // check vertices
 
  BOOST_CHECK(name_to_vertex.find("0") != name_to_vertex.end());
  BOOST_CHECK(name_to_vertex.find("1") != name_to_vertex.end()); 
  BOOST_CHECK(name_to_vertex.find("foo") != name_to_vertex.end()); 
  BOOST_CHECK(name_to_vertex.find("bar") != name_to_vertex.end());

  // check edges
 
  BOOST_CHECK(edge(name_to_vertex["0"],name_to_vertex["1"],g).second);
  BOOST_CHECK(edge(name_to_vertex["1"],name_to_vertex["foo"],g).second);
  BOOST_CHECK(edge(name_to_vertex["foo"],name_to_vertex["bar"],g).second);
  BOOST_CHECK(edge(name_to_vertex["1"],name_to_vertex["bar"],g).second);

  BOOST_CHECK(get(edge_weight,g,
                  edge(name_to_vertex["0"],name_to_vertex["1"],g).first)
                == 3.14159); 
  BOOST_CHECK(get(edge_weight,g,  
                  edge(name_to_vertex["1"],name_to_vertex["foo"],g).first)
                == 2.71828);
  BOOST_CHECK(get(edge_weight,g,
                  edge(name_to_vertex["foo"],name_to_vertex["bar"],g).first)
                == 10.0); 
  BOOST_CHECK(get(edge_weight,g,  
                  edge(name_to_vertex["1"],name_to_vertex["bar"], g).first)
                == 10.0); 

  // write out the graph
  write_graphviz(std::cout,g,dp,std::string("id"));
} 
 
int test_main(int, char*[]) 
{ 
  test_graph_read_write("graphviz_example.dot"); 
   
  return 0; 
} 
