blob: c21c89b3cee85060c385a60daad02de2c066ed7c [file] [log] [blame]
#!/usr/bin/env python
from nose.tools import *
from nose import SkipTest
import networkx as nx
import io
import tempfile
import os
class TestGraph(object):
@classmethod
def setupClass(cls):
try:
import xml.etree.ElementTree
except ImportError:
raise SkipTest('xml.etree.ElementTree not available.')
def setUp(self):
self.simple_directed_data="""<?xml version="1.0" encoding="UTF-8"?>
<!-- This file was written by the JAVA GraphML Library.-->
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
<graph id="G" edgedefault="directed">
<node id="n0"/>
<node id="n1"/>
<node id="n2"/>
<node id="n3"/>
<node id="n4"/>
<node id="n5"/>
<node id="n6"/>
<node id="n7"/>
<node id="n8"/>
<node id="n9"/>
<node id="n10"/>
<edge id="foo" source="n0" target="n2"/>
<edge source="n1" target="n2"/>
<edge source="n2" target="n3"/>
<edge source="n3" target="n5"/>
<edge source="n3" target="n4"/>
<edge source="n4" target="n6"/>
<edge source="n6" target="n5"/>
<edge source="n5" target="n7"/>
<edge source="n6" target="n8"/>
<edge source="n8" target="n7"/>
<edge source="n8" target="n9"/>
</graph>
</graphml>"""
self.simple_directed_graph=nx.DiGraph()
self.simple_directed_graph.add_node('n10')
self.simple_directed_graph.add_edge('n0','n2',id='foo')
self.simple_directed_graph.add_edges_from([('n1','n2'),
('n2','n3'),
('n3','n5'),
('n3','n4'),
('n4','n6'),
('n6','n5'),
('n5','n7'),
('n6','n8'),
('n8','n7'),
('n8','n9'),
])
self.simple_directed_fh = \
io.BytesIO(self.simple_directed_data.encode('UTF-8'))
self.attribute_data="""<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns
http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
<key id="d0" for="node" attr.name="color" attr.type="string">
<default>yellow</default>
</key>
<key id="d1" for="edge" attr.name="weight" attr.type="double"/>
<graph id="G" edgedefault="directed">
<node id="n0">
<data key="d0">green</data>
</node>
<node id="n1"/>
<node id="n2">
<data key="d0">blue</data>
</node>
<node id="n3">
<data key="d0">red</data>
</node>
<node id="n4"/>
<node id="n5">
<data key="d0">turquoise</data>
</node>
<edge id="e0" source="n0" target="n2">
<data key="d1">1.0</data>
</edge>
<edge id="e1" source="n0" target="n1">
<data key="d1">1.0</data>
</edge>
<edge id="e2" source="n1" target="n3">
<data key="d1">2.0</data>
</edge>
<edge id="e3" source="n3" target="n2"/>
<edge id="e4" source="n2" target="n4"/>
<edge id="e5" source="n3" target="n5"/>
<edge id="e6" source="n5" target="n4">
<data key="d1">1.1</data>
</edge>
</graph>
</graphml>
"""
self.attribute_graph=nx.DiGraph(id='G')
self.attribute_graph.graph['node_default']={'color':'yellow'}
self.attribute_graph.add_node('n0',color='green')
self.attribute_graph.add_node('n2',color='blue')
self.attribute_graph.add_node('n3',color='red')
self.attribute_graph.add_node('n4')
self.attribute_graph.add_node('n5',color='turquoise')
self.attribute_graph.add_edge('n0','n2',id='e0',weight=1.0)
self.attribute_graph.add_edge('n0','n1',id='e1',weight=1.0)
self.attribute_graph.add_edge('n1','n3',id='e2',weight=2.0)
self.attribute_graph.add_edge('n3','n2',id='e3')
self.attribute_graph.add_edge('n2','n4',id='e4')
self.attribute_graph.add_edge('n3','n5',id='e5')
self.attribute_graph.add_edge('n5','n4',id='e6',weight=1.1)
self.attribute_fh = io.BytesIO(self.attribute_data.encode('UTF-8'))
self.simple_undirected_data="""<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
<graph id="G">
<node id="n0"/>
<node id="n1"/>
<node id="n2"/>
<node id="n10"/>
<edge id="foo" source="n0" target="n2"/>
<edge source="n1" target="n2"/>
<edge source="n2" target="n3"/>
</graph>
</graphml>"""
# <edge source="n8" target="n10" directed="false"/>
self.simple_undirected_graph=nx.Graph()
self.simple_undirected_graph.add_node('n10')
self.simple_undirected_graph.add_edge('n0','n2',id='foo')
self.simple_undirected_graph.add_edges_from([('n1','n2'),
('n2','n3'),
])
self.simple_undirected_fh = io.BytesIO(self.simple_undirected_data.encode('UTF-8'))
def test_read_simple_directed_graphml(self):
G=self.simple_directed_graph
H=nx.read_graphml(self.simple_directed_fh)
assert_equal(sorted(G.nodes()),sorted(H.nodes()))
assert_equal(sorted(G.edges()),sorted(H.edges()))
assert_equal(sorted(G.edges(data=True)),
sorted(H.edges(data=True)))
self.simple_directed_fh.seek(0)
I=nx.parse_graphml(self.simple_directed_data)
assert_equal(sorted(G.nodes()),sorted(I.nodes()))
assert_equal(sorted(G.edges()),sorted(I.edges()))
assert_equal(sorted(G.edges(data=True)),
sorted(I.edges(data=True)))
def test_write_read_simple_directed_graphml(self):
G=self.simple_directed_graph
fh=io.BytesIO()
nx.write_graphml(G,fh)
fh.seek(0)
H=nx.read_graphml(fh)
assert_equal(sorted(G.nodes()),sorted(H.nodes()))
assert_equal(sorted(G.edges()),sorted(H.edges()))
assert_equal(sorted(G.edges(data=True)),
sorted(H.edges(data=True)))
self.simple_directed_fh.seek(0)
def test_read_simple_undirected_graphml(self):
G=self.simple_undirected_graph
H=nx.read_graphml(self.simple_undirected_fh)
assert_equal(sorted(G.nodes()),sorted(H.nodes()))
assert_equal(
sorted(sorted(e) for e in G.edges()),
sorted(sorted(e) for e in H.edges()))
self.simple_undirected_fh.seek(0)
I=nx.parse_graphml(self.simple_undirected_data)
assert_equal(sorted(G.nodes()),sorted(I.nodes()))
assert_equal(
sorted(sorted(e) for e in G.edges()),
sorted(sorted(e) for e in I.edges()))
def test_read_attribute_graphml(self):
G=self.attribute_graph
H=nx.read_graphml(self.attribute_fh)
assert_equal(sorted(G.nodes(True)),sorted(H.nodes(data=True)))
ge=sorted(G.edges(data=True))
he=sorted(H.edges(data=True))
for a,b in zip(ge,he):
assert_equal(a,b)
self.attribute_fh.seek(0)
I=nx.parse_graphml(self.attribute_data)
assert_equal(sorted(G.nodes(True)),sorted(I.nodes(data=True)))
ge=sorted(G.edges(data=True))
he=sorted(I.edges(data=True))
for a,b in zip(ge,he):
assert_equal(a,b)
def test_directed_edge_in_undirected(self):
s="""<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
<graph id="G">
<node id="n0"/>
<node id="n1"/>
<node id="n2"/>
<edge source="n0" target="n1"/>
<edge source="n1" target="n2" directed='true'/>
</graph>
</graphml>"""
fh = io.BytesIO(s.encode('UTF-8'))
assert_raises(nx.NetworkXError,nx.read_graphml,fh)
assert_raises(nx.NetworkXError,nx.parse_graphml,s)
def test_undirected_edge_in_directed(self):
s="""<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
<graph id="G" edgedefault='directed'>
<node id="n0"/>
<node id="n1"/>
<node id="n2"/>
<edge source="n0" target="n1"/>
<edge source="n1" target="n2" directed='false'/>
</graph>
</graphml>"""
fh = io.BytesIO(s.encode('UTF-8'))
assert_raises(nx.NetworkXError,nx.read_graphml,fh)
assert_raises(nx.NetworkXError,nx.parse_graphml,s)
def test_key_error(self):
s="""<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns
http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
<key id="d0" for="node" attr.name="color" attr.type="string">
<default>yellow</default>
</key>
<key id="d1" for="edge" attr.name="weight" attr.type="double"/>
<graph id="G" edgedefault="directed">
<node id="n0">
<data key="d0">green</data>
</node>
<node id="n1"/>
<node id="n2">
<data key="d0">blue</data>
</node>
<edge id="e0" source="n0" target="n2">
<data key="d2">1.0</data>
</edge>
</graph>
</graphml>
"""
fh = io.BytesIO(s.encode('UTF-8'))
assert_raises(nx.NetworkXError,nx.read_graphml,fh)
assert_raises(nx.NetworkXError,nx.parse_graphml,s)
def test_hyperedge_error(self):
s="""<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns
http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
<key id="d0" for="node" attr.name="color" attr.type="string">
<default>yellow</default>
</key>
<key id="d1" for="edge" attr.name="weight" attr.type="double"/>
<graph id="G" edgedefault="directed">
<node id="n0">
<data key="d0">green</data>
</node>
<node id="n1"/>
<node id="n2">
<data key="d0">blue</data>
</node>
<hyperedge id="e0" source="n0" target="n2">
<endpoint node="n0"/>
<endpoint node="n1"/>
<endpoint node="n2"/>
</hyperedge>
</graph>
</graphml>
"""
fh = io.BytesIO(s.encode('UTF-8'))
assert_raises(nx.NetworkXError,nx.read_graphml,fh)
assert_raises(nx.NetworkXError,nx.parse_graphml,s)
# remove test until we get the "name" issue sorted
# https://networkx.lanl.gov/trac/ticket/544
def test_default_attribute(self):
G=nx.Graph()
G.add_node(1,label=1,color='green')
G.add_path([0,1,2,3])
G.add_edge(1,2,weight=3)
G.graph['node_default']={'color':'yellow'}
G.graph['edge_default']={'weight':7}
fh = io.BytesIO()
nx.write_graphml(G,fh)
fh.seek(0)
H=nx.read_graphml(fh,node_type=int)
assert_equal(sorted(G.nodes()),sorted(H.nodes()))
assert_equal(
sorted(sorted(e) for e in G.edges()),
sorted(sorted(e) for e in H.edges()))
assert_equal(G.graph,H.graph)
def test_multigraph_keys(self):
# test that multigraphs use edge id attributes as key
pass
def test_multigraph_to_graph(self):
# test converting multigraph to graph if no parallel edges are found
pass
def test_yfiles_extension(self):
data="""<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
<!--Created by yFiles for Java 2.7-->
<key for="graphml" id="d0" yfiles.type="resources"/>
<key attr.name="url" attr.type="string" for="node" id="d1"/>
<key attr.name="description" attr.type="string" for="node" id="d2"/>
<key for="node" id="d3" yfiles.type="nodegraphics"/>
<key attr.name="Description" attr.type="string" for="graph" id="d4">
<default/>
</key>
<key attr.name="url" attr.type="string" for="edge" id="d5"/>
<key attr.name="description" attr.type="string" for="edge" id="d6"/>
<key for="edge" id="d7" yfiles.type="edgegraphics"/>
<graph edgedefault="directed" id="G">
<node id="n0">
<data key="d3">
<y:ShapeNode>
<y:Geometry height="30.0" width="30.0" x="125.0" y="100.0"/>
<y:Fill color="#FFCC00" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" borderDistance="0.0" fontFamily="Dialog" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.1328125" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="12.27099609375" x="8.864501953125" y="5.43359375">1</y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n1">
<data key="d3">
<y:ShapeNode>
<y:Geometry height="30.0" width="30.0" x="183.0" y="205.0"/>
<y:Fill color="#FFCC00" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" borderDistance="0.0" fontFamily="Dialog" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.1328125" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="12.27099609375" x="8.864501953125" y="5.43359375">2</y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<edge id="e0" source="n0" target="n1">
<data key="d7">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="none" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
</graph>
<data key="d0">
<y:Resources/>
</data>
</graphml>
"""
fh = io.BytesIO(data.encode('UTF-8'))
G=nx.read_graphml(fh)
assert_equal(G.edges(),[('n0','n1')])
assert_equal(G['n0']['n1']['id'],'e0')
assert_equal(G.node['n0']['label'],'1')
assert_equal(G.node['n1']['label'],'2')
H=nx.parse_graphml(data)
assert_equal(H.edges(),[('n0','n1')])
assert_equal(H['n0']['n1']['id'],'e0')
assert_equal(H.node['n0']['label'],'1')
assert_equal(H.node['n1']['label'],'2')
def test_unicode(self):
G = nx.Graph()
try: # Python 3.x
name1 = chr(2344) + chr(123) + chr(6543)
name2 = chr(5543) + chr(1543) + chr(324)
node_type=str
except ValueError: # Python 2.6+
name1 = unichr(2344) + unichr(123) + unichr(6543)
name2 = unichr(5543) + unichr(1543) + unichr(324)
node_type=unicode
G.add_edge(name1, 'Radiohead', attr_dict={'foo': name2})
fd, fname = tempfile.mkstemp()
nx.write_graphml(G, fname)
H = nx.read_graphml(fname,node_type=node_type)
assert_equal(G.adj, H.adj)
os.close(fd)
os.unlink(fname)
def test_bool(self):
s="""<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns
http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
<key id="d0" for="node" attr.name="test" attr.type="boolean">
<default>false</default>
</key>
<graph id="G" edgedefault="directed">
<node id="n0">
<data key="d0">True</data>
</node>
<node id="n1"/>
<node id="n2">
<data key="d0">False</data>
</node>
<node id="n3">
<data key="d0">true</data>
</node>
<node id="n4">
<data key="d0">false</data>
</node>
</graph>
</graphml>
"""
fh = io.BytesIO(s.encode('UTF-8'))
G=nx.read_graphml(fh)
assert_equal(G.node['n0']['test'],True)
assert_equal(G.node['n2']['test'],False)
H=nx.parse_graphml(s)
assert_equal(H.node['n0']['test'],True)
assert_equal(H.node['n2']['test'],False)