From 973f0e2358effa4018ac6add92dbfa3a3ffc3619 Mon Sep 17 00:00:00 2001
From: "niehues.mark@gmail.com" <niehues.mark@gmail.com>
Date: Thu, 12 Mar 2020 13:52:41 +0100
Subject: [PATCH] Default layout with edges and marked stations

---
 graph.tex           | 22 +++++-------------
 tests/config.py     | 34 +++++++++++++++++++++++++++
 tests/conftest.py   | 56 +++------------------------------------------
 tests/draw.py       | 52 +++++++++++++++++++++++++++++++++++++++++
 tests/test_graph.py | 18 +++++----------
 5 files changed, 101 insertions(+), 81 deletions(-)
 create mode 100644 tests/config.py
 create mode 100644 tests/draw.py

diff --git a/graph.tex b/graph.tex
index e65853e..0026018 100644
--- a/graph.tex
+++ b/graph.tex
@@ -1,19 +1,9 @@
-\documentclass{standalone}
-\usepackage{tikz-network}
-\begin{document}
 \begin{tikzpicture}
 \clip (0,0) rectangle (6,6);
-\Vertex[x=0.350,y=0.691]{0}
-\Vertex[x=1.486,y=1.221]{1}
-\Vertex[x=1.561,y=4.476]{3}
-\Vertex[x=5.650,y=4.325]{2}
-\Vertex[x=5.499,y=5.309]{4}
-\Edge[label=0.33](0)(1)
-\Edge[label=1.05](0)(3)
-\Edge[label=0.53](1)(2)
-\Edge[label=0.33](1)(3)
-\Edge[label=1.08](3)(2)
-\Edge[label=1.06](3)(4)
-\Edge[label=0.26](2)(4)
+\Vertex[x=0.550,y=1.775,color={white},size={1.0},label={s,1},style={circle,style={draw,double}}]{0}
+\Vertex[x=5.450,y=1.775,color={white},size={1.0},label={a,2},style={circle,style={draw,double}}]{1}
+\Vertex[x=3.000,y=4.225,color={white},size={1.0},label={t},style={circle}]{2}
+\Edge[label={(1, 1)}](0)(1)
+\Edge[label={(1, 4)}](0)(2)
+\Edge[label={(1, 1)}](1)(2)
 \end{tikzpicture}
-\end{document}
\ No newline at end of file
diff --git a/tests/config.py b/tests/config.py
new file mode 100644
index 0000000..e73cda4
--- /dev/null
+++ b/tests/config.py
@@ -0,0 +1,34 @@
+from collections import namedtuple
+
+import networkx as nx
+
+Street = namedtuple('Street', ['u', 'v', 'distance', 'consumption'])
+Node = namedtuple('Node', ['label', 'charging_coeff'], defaults=(None, None))
+
+edge_case = {
+    'b_0': 0,
+    'b_t': 0,
+    'U': 4,
+    'nodes': [
+        Node('s', charging_coeff=1),
+        Node('a', charging_coeff=2),
+        Node('t'),
+    ],
+    'edges': [
+        Street(0, 1, distance=1, consumption=1),
+        Street(0, 2, distance=1, consumption=4),
+        Street(1, 2, distance=1, consumption=1),
+    ]
+}
+
+
+def get_graph(config):
+    G = nx.Graph()
+
+    for node_id, node in enumerate(config['nodes']):
+        G.add_node(node_id, label=node.label, c=node.charging_coeff)
+
+    for edge in config['edges']:
+        G.add_edge(edge.u, edge.v, weight=edge.distance, c=edge.consumption)
+
+    return G
diff --git a/tests/conftest.py b/tests/conftest.py
index a39ea65..1d40e94 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -1,60 +1,10 @@
-from collections import namedtuple
-
 import pytest
-import networkx as nx
 
-Street = namedtuple('Street', ['u', 'v', 'street_type'])
-Edge = namedtuple('Edge', ['x', 'y', 'charging_coeff'], defaults=(None,))
-config = {
-    'speed': {
-        'default': 50,  # km/h
-        'highway': 130  # km/h
-    },
-    'consumption': {
-        'default': 125  # Wh/km
-    },
-    'nodes': [
-        Edge(14, 16, 10),
-        Edge(29, 23),
-        Edge(84, 64),
-        Edge(30, 66),
-        Edge(82, 77)
-    ],
-    'edges': [
-        Street(0, 1, 'default'),
-        Street(0, 3, 'default'),
-        Street(1, 2, 'highway'),
-        Street(1, 3, 'highway'),
-        Street(2, 3, 'default'),
-        Street(2, 4, 'default'),
-        Street(3, 4, 'default')
-    ]
-}
+from .config import edge_case, get_graph
 
 
 @pytest.fixture
-def G():
-    G = init_graph()
+def G_Edge_Case():
+    G = get_graph(edge_case)
     yield G
     del G
-
-
-def init_graph():
-    G = nx.Graph()
-
-    for edge in config['edges']:
-        u_x, u_y, u_ch = config['nodes'][edge.u]
-        v_x, v_y, v_ch = config['nodes'][edge.v]
-
-        # Calculate euclidean distance
-        s = ((v_y - u_y) ** 2 + (v_x - u_x) ** 2) ** (1 / 2)  # in km
-
-        # Calc travel time via t = s/v
-        t = s / config['speed'][edge.street_type]  # in h
-
-        # Calc consumption via c = s * consumption_per_km
-        c = s * config['consumption']['default']
-
-        G.add_edge(edge.u, edge.v, weight=t, c=c, d=s)
-
-    return G
diff --git a/tests/draw.py b/tests/draw.py
new file mode 100644
index 0000000..ee38d09
--- /dev/null
+++ b/tests/draw.py
@@ -0,0 +1,52 @@
+import networkx as nx
+import network2tikz as tikz
+
+
+def draw_graph(G: nx.Graph, filename=None):
+    """Draw graph marking stations as double circles."""
+    layout = nx.planar_layout(G)
+
+    tikz.plot(
+        G,
+        filename=filename,
+        layout=layout,
+        standalone=False,
+        **_get_edge_styles(G),
+        **_get_node_styles(G)
+    )
+
+
+def _get_edge_styles(G):
+    styles = {
+        'edges_label': {(u, v): '({}, {})'.format(
+            G[u][v]['weight'],
+            G[u][v]['c']) for u, v in G.edges}
+    }
+
+    return styles
+
+
+def _get_node_styles(G):
+    styles = {
+        'vertex_color': ['white' for n in G.nodes],
+        'vertex_size': 1.
+    }
+
+    nodes_label = {}
+    nodes_style = {}
+    for n in G:
+        style = 'circle'
+        label = G.nodes[n].get('label', str(n))
+
+        c = G.nodes[n].get('c', None)
+        if c is not None:
+            style += ',style={draw,double}'
+            label += ',{}'.format(c)
+
+        nodes_label[n] = label
+        nodes_style[n] = style
+
+    styles['nodes_label'] = nodes_label
+    styles['nodes_style'] = nodes_style
+
+    return styles
diff --git a/tests/test_graph.py b/tests/test_graph.py
index 3a841cb..278f7fb 100644
--- a/tests/test_graph.py
+++ b/tests/test_graph.py
@@ -1,18 +1,12 @@
 import networkx as nx
-import network2tikz as tikz
 
-from .conftest import config
+from .draw import draw_graph
 
 
-def test_graph_creation(G: nx.Graph):
-    assert G.number_of_nodes() == 5
-    assert G.number_of_edges() == 7
+def test_graph_creation(G_Edge_Case: nx.Graph):
+    assert G_Edge_Case.number_of_nodes() == 3
+    assert G_Edge_Case.number_of_edges() == 3
 
 
-def test_print_graph(G: nx.Graph):
-    layout = {i: (d[0], d[1]) for i, d in enumerate(config['nodes'])}
-    edges_label = {(u, v): '{:.2f}'.format(G[u][v]['weight']).format() for u, v in G.edges}
-
-    #layout = nx.planar_layout(G)
-
-    tikz.plot(G, 'graph.tex', layout=layout, edges_label=edges_label)
+def test_print_graph(G_Edge_Case: nx.Graph):
+    draw_graph(G_Edge_Case, 'graph.tex')
-- 
GitLab