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
))