1 # -*- coding: utf-8 -*-
2 # Test graph dot file generation
4 # Copyright (C) Andrew Bartlett 2018.
6 # Written by Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
8 # This program is free software; you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 3 of the License, or
11 # (at your option) any later version.
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
21 """Tests for samba.graph"""
23 from __future__ import print_function
27 from samba import graph
33 class DotFileTests(samba.tests.TestCaseInTempDir):
35 def assertMatch(self, exp, s):
38 self.fail("%r did not match /%s/" % (s, exp))
41 def assertHeader(self, lines, title, directed):
42 self.assertEqual(lines[0], '/* generated by samba */')
44 exp = r'^digraph \w+ {$'
46 exp = r'^graph \w+ {$'
47 self.assertMatch(exp, lines[1])
48 m = self.assertMatch(r'^label="([\w ]+)";$', lines[2])
49 self.assertEqual(m.group(1), title)
50 self.assertMatch(r'^fontsize=10;$', lines[3])
51 self.assertMatch(r'$', lines[4])
52 self.assertEqual(lines[5], 'node[fontname=Helvetica; fontsize=10];')
53 self.assertEqual(lines[6], '')
55 def assertVertices(self, lines, names):
56 for n, line in zip(names, lines):
57 m = self.assertMatch(r'^"(\w+)";$', line)
58 self.assertEqual(n, m.group(1))
60 def assertEdges(self, lines, edges, directed):
61 connector = '->' if directed else '--'
63 for edge, line in zip(edges, lines):
65 m = self.assertMatch((r'^"(\w+)" ([>-]{2}) '
66 r'"(\w+)" ?(?:\[([^\]])\])?;$'),
68 self.assertEqual(m.group(1), a)
69 self.assertEqual(m.group(2), connector)
70 self.assertEqual(m.group(3), b)
72 self.assertMatch(r'^[\w ]*$', m.group(4))
74 def test_basic_dot_files(self):
75 vertices = tuple('abcdefgh')
76 all_edges = tuple(itertools.combinations(vertices, 2))
77 line_edges = list(zip(vertices[1:], vertices[:-1]))
78 ring_edges = line_edges + [(vertices[0], vertices[-1])]
80 # even join to even numbers, odd to odd
81 disjoint_edges = [(a, b) for a, b in all_edges if
84 for name, edges in (('all', all_edges),
88 ('disjoint', disjoint_edges)):
90 for directed, tag in ((True, "directed"),
91 (False, "undirected")):
92 title = "%s %s" % (name, tag)
94 g = graph.dot_graph(vertices, edges,
98 self.assertHeader(lines, title, directed)
99 self.assertVertices(lines[7:], vertices)
100 self.assertEdges(lines[len(vertices) + 7:], edges, directed)
103 class DistanceTests(samba.tests.TestCase):
106 super(DistanceTests, self).setUp()
107 # a sorted list of colour set names.
108 self.sorted_colour_sets = sorted(
110 # return '' for None, so it's sortable.
111 key=lambda name: name or '')
113 def test_simple_distance(self):
114 edges = [('ant', 'bat'),
119 ('frog', 'elephant'),
127 "utf8 True, colour None": '''
141 'utf8 True, colour ansi': '''
142 \e[4mdestination
\e[0m
143 \e[0m
\e[37m╭────── ant
\e[0m
144 \e[37m│
\e[0m
\e[1;30m╭───── bat
\e[0m
145 \e[37m│
\e[1;30m│
\e[0m
\e[37m╭──── cat
\e[0m
146 \e[37m│
\e[1;30m│
\e[37m│
\e[0m
\e[1;30m╭─── dog
\e[0m
147 \e[37m│
\e[1;30m│
\e[37m│
\e[1;30m│
\e[0m
\e[37m╭── elephant
\e[0m
148 \e[4msource
\e[0m
\e[37m│
\e[1;30m│
\e[37m│
\e[1;30m│
\e[37m│
\e[0m
\e[1;30m╭─ frog
\e[0m
149 \e[37m ant
\e[0m
\e[0m
\e[37m·
\e[0m
\e[1;32m1
\e[0m
\e[33m2
\e[0m
\e[33m2
\e[0m
\e[1;32m1
\e[0m
\e[1;31m-
\e[0m
150 \e[1;30m bat
\e[0m
\e[33m3
\e[0m
\e[0m
\e[1;30m·
\e[0m
\e[33m2
\e[0m
\e[1;32m1
\e[0m
\e[1;32m1
\e[0m
\e[1;31m-
\e[0m
151 \e[37m cat
\e[0m
\e[1;32m1
\e[0m
\e[33m2
\e[0m
\e[0m
\e[37m·
\e[0m
\e[1;32m1
\e[0m
\e[33m2
\e[0m
\e[1;31m-
\e[0m
152 \e[1;30m dog
\e[0m
\e[1;31m-
\e[1;31m-
\e[1;31m-
\e[0m
\e[1;30m·
\e[0m
\e[1;31m-
\e[1;31m-
\e[0m
153 \e[37melephant
\e[0m
\e[33m2
\e[0m
\e[33m3
\e[0m
\e[1;32m1
\e[0m
\e[1;32m1
\e[0m
\e[0m
\e[37m·
\e[0m
\e[1;31m-
\e[0m
154 \e[1;30m frog
\e[0m
\e[33m2
\e[0m
\e[33m3
\e[0m
\e[1;32m1
\e[0m
\e[33m2
\e[0m
\e[1;32m1
\e[0m
\e[0m
\e[1;30m·
\e[0m
\e[0m
156 'utf8 True, colour ansi-heatmap': '''
157 \e[4mdestination
\e[0m
158 \e[0m
\e[37m╭────── ant
\e[0m
159 \e[37m│
\e[0m
\e[1;30m╭───── bat
\e[0m
160 \e[37m│
\e[1;30m│
\e[0m
\e[37m╭──── cat
\e[0m
161 \e[37m│
\e[1;30m│
\e[37m│
\e[0m
\e[1;30m╭─── dog
\e[0m
162 \e[37m│
\e[1;30m│
\e[37m│
\e[1;30m│
\e[0m
\e[37m╭── elephant
\e[0m
163 \e[4msource
\e[0m
\e[37m│
\e[1;30m│
\e[37m│
\e[1;30m│
\e[37m│
\e[0m
\e[1;30m╭─ frog
\e[0m
164 \e[37m ant
\e[0m
\e[0m
\e[37m·
\e[0m
\e[1;42m1
\e[0m
\e[43m2
\e[0m
\e[43m2
\e[0m
\e[1;42m1
\e[0m
\e[1;41m-
\e[0m
165 \e[1;30m bat
\e[0m
\e[43m3
\e[0m
\e[0m
\e[1;30m·
\e[0m
\e[43m2
\e[0m
\e[1;42m1
\e[0m
\e[1;42m1
\e[0m
\e[1;41m-
\e[0m
166 \e[37m cat
\e[0m
\e[1;42m1
\e[0m
\e[43m2
\e[0m
\e[0m
\e[37m·
\e[0m
\e[1;42m1
\e[0m
\e[43m2
\e[0m
\e[1;41m-
\e[0m
167 \e[1;30m dog
\e[0m
\e[1;41m-
\e[1;41m-
\e[1;41m-
\e[0m
\e[1;30m·
\e[0m
\e[1;41m-
\e[1;41m-
\e[0m
168 \e[37melephant
\e[0m
\e[43m2
\e[0m
\e[43m3
\e[0m
\e[1;42m1
\e[0m
\e[1;42m1
\e[0m
\e[0m
\e[37m·
\e[0m
\e[1;41m-
\e[0m
169 \e[1;30m frog
\e[0m
\e[43m2
\e[0m
\e[43m3
\e[0m
\e[1;42m1
\e[0m
\e[43m2
\e[0m
\e[1;42m1
\e[0m
\e[0m
\e[1;30m·
\e[0m
\e[0m
171 'utf8 True, colour xterm-256color': '''
172 \e[4mdestination
\e[0m
173 \e[0m
\e[38;5;39m╭────── ant
\e[0m
174 \e[38;5;39m│
\e[0m
\e[38;5;45m╭───── bat
\e[0m
175 \e[38;5;39m│
\e[38;5;45m│
\e[0m
\e[38;5;39m╭──── cat
\e[0m
176 \e[38;5;39m│
\e[38;5;45m│
\e[38;5;39m│
\e[0m
\e[38;5;45m╭─── dog
\e[0m
177 \e[38;5;39m│
\e[38;5;45m│
\e[38;5;39m│
\e[38;5;45m│
\e[0m
\e[38;5;39m╭── elephant
\e[0m
178 \e[4msource
\e[0m
\e[38;5;39m│
\e[38;5;45m│
\e[38;5;39m│
\e[38;5;45m│
\e[38;5;39m│
\e[0m
\e[38;5;45m╭─ frog
\e[0m
179 \e[38;5;39m ant
\e[0m
\e[0m
\e[38;5;39m·
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;214m2
\e[0m
\e[38;5;214m2
\e[0m
\e[38;5;112m1
\e[0m
\e[48;5;124m-
\e[0m
180 \e[38;5;45m bat
\e[0m
\e[38;5;208m3
\e[0m
\e[0m
\e[38;5;45m·
\e[0m
\e[38;5;214m2
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;112m1
\e[0m
\e[48;5;124m-
\e[0m
181 \e[38;5;39m cat
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;214m2
\e[0m
\e[0m
\e[38;5;39m·
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;214m2
\e[0m
\e[48;5;124m-
\e[0m
182 \e[38;5;45m dog
\e[0m
\e[48;5;124m-
\e[48;5;124m-
\e[48;5;124m-
\e[0m
\e[38;5;45m·
\e[0m
\e[48;5;124m-
\e[48;5;124m-
\e[0m
183 \e[38;5;39melephant
\e[0m
\e[38;5;214m2
\e[0m
\e[38;5;208m3
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;112m1
\e[0m
\e[0m
\e[38;5;39m·
\e[0m
\e[48;5;124m-
\e[0m
184 \e[38;5;45m frog
\e[0m
\e[38;5;214m2
\e[0m
\e[38;5;208m3
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;214m2
\e[0m
\e[38;5;112m1
\e[0m
\e[0m
\e[38;5;45m·
\e[0m
\e[0m
186 'utf8 True, colour xterm-256color-heatmap': '''
187 \e[4mdestination
\e[0m
188 \e[0m
\e[38;5;171m╭────── ant
\e[0m
189 \e[38;5;171m│
\e[0m
\e[38;5;207m╭───── bat
\e[0m
190 \e[38;5;171m│
\e[38;5;207m│
\e[0m
\e[38;5;171m╭──── cat
\e[0m
191 \e[38;5;171m│
\e[38;5;207m│
\e[38;5;171m│
\e[0m
\e[38;5;207m╭─── dog
\e[0m
192 \e[38;5;171m│
\e[38;5;207m│
\e[38;5;171m│
\e[38;5;207m│
\e[0m
\e[38;5;171m╭── elephant
\e[0m
193 \e[4msource
\e[0m
\e[38;5;171m│
\e[38;5;207m│
\e[38;5;171m│
\e[38;5;207m│
\e[38;5;171m│
\e[0m
\e[38;5;207m╭─ frog
\e[0m
194 \e[38;5;171m ant
\e[0m
\e[0m
\e[38;5;171m·
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;124m-
\e[0m
195 \e[38;5;207m bat
\e[0m
\e[48;5;208m3
\e[0m
\e[0m
\e[38;5;207m·
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;124m-
\e[0m
196 \e[38;5;171m cat
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;214m2
\e[0m
\e[0m
\e[38;5;171m·
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;124m-
\e[0m
197 \e[38;5;207m dog
\e[0m
\e[48;5;124m-
\e[48;5;124m-
\e[48;5;124m-
\e[0m
\e[38;5;207m·
\e[0m
\e[48;5;124m-
\e[48;5;124m-
\e[0m
198 \e[38;5;171melephant
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;208m3
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;112m1
\e[0m
\e[0m
\e[38;5;171m·
\e[0m
\e[48;5;124m-
\e[0m
199 \e[38;5;207m frog
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;208m3
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;112m1
\e[0m
\e[0m
\e[38;5;207m·
\e[0m
\e[0m
201 'utf8 False, colour None': '''
216 'utf8 False, colour ansi': '''
217 \e[4mdestination
\e[0m
218 \e[0m
\e[37m,------ ant
\e[0m
219 \e[37m|
\e[0m
\e[1;30m,----- bat
\e[0m
220 \e[37m|
\e[1;30m|
\e[0m
\e[37m,---- cat
\e[0m
221 \e[37m|
\e[1;30m|
\e[37m|
\e[0m
\e[1;30m,--- dog
\e[0m
222 \e[37m|
\e[1;30m|
\e[37m|
\e[1;30m|
\e[0m
\e[37m,-- elephant
\e[0m
223 \e[4msource
\e[0m
\e[37m|
\e[1;30m|
\e[37m|
\e[1;30m|
\e[37m|
\e[0m
\e[1;30m,- frog
\e[0m
224 \e[37m ant
\e[0m
\e[0m
\e[37m0
\e[0m
\e[1;32m1
\e[0m
\e[33m2
\e[0m
\e[33m2
\e[0m
\e[1;32m1
\e[0m
\e[1;31m-
\e[0m
225 \e[1;30m bat
\e[0m
\e[33m3
\e[0m
\e[0m
\e[1;30m0
\e[0m
\e[33m2
\e[0m
\e[1;32m1
\e[0m
\e[1;32m1
\e[0m
\e[1;31m-
\e[0m
226 \e[37m cat
\e[0m
\e[1;32m1
\e[0m
\e[33m2
\e[0m
\e[0m
\e[37m0
\e[0m
\e[1;32m1
\e[0m
\e[33m2
\e[0m
\e[1;31m-
\e[0m
227 \e[1;30m dog
\e[0m
\e[1;31m-
\e[1;31m-
\e[1;31m-
\e[0m
\e[1;30m0
\e[0m
\e[1;31m-
\e[1;31m-
\e[0m
228 \e[37melephant
\e[0m
\e[33m2
\e[0m
\e[33m3
\e[0m
\e[1;32m1
\e[0m
\e[1;32m1
\e[0m
\e[0m
\e[37m0
\e[0m
\e[1;31m-
\e[0m
229 \e[1;30m frog
\e[0m
\e[33m2
\e[0m
\e[33m3
\e[0m
\e[1;32m1
\e[0m
\e[33m2
\e[0m
\e[1;32m1
\e[0m
\e[0m
\e[1;30m0
\e[0m
\e[0m
231 'utf8 False, colour ansi-heatmap': '''
232 \e[4mdestination
\e[0m
233 \e[0m
\e[37m,------ ant
\e[0m
234 \e[37m|
\e[0m
\e[1;30m,----- bat
\e[0m
235 \e[37m|
\e[1;30m|
\e[0m
\e[37m,---- cat
\e[0m
236 \e[37m|
\e[1;30m|
\e[37m|
\e[0m
\e[1;30m,--- dog
\e[0m
237 \e[37m|
\e[1;30m|
\e[37m|
\e[1;30m|
\e[0m
\e[37m,-- elephant
\e[0m
238 \e[4msource
\e[0m
\e[37m|
\e[1;30m|
\e[37m|
\e[1;30m|
\e[37m|
\e[0m
\e[1;30m,- frog
\e[0m
239 \e[37m ant
\e[0m
\e[0m
\e[37m0
\e[0m
\e[1;42m1
\e[0m
\e[43m2
\e[0m
\e[43m2
\e[0m
\e[1;42m1
\e[0m
\e[1;41m-
\e[0m
240 \e[1;30m bat
\e[0m
\e[43m3
\e[0m
\e[0m
\e[1;30m0
\e[0m
\e[43m2
\e[0m
\e[1;42m1
\e[0m
\e[1;42m1
\e[0m
\e[1;41m-
\e[0m
241 \e[37m cat
\e[0m
\e[1;42m1
\e[0m
\e[43m2
\e[0m
\e[0m
\e[37m0
\e[0m
\e[1;42m1
\e[0m
\e[43m2
\e[0m
\e[1;41m-
\e[0m
242 \e[1;30m dog
\e[0m
\e[1;41m-
\e[1;41m-
\e[1;41m-
\e[0m
\e[1;30m0
\e[0m
\e[1;41m-
\e[1;41m-
\e[0m
243 \e[37melephant
\e[0m
\e[43m2
\e[0m
\e[43m3
\e[0m
\e[1;42m1
\e[0m
\e[1;42m1
\e[0m
\e[0m
\e[37m0
\e[0m
\e[1;41m-
\e[0m
244 \e[1;30m frog
\e[0m
\e[43m2
\e[0m
\e[43m3
\e[0m
\e[1;42m1
\e[0m
\e[43m2
\e[0m
\e[1;42m1
\e[0m
\e[0m
\e[1;30m0
\e[0m
\e[0m
246 'utf8 False, colour xterm-256color': '''
247 \e[4mdestination
\e[0m
248 \e[0m
\e[38;5;39m,------ ant
\e[0m
249 \e[38;5;39m|
\e[0m
\e[38;5;45m,----- bat
\e[0m
250 \e[38;5;39m|
\e[38;5;45m|
\e[0m
\e[38;5;39m,---- cat
\e[0m
251 \e[38;5;39m|
\e[38;5;45m|
\e[38;5;39m|
\e[0m
\e[38;5;45m,--- dog
\e[0m
252 \e[38;5;39m|
\e[38;5;45m|
\e[38;5;39m|
\e[38;5;45m|
\e[0m
\e[38;5;39m,-- elephant
\e[0m
253 \e[4msource
\e[0m
\e[38;5;39m|
\e[38;5;45m|
\e[38;5;39m|
\e[38;5;45m|
\e[38;5;39m|
\e[0m
\e[38;5;45m,- frog
\e[0m
254 \e[38;5;39m ant
\e[0m
\e[0m
\e[38;5;39m0
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;214m2
\e[0m
\e[38;5;214m2
\e[0m
\e[38;5;112m1
\e[0m
\e[48;5;124m-
\e[0m
255 \e[38;5;45m bat
\e[0m
\e[38;5;208m3
\e[0m
\e[0m
\e[38;5;45m0
\e[0m
\e[38;5;214m2
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;112m1
\e[0m
\e[48;5;124m-
\e[0m
256 \e[38;5;39m cat
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;214m2
\e[0m
\e[0m
\e[38;5;39m0
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;214m2
\e[0m
\e[48;5;124m-
\e[0m
257 \e[38;5;45m dog
\e[0m
\e[48;5;124m-
\e[48;5;124m-
\e[48;5;124m-
\e[0m
\e[38;5;45m0
\e[0m
\e[48;5;124m-
\e[48;5;124m-
\e[0m
258 \e[38;5;39melephant
\e[0m
\e[38;5;214m2
\e[0m
\e[38;5;208m3
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;112m1
\e[0m
\e[0m
\e[38;5;39m0
\e[0m
\e[48;5;124m-
\e[0m
259 \e[38;5;45m frog
\e[0m
\e[38;5;214m2
\e[0m
\e[38;5;208m3
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;214m2
\e[0m
\e[38;5;112m1
\e[0m
\e[0m
\e[38;5;45m0
\e[0m
\e[0m
261 'utf8 False, colour xterm-256color-heatmap': '''
262 \e[4mdestination
\e[0m
263 \e[0m
\e[38;5;171m,------ ant
\e[0m
264 \e[38;5;171m|
\e[0m
\e[38;5;207m,----- bat
\e[0m
265 \e[38;5;171m|
\e[38;5;207m|
\e[0m
\e[38;5;171m,---- cat
\e[0m
266 \e[38;5;171m|
\e[38;5;207m|
\e[38;5;171m|
\e[0m
\e[38;5;207m,--- dog
\e[0m
267 \e[38;5;171m|
\e[38;5;207m|
\e[38;5;171m|
\e[38;5;207m|
\e[0m
\e[38;5;171m,-- elephant
\e[0m
268 \e[4msource
\e[0m
\e[38;5;171m|
\e[38;5;207m|
\e[38;5;171m|
\e[38;5;207m|
\e[38;5;171m|
\e[0m
\e[38;5;207m,- frog
\e[0m
269 \e[38;5;171m ant
\e[0m
\e[0m
\e[38;5;171m0
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;124m-
\e[0m
270 \e[38;5;207m bat
\e[0m
\e[48;5;208m3
\e[0m
\e[0m
\e[38;5;207m0
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;124m-
\e[0m
271 \e[38;5;171m cat
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;214m2
\e[0m
\e[0m
\e[38;5;171m0
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;124m-
\e[0m
272 \e[38;5;207m dog
\e[0m
\e[48;5;124m-
\e[48;5;124m-
\e[48;5;124m-
\e[0m
\e[38;5;207m0
\e[0m
\e[48;5;124m-
\e[48;5;124m-
\e[0m
273 \e[38;5;171melephant
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;208m3
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;112m1
\e[0m
\e[0m
\e[38;5;171m0
\e[0m
\e[48;5;124m-
\e[0m
274 \e[38;5;207m frog
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;208m3
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;112m1
\e[0m
\e[0m
\e[38;5;207m0
\e[0m
\e[0m
277 for utf8 in (True, False):
278 for colour in self.sorted_colour_sets:
279 k = 'utf8 %s, colour %s' % (utf8, colour)
280 s = graph.distance_matrix(None, edges, utf8=utf8,
282 self.assertStringsEqual(s, expected[k], strip=True,
283 msg='Wrong output: %s\n\n%s' % (k, s))
285 def test_simple_distance2(self):
286 edges = [('ant', 'bat'),
291 'utf8 True, colour None': '''
300 'utf8 True, colour ansi': '''
301 \e[4mdestination
\e[0m
302 \e[0m
\e[37m╭─── ant
\e[0m
303 \e[37m│
\e[0m
\e[1;30m╭── bat
\e[0m
304 \e[4msource
\e[0m
\e[37m│
\e[1;30m│
\e[0m
\e[37m╭─ cat
\e[0m
305 \e[37m ant
\e[0m
\e[0m
\e[37m·
\e[0m
\e[1;32m1
\e[0m
\e[1;32m1
\e[0m
\e[0m
306 \e[1;30m bat
\e[0m
\e[1;32m1
\e[0m
\e[0m
\e[1;30m·
\e[0m
\e[33m2
\e[0m
\e[0m
307 \e[37m cat
\e[0m
\e[33m2
\e[0m
\e[1;32m1
\e[0m
\e[0m
\e[37m·
\e[0m
\e[0m
309 'utf8 True, colour ansi-heatmap': '''
310 \e[4mdestination
\e[0m
311 \e[0m
\e[37m╭─── ant
\e[0m
312 \e[37m│
\e[0m
\e[1;30m╭── bat
\e[0m
313 \e[4msource
\e[0m
\e[37m│
\e[1;30m│
\e[0m
\e[37m╭─ cat
\e[0m
314 \e[37m ant
\e[0m
\e[0m
\e[37m·
\e[0m
\e[1;42m1
\e[0m
\e[1;42m1
\e[0m
\e[0m
315 \e[1;30m bat
\e[0m
\e[1;42m1
\e[0m
\e[0m
\e[1;30m·
\e[0m
\e[43m2
\e[0m
\e[0m
316 \e[37m cat
\e[0m
\e[43m2
\e[0m
\e[1;42m1
\e[0m
\e[0m
\e[37m·
\e[0m
\e[0m
318 'utf8 True, colour xterm-256color': '''
319 \e[4mdestination
\e[0m
320 \e[0m
\e[38;5;39m╭─── ant
\e[0m
321 \e[38;5;39m│
\e[0m
\e[38;5;45m╭── bat
\e[0m
322 \e[4msource
\e[0m
\e[38;5;39m│
\e[38;5;45m│
\e[0m
\e[38;5;39m╭─ cat
\e[0m
323 \e[38;5;39m ant
\e[0m
\e[0m
\e[38;5;39m·
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;112m1
\e[0m
\e[0m
324 \e[38;5;45m bat
\e[0m
\e[38;5;112m1
\e[0m
\e[0m
\e[38;5;45m·
\e[0m
\e[38;5;208m2
\e[0m
\e[0m
325 \e[38;5;39m cat
\e[0m
\e[38;5;208m2
\e[0m
\e[38;5;112m1
\e[0m
\e[0m
\e[38;5;39m·
\e[0m
\e[0m
327 'utf8 True, colour xterm-256color-heatmap': '''
328 \e[4mdestination
\e[0m
329 \e[0m
\e[38;5;171m╭─── ant
\e[0m
330 \e[38;5;171m│
\e[0m
\e[38;5;207m╭── bat
\e[0m
331 \e[4msource
\e[0m
\e[38;5;171m│
\e[38;5;207m│
\e[0m
\e[38;5;171m╭─ cat
\e[0m
332 \e[38;5;171m ant
\e[0m
\e[0m
\e[38;5;171m·
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;112m1
\e[0m
\e[0m
333 \e[38;5;207m bat
\e[0m
\e[48;5;112m1
\e[0m
\e[0m
\e[38;5;207m·
\e[0m
\e[48;5;208m2
\e[0m
\e[0m
334 \e[38;5;171m cat
\e[0m
\e[48;5;208m2
\e[0m
\e[48;5;112m1
\e[0m
\e[0m
\e[38;5;171m·
\e[0m
\e[0m
336 'utf8 False, colour None': '''
345 'utf8 False, colour ansi': '''
346 \e[4mdestination
\e[0m
347 \e[0m
\e[37m,--- ant
\e[0m
348 \e[37m|
\e[0m
\e[1;30m,-- bat
\e[0m
349 \e[4msource
\e[0m
\e[37m|
\e[1;30m|
\e[0m
\e[37m,- cat
\e[0m
350 \e[37m ant
\e[0m
\e[0m
\e[37m0
\e[0m
\e[1;32m1
\e[0m
\e[1;32m1
\e[0m
\e[0m
351 \e[1;30m bat
\e[0m
\e[1;32m1
\e[0m
\e[0m
\e[1;30m0
\e[0m
\e[33m2
\e[0m
\e[0m
352 \e[37m cat
\e[0m
\e[33m2
\e[0m
\e[1;32m1
\e[0m
\e[0m
\e[37m0
\e[0m
\e[0m
354 'utf8 False, colour ansi-heatmap': '''
355 \e[4mdestination
\e[0m
356 \e[0m
\e[37m,--- ant
\e[0m
357 \e[37m|
\e[0m
\e[1;30m,-- bat
\e[0m
358 \e[4msource
\e[0m
\e[37m|
\e[1;30m|
\e[0m
\e[37m,- cat
\e[0m
359 \e[37m ant
\e[0m
\e[0m
\e[37m0
\e[0m
\e[1;42m1
\e[0m
\e[1;42m1
\e[0m
\e[0m
360 \e[1;30m bat
\e[0m
\e[1;42m1
\e[0m
\e[0m
\e[1;30m0
\e[0m
\e[43m2
\e[0m
\e[0m
361 \e[37m cat
\e[0m
\e[43m2
\e[0m
\e[1;42m1
\e[0m
\e[0m
\e[37m0
\e[0m
\e[0m
363 'utf8 False, colour xterm-256color': '''
364 \e[4mdestination
\e[0m
365 \e[0m
\e[38;5;39m,--- ant
\e[0m
366 \e[38;5;39m|
\e[0m
\e[38;5;45m,-- bat
\e[0m
367 \e[4msource
\e[0m
\e[38;5;39m|
\e[38;5;45m|
\e[0m
\e[38;5;39m,- cat
\e[0m
368 \e[38;5;39m ant
\e[0m
\e[0m
\e[38;5;39m0
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;112m1
\e[0m
\e[0m
369 \e[38;5;45m bat
\e[0m
\e[38;5;112m1
\e[0m
\e[0m
\e[38;5;45m0
\e[0m
\e[38;5;208m2
\e[0m
\e[0m
370 \e[38;5;39m cat
\e[0m
\e[38;5;208m2
\e[0m
\e[38;5;112m1
\e[0m
\e[0m
\e[38;5;39m0
\e[0m
\e[0m
372 'utf8 False, colour xterm-256color-heatmap': '''
373 \e[4mdestination
\e[0m
374 \e[0m
\e[38;5;171m,--- ant
\e[0m
375 \e[38;5;171m|
\e[0m
\e[38;5;207m,-- bat
\e[0m
376 \e[4msource
\e[0m
\e[38;5;171m|
\e[38;5;207m|
\e[0m
\e[38;5;171m,- cat
\e[0m
377 \e[38;5;171m ant
\e[0m
\e[0m
\e[38;5;171m0
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;112m1
\e[0m
\e[0m
378 \e[38;5;207m bat
\e[0m
\e[48;5;112m1
\e[0m
\e[0m
\e[38;5;207m0
\e[0m
\e[48;5;208m2
\e[0m
\e[0m
379 \e[38;5;171m cat
\e[0m
\e[48;5;208m2
\e[0m
\e[48;5;112m1
\e[0m
\e[0m
\e[38;5;171m0
\e[0m
\e[0m
382 for utf8 in (True, False):
383 for colour in self.sorted_colour_sets:
384 k = 'utf8 %s, colour %s' % (utf8, colour)
385 s = graph.distance_matrix(None, edges, utf8=utf8,
387 self.assertStringsEqual(s, expected[k], strip=True,
388 msg='Wrong output: %s\n\n%s' % (k, s))
390 def test_simple_distance3(self):
391 edges = [('ant', 'bat'),
397 'utf8 True, colour None': '''
410 'utf8 True, colour ansi': '''
411 \e[4mdestination
\e[0m
412 \e[0m
\e[37m╭───── ant
\e[0m
413 \e[37m│
\e[0m
\e[1;30m╭──── bat
\e[0m
414 \e[37m│
\e[1;30m│
\e[0m
\e[37m╭─── cat
\e[0m
415 \e[37m│
\e[1;30m│
\e[37m│
\e[0m
\e[1;30m╭── dog
\e[0m
416 \e[4msource
\e[0m
\e[37m│
\e[1;30m│
\e[37m│
\e[1;30m│
\e[0m
\e[37m╭─ eel
\e[0m
417 \e[37m ant
\e[0m
\e[0m
\e[37m·
\e[0m
\e[1;32m1
\e[0m
\e[33m2
\e[0m
\e[33m3
\e[0m
\e[33m4
\e[0m
\e[0m
418 \e[1;30m bat
\e[0m
\e[33m3
\e[0m
\e[0m
\e[1;30m·
\e[0m
\e[1;32m1
\e[0m
\e[33m2
\e[0m
\e[33m3
\e[0m
\e[0m
419 \e[37m cat
\e[0m
\e[33m2
\e[0m
\e[33m3
\e[0m
\e[0m
\e[37m·
\e[0m
\e[1;32m1
\e[0m
\e[33m2
\e[0m
\e[0m
420 \e[1;30m dog
\e[0m
\e[1;32m1
\e[0m
\e[33m2
\e[0m
\e[33m3
\e[0m
\e[0m
\e[1;30m·
\e[0m
\e[1;32m1
\e[0m
\e[0m
421 \e[37m eel
\e[0m
\e[1;31m-
\e[1;31m-
\e[1;31m-
\e[1;31m-
\e[0m
\e[37m·
\e[0m
\e[0m
423 'utf8 True, colour ansi-heatmap': '''
424 \e[4mdestination
\e[0m
425 \e[0m
\e[37m╭───── ant
\e[0m
426 \e[37m│
\e[0m
\e[1;30m╭──── bat
\e[0m
427 \e[37m│
\e[1;30m│
\e[0m
\e[37m╭─── cat
\e[0m
428 \e[37m│
\e[1;30m│
\e[37m│
\e[0m
\e[1;30m╭── dog
\e[0m
429 \e[4msource
\e[0m
\e[37m│
\e[1;30m│
\e[37m│
\e[1;30m│
\e[0m
\e[37m╭─ eel
\e[0m
430 \e[37m ant
\e[0m
\e[0m
\e[37m·
\e[0m
\e[1;42m1
\e[0m
\e[43m2
\e[0m
\e[43m3
\e[0m
\e[43m4
\e[0m
\e[0m
431 \e[1;30m bat
\e[0m
\e[43m3
\e[0m
\e[0m
\e[1;30m·
\e[0m
\e[1;42m1
\e[0m
\e[43m2
\e[0m
\e[43m3
\e[0m
\e[0m
432 \e[37m cat
\e[0m
\e[43m2
\e[0m
\e[43m3
\e[0m
\e[0m
\e[37m·
\e[0m
\e[1;42m1
\e[0m
\e[43m2
\e[0m
\e[0m
433 \e[1;30m dog
\e[0m
\e[1;42m1
\e[0m
\e[43m2
\e[0m
\e[43m3
\e[0m
\e[0m
\e[1;30m·
\e[0m
\e[1;42m1
\e[0m
\e[0m
434 \e[37m eel
\e[0m
\e[1;41m-
\e[1;41m-
\e[1;41m-
\e[1;41m-
\e[0m
\e[37m·
\e[0m
\e[0m
436 'utf8 True, colour xterm-256color': '''
437 \e[4mdestination
\e[0m
438 \e[0m
\e[38;5;39m╭───── ant
\e[0m
439 \e[38;5;39m│
\e[0m
\e[38;5;45m╭──── bat
\e[0m
440 \e[38;5;39m│
\e[38;5;45m│
\e[0m
\e[38;5;39m╭─── cat
\e[0m
441 \e[38;5;39m│
\e[38;5;45m│
\e[38;5;39m│
\e[0m
\e[38;5;45m╭── dog
\e[0m
442 \e[4msource
\e[0m
\e[38;5;39m│
\e[38;5;45m│
\e[38;5;39m│
\e[38;5;45m│
\e[0m
\e[38;5;39m╭─ eel
\e[0m
443 \e[38;5;39m ant
\e[0m
\e[0m
\e[38;5;39m·
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;214m2
\e[0m
\e[38;5;208m3
\e[0m
\e[38;5;208m4
\e[0m
\e[0m
444 \e[38;5;45m bat
\e[0m
\e[38;5;208m3
\e[0m
\e[0m
\e[38;5;45m·
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;214m2
\e[0m
\e[38;5;208m3
\e[0m
\e[0m
445 \e[38;5;39m cat
\e[0m
\e[38;5;214m2
\e[0m
\e[38;5;208m3
\e[0m
\e[0m
\e[38;5;39m·
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;214m2
\e[0m
\e[0m
446 \e[38;5;45m dog
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;214m2
\e[0m
\e[38;5;208m3
\e[0m
\e[0m
\e[38;5;45m·
\e[0m
\e[38;5;112m1
\e[0m
\e[0m
447 \e[38;5;39m eel
\e[0m
\e[48;5;124m-
\e[48;5;124m-
\e[48;5;124m-
\e[48;5;124m-
\e[0m
\e[38;5;39m·
\e[0m
\e[0m
449 'utf8 True, colour xterm-256color-heatmap': '''
450 \e[4mdestination
\e[0m
451 \e[0m
\e[38;5;171m╭───── ant
\e[0m
452 \e[38;5;171m│
\e[0m
\e[38;5;207m╭──── bat
\e[0m
453 \e[38;5;171m│
\e[38;5;207m│
\e[0m
\e[38;5;171m╭─── cat
\e[0m
454 \e[38;5;171m│
\e[38;5;207m│
\e[38;5;171m│
\e[0m
\e[38;5;207m╭── dog
\e[0m
455 \e[4msource
\e[0m
\e[38;5;171m│
\e[38;5;207m│
\e[38;5;171m│
\e[38;5;207m│
\e[0m
\e[38;5;171m╭─ eel
\e[0m
456 \e[38;5;171m ant
\e[0m
\e[0m
\e[38;5;171m·
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;208m3
\e[0m
\e[48;5;208m4
\e[0m
\e[0m
457 \e[38;5;207m bat
\e[0m
\e[48;5;208m3
\e[0m
\e[0m
\e[38;5;207m·
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;208m3
\e[0m
\e[0m
458 \e[38;5;171m cat
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;208m3
\e[0m
\e[0m
\e[38;5;171m·
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;214m2
\e[0m
\e[0m
459 \e[38;5;207m dog
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;208m3
\e[0m
\e[0m
\e[38;5;207m·
\e[0m
\e[48;5;112m1
\e[0m
\e[0m
460 \e[38;5;171m eel
\e[0m
\e[48;5;124m-
\e[48;5;124m-
\e[48;5;124m-
\e[48;5;124m-
\e[0m
\e[38;5;171m·
\e[0m
\e[0m
462 'utf8 False, colour None': '''
475 'utf8 False, colour ansi': '''
476 \e[4mdestination
\e[0m
477 \e[0m
\e[37m,----- ant
\e[0m
478 \e[37m|
\e[0m
\e[1;30m,---- bat
\e[0m
479 \e[37m|
\e[1;30m|
\e[0m
\e[37m,--- cat
\e[0m
480 \e[37m|
\e[1;30m|
\e[37m|
\e[0m
\e[1;30m,-- dog
\e[0m
481 \e[4msource
\e[0m
\e[37m|
\e[1;30m|
\e[37m|
\e[1;30m|
\e[0m
\e[37m,- eel
\e[0m
482 \e[37m ant
\e[0m
\e[0m
\e[37m0
\e[0m
\e[1;32m1
\e[0m
\e[33m2
\e[0m
\e[33m3
\e[0m
\e[33m4
\e[0m
\e[0m
483 \e[1;30m bat
\e[0m
\e[33m3
\e[0m
\e[0m
\e[1;30m0
\e[0m
\e[1;32m1
\e[0m
\e[33m2
\e[0m
\e[33m3
\e[0m
\e[0m
484 \e[37m cat
\e[0m
\e[33m2
\e[0m
\e[33m3
\e[0m
\e[0m
\e[37m0
\e[0m
\e[1;32m1
\e[0m
\e[33m2
\e[0m
\e[0m
485 \e[1;30m dog
\e[0m
\e[1;32m1
\e[0m
\e[33m2
\e[0m
\e[33m3
\e[0m
\e[0m
\e[1;30m0
\e[0m
\e[1;32m1
\e[0m
\e[0m
486 \e[37m eel
\e[0m
\e[1;31m-
\e[1;31m-
\e[1;31m-
\e[1;31m-
\e[0m
\e[37m0
\e[0m
\e[0m
488 'utf8 False, colour ansi-heatmap': '''
489 \e[4mdestination
\e[0m
490 \e[0m
\e[37m,----- ant
\e[0m
491 \e[37m|
\e[0m
\e[1;30m,---- bat
\e[0m
492 \e[37m|
\e[1;30m|
\e[0m
\e[37m,--- cat
\e[0m
493 \e[37m|
\e[1;30m|
\e[37m|
\e[0m
\e[1;30m,-- dog
\e[0m
494 \e[4msource
\e[0m
\e[37m|
\e[1;30m|
\e[37m|
\e[1;30m|
\e[0m
\e[37m,- eel
\e[0m
495 \e[37m ant
\e[0m
\e[0m
\e[37m0
\e[0m
\e[1;42m1
\e[0m
\e[43m2
\e[0m
\e[43m3
\e[0m
\e[43m4
\e[0m
\e[0m
496 \e[1;30m bat
\e[0m
\e[43m3
\e[0m
\e[0m
\e[1;30m0
\e[0m
\e[1;42m1
\e[0m
\e[43m2
\e[0m
\e[43m3
\e[0m
\e[0m
497 \e[37m cat
\e[0m
\e[43m2
\e[0m
\e[43m3
\e[0m
\e[0m
\e[37m0
\e[0m
\e[1;42m1
\e[0m
\e[43m2
\e[0m
\e[0m
498 \e[1;30m dog
\e[0m
\e[1;42m1
\e[0m
\e[43m2
\e[0m
\e[43m3
\e[0m
\e[0m
\e[1;30m0
\e[0m
\e[1;42m1
\e[0m
\e[0m
499 \e[37m eel
\e[0m
\e[1;41m-
\e[1;41m-
\e[1;41m-
\e[1;41m-
\e[0m
\e[37m0
\e[0m
\e[0m
501 'utf8 False, colour xterm-256color':
502 '''
\e[4mdestination
\e[0m
503 \e[0m
\e[38;5;39m,----- ant
\e[0m
504 \e[38;5;39m|
\e[0m
\e[38;5;45m,---- bat
\e[0m
505 \e[38;5;39m|
\e[38;5;45m|
\e[0m
\e[38;5;39m,--- cat
\e[0m
506 \e[38;5;39m|
\e[38;5;45m|
\e[38;5;39m|
\e[0m
\e[38;5;45m,-- dog
\e[0m
507 \e[4msource
\e[0m
\e[38;5;39m|
\e[38;5;45m|
\e[38;5;39m|
\e[38;5;45m|
\e[0m
\e[38;5;39m,- eel
\e[0m
508 \e[38;5;39m ant
\e[0m
\e[0m
\e[38;5;39m0
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;214m2
\e[0m
\e[38;5;208m3
\e[0m
\e[38;5;208m4
\e[0m
\e[0m
509 \e[38;5;45m bat
\e[0m
\e[38;5;208m3
\e[0m
\e[0m
\e[38;5;45m0
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;214m2
\e[0m
\e[38;5;208m3
\e[0m
\e[0m
510 \e[38;5;39m cat
\e[0m
\e[38;5;214m2
\e[0m
\e[38;5;208m3
\e[0m
\e[0m
\e[38;5;39m0
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;214m2
\e[0m
\e[0m
511 \e[38;5;45m dog
\e[0m
\e[38;5;112m1
\e[0m
\e[38;5;214m2
\e[0m
\e[38;5;208m3
\e[0m
\e[0m
\e[38;5;45m0
\e[0m
\e[38;5;112m1
\e[0m
\e[0m
512 \e[38;5;39m eel
\e[0m
\e[48;5;124m-
\e[48;5;124m-
\e[48;5;124m-
\e[48;5;124m-
\e[0m
\e[38;5;39m0
\e[0m
\e[0m
514 'utf8 False, colour xterm-256color-heatmap': '''
515 \e[4mdestination
\e[0m
516 \e[0m
\e[38;5;171m,----- ant
\e[0m
517 \e[38;5;171m|
\e[0m
\e[38;5;207m,---- bat
\e[0m
518 \e[38;5;171m|
\e[38;5;207m|
\e[0m
\e[38;5;171m,--- cat
\e[0m
519 \e[38;5;171m|
\e[38;5;207m|
\e[38;5;171m|
\e[0m
\e[38;5;207m,-- dog
\e[0m
520 \e[4msource
\e[0m
\e[38;5;171m|
\e[38;5;207m|
\e[38;5;171m|
\e[38;5;207m|
\e[0m
\e[38;5;171m,- eel
\e[0m
521 \e[38;5;171m ant
\e[0m
\e[0m
\e[38;5;171m0
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;208m3
\e[0m
\e[48;5;208m4
\e[0m
\e[0m
522 \e[38;5;207m bat
\e[0m
\e[48;5;208m3
\e[0m
\e[0m
\e[38;5;207m0
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;208m3
\e[0m
\e[0m
523 \e[38;5;171m cat
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;208m3
\e[0m
\e[0m
\e[38;5;171m0
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;214m2
\e[0m
\e[0m
524 \e[38;5;207m dog
\e[0m
\e[48;5;112m1
\e[0m
\e[48;5;214m2
\e[0m
\e[48;5;208m3
\e[0m
\e[0m
\e[38;5;207m0
\e[0m
\e[48;5;112m1
\e[0m
\e[0m
525 \e[38;5;171m eel
\e[0m
\e[48;5;124m-
\e[48;5;124m-
\e[48;5;124m-
\e[48;5;124m-
\e[0m
\e[38;5;171m0
\e[0m
\e[0m
528 for utf8 in (True, False):
529 for colour in self.sorted_colour_sets:
530 k = 'utf8 %s, colour %s' % (utf8, colour)
531 s = graph.distance_matrix(None, edges, utf8=utf8,
533 self.assertStringsEqual(s, expected[k], strip=True,
534 msg='Wrong output: %s\n\n%s' % (k, s))