python/tests/graph: actually test graphs, don't print
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>
Thu, 12 Apr 2018 03:57:09 +0000 (15:57 +1200)
committerDouglas Bagnall <dbagnall@samba.org>
Fri, 13 Apr 2018 05:27:13 +0000 (07:27 +0200)
Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
python/samba/tests/graph.py

index 2193d4222400233805bd12d91b44d51a684fd49d..7ea53caa7343a9fe24b9d93913af28b2fc85f5de 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 # Test graph dot file generation
 #
 # Copyright (C) Andrew Bartlett 2018.
@@ -93,7 +94,6 @@ class DotFileTests(samba.tests.TestCaseInTempDir):
                 g = graph.dot_graph(vertices, edges,
                                     directed=directed,
                                     title=title)
-                print(g)
                 lines = g.split('\n')
                 self.assertHeader(lines, title, directed)
                 self.assertVertices(lines[7:], vertices)
@@ -123,27 +123,269 @@ class DistanceTests(samba.tests.TestCase):
                  ('cat', 'ant'),
                  ('cat', 'dog')]
 
+        expected = {
+                "utf8 True, colour None": '''
+                 destination
+         ╭────── ant
+         │╭───── bat
+         ││╭──── cat
+         │││╭─── dog
+         ││││╭── elephant
+  source │││││╭─ frog
+     ant ·1221-
+     bat 3·211-
+     cat 12·12-
+     dog ---·--
+elephant 2311·-
+    frog 23121·''',
+                'utf8 True, colour ansi': '''
+                 \e[4mdestination\e[0m
+         \e[0m\e[37m╭────── ant\e[0m
+         \e[37m│\e[0m\e[1;30m╭───── bat\e[0m
+         \e[37m│\e[1;30m│\e[0m\e[37m╭──── cat\e[0m
+         \e[37m│\e[1;30m│\e[37m│\e[0m\e[1;30m╭─── dog\e[0m
+         \e[37m│\e[1;30m│\e[37m│\e[1;30m│\e[0m\e[37m╭── elephant\e[0m
+  \e[4msource\e[0m \e[37m│\e[1;30m│\e[37m│\e[1;30m│\e[37m│\e[0m\e[1;30m╭─ frog\e[0m
+\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
+\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
+\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
+\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
+\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
+\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
+                ''',
+                'utf8 True, colour ansi-heatmap': '''
+                 \e[4mdestination\e[0m
+         \e[0m\e[37m╭────── ant\e[0m
+         \e[37m│\e[0m\e[1;30m╭───── bat\e[0m
+         \e[37m│\e[1;30m│\e[0m\e[37m╭──── cat\e[0m
+         \e[37m│\e[1;30m│\e[37m│\e[0m\e[1;30m╭─── dog\e[0m
+         \e[37m│\e[1;30m│\e[37m│\e[1;30m│\e[0m\e[37m╭── elephant\e[0m
+  \e[4msource\e[0m \e[37m│\e[1;30m│\e[37m│\e[1;30m│\e[37m│\e[0m\e[1;30m╭─ frog\e[0m
+\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
+\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
+\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
+\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
+\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
+\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
+                ''',
+                'utf8 True, colour xterm-256color': '''
+                 \e[4mdestination\e[0m
+         \e[0m\e[38;5;39m╭────── ant\e[0m
+         \e[38;5;39m│\e[0m\e[38;5;45m╭───── bat\e[0m
+         \e[38;5;39m│\e[38;5;45m│\e[0m\e[38;5;39m╭──── cat\e[0m
+         \e[38;5;39m│\e[38;5;45m│\e[38;5;39m│\e[0m\e[38;5;45m╭─── dog\e[0m
+         \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
+  \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
+\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
+\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
+\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
+\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
+\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
+\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
+                ''',
+'utf8 True, colour xterm-256color-heatmap': '''
+                 \e[4mdestination\e[0m
+         \e[0m\e[38;5;171m╭────── ant\e[0m
+         \e[38;5;171m│\e[0m\e[38;5;207m╭───── bat\e[0m
+         \e[38;5;171m│\e[38;5;207m│\e[0m\e[38;5;171m╭──── cat\e[0m
+         \e[38;5;171m│\e[38;5;207m│\e[38;5;171m│\e[0m\e[38;5;207m╭─── dog\e[0m
+         \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
+  \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
+\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
+\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
+\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
+\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
+\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
+\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
+''',
+'utf8 False, colour None': '''
+                 destination
+         ,------ ant
+         |,----- bat
+         ||,---- cat
+         |||,--- dog
+         ||||,-- elephant
+  source |||||,- frog
+     ant 01221-
+     bat 30211-
+     cat 12012-
+     dog ---0--
+elephant 23110-
+    frog 231210
+''',
+'utf8 False, colour ansi': '''
+                 \e[4mdestination\e[0m
+         \e[0m\e[37m,------ ant\e[0m
+         \e[37m|\e[0m\e[1;30m,----- bat\e[0m
+         \e[37m|\e[1;30m|\e[0m\e[37m,---- cat\e[0m
+         \e[37m|\e[1;30m|\e[37m|\e[0m\e[1;30m,--- dog\e[0m
+         \e[37m|\e[1;30m|\e[37m|\e[1;30m|\e[0m\e[37m,-- elephant\e[0m
+  \e[4msource\e[0m \e[37m|\e[1;30m|\e[37m|\e[1;30m|\e[37m|\e[0m\e[1;30m,- frog\e[0m
+\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
+\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
+\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
+\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
+\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
+\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
+''',
+'utf8 False, colour ansi-heatmap': '''
+                 \e[4mdestination\e[0m
+         \e[0m\e[37m,------ ant\e[0m
+         \e[37m|\e[0m\e[1;30m,----- bat\e[0m
+         \e[37m|\e[1;30m|\e[0m\e[37m,---- cat\e[0m
+         \e[37m|\e[1;30m|\e[37m|\e[0m\e[1;30m,--- dog\e[0m
+         \e[37m|\e[1;30m|\e[37m|\e[1;30m|\e[0m\e[37m,-- elephant\e[0m
+  \e[4msource\e[0m \e[37m|\e[1;30m|\e[37m|\e[1;30m|\e[37m|\e[0m\e[1;30m,- frog\e[0m
+\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
+\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
+\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
+\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
+\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
+\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
+''',
+'utf8 False, colour xterm-256color': '''
+                 \e[4mdestination\e[0m
+         \e[0m\e[38;5;39m,------ ant\e[0m
+         \e[38;5;39m|\e[0m\e[38;5;45m,----- bat\e[0m
+         \e[38;5;39m|\e[38;5;45m|\e[0m\e[38;5;39m,---- cat\e[0m
+         \e[38;5;39m|\e[38;5;45m|\e[38;5;39m|\e[0m\e[38;5;45m,--- dog\e[0m
+         \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
+  \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
+\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
+\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
+\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
+\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
+\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
+\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
+''',
+'utf8 False, colour xterm-256color-heatmap': '''
+                 \e[4mdestination\e[0m
+         \e[0m\e[38;5;171m,------ ant\e[0m
+         \e[38;5;171m|\e[0m\e[38;5;207m,----- bat\e[0m
+         \e[38;5;171m|\e[38;5;207m|\e[0m\e[38;5;171m,---- cat\e[0m
+         \e[38;5;171m|\e[38;5;207m|\e[38;5;171m|\e[0m\e[38;5;207m,--- dog\e[0m
+         \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
+  \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
+\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
+\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
+\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
+\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
+\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
+\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
+'''
+        }
         for utf8 in (True, False):
             for colour in self.sorted_colour_sets:
-                print('utf8 %s, colour %s' % (utf8, colour))
+                k = 'utf8 %s, colour %s' % (utf8, colour)
                 s = graph.distance_matrix(None, edges, utf8=utf8,
                                           colour=colour)
-                print(s)
-                print()
+                self.assertStringsEqual(s, expected[k], strip=True,
+                                        msg='Wrong output: %s\n\n%s' % (k, s))
 
     def test_simple_distance2(self):
         edges = [('ant', 'bat'),
                  ('cat', 'bat'),
                  ('bat', 'ant'),
                  ('ant', 'cat')]
-
+        expected = {
+            'utf8 True, colour None': '''
+            destination
+       ╭─── ant
+       │╭── bat
+source ││╭─ cat
+   ant ·11
+   bat 1·2
+   cat 21·
+            ''',
+            'utf8 True, colour ansi': '''
+            \e[4mdestination\e[0m
+       \e[0m\e[37m╭─── ant\e[0m
+       \e[37m│\e[0m\e[1;30m╭── bat\e[0m
+\e[4msource\e[0m \e[37m│\e[1;30m│\e[0m\e[37m╭─ cat\e[0m
+\e[37m   ant\e[0m \e[0m\e[37m·\e[0m\e[1;32m1\e[0m\e[1;32m1\e[0m\e[0m
+\e[1;30m   bat\e[0m \e[1;32m1\e[0m\e[0m\e[1;30m·\e[0m\e[33m2\e[0m\e[0m
+\e[37m   cat\e[0m \e[33m2\e[0m\e[1;32m1\e[0m\e[0m\e[37m·\e[0m\e[0m
+            ''',
+'utf8 True, colour ansi-heatmap': '''
+            \e[4mdestination\e[0m
+       \e[0m\e[37m╭─── ant\e[0m
+       \e[37m│\e[0m\e[1;30m╭── bat\e[0m
+\e[4msource\e[0m \e[37m│\e[1;30m│\e[0m\e[37m╭─ cat\e[0m
+\e[37m   ant\e[0m \e[0m\e[37m·\e[0m\e[1;42m1\e[0m\e[1;42m1\e[0m\e[0m
+\e[1;30m   bat\e[0m \e[1;42m1\e[0m\e[0m\e[1;30m·\e[0m\e[43m2\e[0m\e[0m
+\e[37m   cat\e[0m \e[43m2\e[0m\e[1;42m1\e[0m\e[0m\e[37m·\e[0m\e[0m
+        ''',
+'utf8 True, colour xterm-256color': '''
+            \e[4mdestination\e[0m
+       \e[0m\e[38;5;39m╭─── ant\e[0m
+       \e[38;5;39m│\e[0m\e[38;5;45m╭── bat\e[0m
+\e[4msource\e[0m \e[38;5;39m│\e[38;5;45m│\e[0m\e[38;5;39m╭─ cat\e[0m
+\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
+\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
+\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
+''',
+'utf8 True, colour xterm-256color-heatmap': '''
+            \e[4mdestination\e[0m
+       \e[0m\e[38;5;171m╭─── ant\e[0m
+       \e[38;5;171m│\e[0m\e[38;5;207m╭── bat\e[0m
+\e[4msource\e[0m \e[38;5;171m│\e[38;5;207m│\e[0m\e[38;5;171m╭─ cat\e[0m
+\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
+\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
+\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
+''',
+'utf8 False, colour None': '''
+            destination
+       ,--- ant
+       |,-- bat
+source ||,- cat
+   ant 011
+   bat 102
+   cat 210
+''',
+'utf8 False, colour ansi': '''
+            \e[4mdestination\e[0m
+       \e[0m\e[37m,--- ant\e[0m
+       \e[37m|\e[0m\e[1;30m,-- bat\e[0m
+\e[4msource\e[0m \e[37m|\e[1;30m|\e[0m\e[37m,- cat\e[0m
+\e[37m   ant\e[0m \e[0m\e[37m0\e[0m\e[1;32m1\e[0m\e[1;32m1\e[0m\e[0m
+\e[1;30m   bat\e[0m \e[1;32m1\e[0m\e[0m\e[1;30m0\e[0m\e[33m2\e[0m\e[0m
+\e[37m   cat\e[0m \e[33m2\e[0m\e[1;32m1\e[0m\e[0m\e[37m0\e[0m\e[0m
+''',
+'utf8 False, colour ansi-heatmap': '''
+            \e[4mdestination\e[0m
+       \e[0m\e[37m,--- ant\e[0m
+       \e[37m|\e[0m\e[1;30m,-- bat\e[0m
+\e[4msource\e[0m \e[37m|\e[1;30m|\e[0m\e[37m,- cat\e[0m
+\e[37m   ant\e[0m \e[0m\e[37m0\e[0m\e[1;42m1\e[0m\e[1;42m1\e[0m\e[0m
+\e[1;30m   bat\e[0m \e[1;42m1\e[0m\e[0m\e[1;30m0\e[0m\e[43m2\e[0m\e[0m
+\e[37m   cat\e[0m \e[43m2\e[0m\e[1;42m1\e[0m\e[0m\e[37m0\e[0m\e[0m
+''',
+'utf8 False, colour xterm-256color': '''
+            \e[4mdestination\e[0m
+       \e[0m\e[38;5;39m,--- ant\e[0m
+       \e[38;5;39m|\e[0m\e[38;5;45m,-- bat\e[0m
+\e[4msource\e[0m \e[38;5;39m|\e[38;5;45m|\e[0m\e[38;5;39m,- cat\e[0m
+\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
+\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
+\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
+''',
+'utf8 False, colour xterm-256color-heatmap': '''
+            \e[4mdestination\e[0m
+       \e[0m\e[38;5;171m,--- ant\e[0m
+       \e[38;5;171m|\e[0m\e[38;5;207m,-- bat\e[0m
+\e[4msource\e[0m \e[38;5;171m|\e[38;5;207m|\e[0m\e[38;5;171m,- cat\e[0m
+\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
+\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
+\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
+'''
+        }
         for utf8 in (True, False):
             for colour in self.sorted_colour_sets:
-                print('utf8 %s, colour %s' % (utf8, colour))
+                k = 'utf8 %s, colour %s' % (utf8, colour)
                 s = graph.distance_matrix(None, edges, utf8=utf8,
                                           colour=colour)
-                print(s)
-                print()
+                self.assertStringsEqual(s, expected[k], strip=True,
+                                        msg='Wrong output: %s\n\n%s' % (k, s))
 
     def test_simple_distance3(self):
         edges = [('ant', 'bat'),
@@ -151,11 +393,142 @@ class DistanceTests(samba.tests.TestCase):
                  ('cat', 'dog'),
                  ('dog', 'ant'),
                  ('dog', 'eel')]
-
+        expected = {
+'utf8 True, colour None': '''
+              destination
+       ╭───── ant
+       │╭──── bat
+       ││╭─── cat
+       │││╭── dog
+source ││││╭─ eel
+   ant ·1234
+   bat 3·123
+   cat 23·12
+   dog 123·1
+   eel ----·
+''',
+'utf8 True, colour ansi': '''
+              \e[4mdestination\e[0m
+       \e[0m\e[37m╭───── ant\e[0m
+       \e[37m│\e[0m\e[1;30m╭──── bat\e[0m
+       \e[37m│\e[1;30m│\e[0m\e[37m╭─── cat\e[0m
+       \e[37m│\e[1;30m│\e[37m│\e[0m\e[1;30m╭── dog\e[0m
+\e[4msource\e[0m \e[37m│\e[1;30m│\e[37m│\e[1;30m│\e[0m\e[37m╭─ eel\e[0m
+\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
+\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
+\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
+\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
+\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
+''',
+'utf8 True, colour ansi-heatmap': '''
+              \e[4mdestination\e[0m
+       \e[0m\e[37m╭───── ant\e[0m
+       \e[37m│\e[0m\e[1;30m╭──── bat\e[0m
+       \e[37m│\e[1;30m│\e[0m\e[37m╭─── cat\e[0m
+       \e[37m│\e[1;30m│\e[37m│\e[0m\e[1;30m╭── dog\e[0m
+\e[4msource\e[0m \e[37m│\e[1;30m│\e[37m│\e[1;30m│\e[0m\e[37m╭─ eel\e[0m
+\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
+\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
+\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
+\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
+\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
+''',
+'utf8 True, colour xterm-256color': '''
+              \e[4mdestination\e[0m
+       \e[0m\e[38;5;39m╭───── ant\e[0m
+       \e[38;5;39m│\e[0m\e[38;5;45m╭──── bat\e[0m
+       \e[38;5;39m│\e[38;5;45m│\e[0m\e[38;5;39m╭─── cat\e[0m
+       \e[38;5;39m│\e[38;5;45m│\e[38;5;39m│\e[0m\e[38;5;45m╭── dog\e[0m
+\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
+\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
+\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
+\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
+\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
+\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
+''',
+'utf8 True, colour xterm-256color-heatmap': '''
+              \e[4mdestination\e[0m
+       \e[0m\e[38;5;171m╭───── ant\e[0m
+       \e[38;5;171m│\e[0m\e[38;5;207m╭──── bat\e[0m
+       \e[38;5;171m│\e[38;5;207m│\e[0m\e[38;5;171m╭─── cat\e[0m
+       \e[38;5;171m│\e[38;5;207m│\e[38;5;171m│\e[0m\e[38;5;207m╭── dog\e[0m
+\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
+\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
+\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
+\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
+\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
+\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
+''',
+'utf8 False, colour None': '''
+              destination
+       ,----- ant
+       |,---- bat
+       ||,--- cat
+       |||,-- dog
+source ||||,- eel
+   ant 01234
+   bat 30123
+   cat 23012
+   dog 12301
+   eel ----0
+''',
+'utf8 False, colour ansi': '''
+              \e[4mdestination\e[0m
+       \e[0m\e[37m,----- ant\e[0m
+       \e[37m|\e[0m\e[1;30m,---- bat\e[0m
+       \e[37m|\e[1;30m|\e[0m\e[37m,--- cat\e[0m
+       \e[37m|\e[1;30m|\e[37m|\e[0m\e[1;30m,-- dog\e[0m
+\e[4msource\e[0m \e[37m|\e[1;30m|\e[37m|\e[1;30m|\e[0m\e[37m,- eel\e[0m
+\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
+\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
+\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
+\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
+\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
+''',
+'utf8 False, colour ansi-heatmap': '''
+              \e[4mdestination\e[0m
+       \e[0m\e[37m,----- ant\e[0m
+       \e[37m|\e[0m\e[1;30m,---- bat\e[0m
+       \e[37m|\e[1;30m|\e[0m\e[37m,--- cat\e[0m
+       \e[37m|\e[1;30m|\e[37m|\e[0m\e[1;30m,-- dog\e[0m
+\e[4msource\e[0m \e[37m|\e[1;30m|\e[37m|\e[1;30m|\e[0m\e[37m,- eel\e[0m
+\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
+\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
+\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
+\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
+\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
+''',
+'utf8 False, colour xterm-256color':
+'''              \e[4mdestination\e[0m
+       \e[0m\e[38;5;39m,----- ant\e[0m
+       \e[38;5;39m|\e[0m\e[38;5;45m,---- bat\e[0m
+       \e[38;5;39m|\e[38;5;45m|\e[0m\e[38;5;39m,--- cat\e[0m
+       \e[38;5;39m|\e[38;5;45m|\e[38;5;39m|\e[0m\e[38;5;45m,-- dog\e[0m
+\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
+\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
+\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
+\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
+\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
+\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
+''',
+'utf8 False, colour xterm-256color-heatmap': '''
+              \e[4mdestination\e[0m
+       \e[0m\e[38;5;171m,----- ant\e[0m
+       \e[38;5;171m|\e[0m\e[38;5;207m,---- bat\e[0m
+       \e[38;5;171m|\e[38;5;207m|\e[0m\e[38;5;171m,--- cat\e[0m
+       \e[38;5;171m|\e[38;5;207m|\e[38;5;171m|\e[0m\e[38;5;207m,-- dog\e[0m
+\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
+\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
+\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
+\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
+\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
+\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
+'''
+        }
         for utf8 in (True, False):
             for colour in self.sorted_colour_sets:
-                print('utf8 %s, colour %s' % (utf8, colour))
+                k = 'utf8 %s, colour %s' % (utf8, colour)
                 s = graph.distance_matrix(None, edges, utf8=utf8,
                                           colour=colour)
-                print(s)
-                print()
+                self.assertStringsEqual(s, expected[k], strip=True,
+                                        msg='Wrong output: %s\n\n%s' % (k, s))