add prefix sum render tests
[nmutil.git] / src / nmutil / test / test_prefix_sum.py
1 # SPDX-License-Identifier: LGPL-3-or-later
2 # Copyright 2022 Jacob Lifshay programmerjake@gmail.com
3
4 # Funded by NLnet Assure Programme 2021-02-052, https://nlnet.nl/assure part
5 # of Horizon 2020 EU Programme 957073.
6
7 from nmutil.formaltest import FHDLTestCase
8 from itertools import accumulate
9 import operator
10 from nmutil.prefix_sum import prefix_sum, render_prefix_sum_diagram
11 import unittest
12
13
14 def reference_prefix_sum(items, fn):
15 return list(accumulate(items, fn))
16
17
18 class TestPrefixSum(FHDLTestCase):
19 maxDiff = None
20
21 def test_prefix_sum_str(self):
22 input_items = ("a", "b", "c", "d", "e", "f", "g", "h", "i")
23 expected = reference_prefix_sum(input_items, operator.add)
24 with self.subTest(expected=repr(expected)):
25 non_work_efficient = prefix_sum(input_items, work_efficient=False)
26 self.assertEqual(expected, non_work_efficient)
27 with self.subTest(expected=repr(expected)):
28 work_efficient = prefix_sum(input_items, work_efficient=True)
29 self.assertEqual(expected, work_efficient)
30
31 def test_render_work_efficient(self):
32 text = render_prefix_sum_diagram(16, work_efficient=True, plus="@")
33 expected = r"""
34 | | | | | | | | | | | | | | | |
35 ● | ● | ● | ● | ● | ● | ● | ● |
36 |\ | |\ | |\ | |\ | |\ | |\ | |\ | |\ |
37 | \| | \| | \| | \| | \| | \| | \| | \|
38 | @ | @ | @ | @ | @ | @ | @ | @
39 | |\ | | | |\ | | | |\ | | | |\ | |
40 | | \| | | | \| | | | \| | | | \| |
41 | | X | | | X | | | X | | | X |
42 | | |\ | | | |\ | | | |\ | | | |\ |
43 | | | \| | | | \| | | | \| | | | \|
44 | | | @ | | | @ | | | @ | | | @
45 | | | |\ | | | | | | | |\ | | | |
46 | | | | \| | | | | | | | \| | | |
47 | | | | X | | | | | | | X | | |
48 | | | | |\ | | | | | | | |\ | | |
49 | | | | | \| | | | | | | | \| | |
50 | | | | | X | | | | | | | X | |
51 | | | | | |\ | | | | | | | |\ | |
52 | | | | | | \| | | | | | | | \| |
53 | | | | | | X | | | | | | | X |
54 | | | | | | |\ | | | | | | | |\ |
55 | | | | | | | \| | | | | | | | \|
56 | | | | | | | @ | | | | | | | @
57 | | | | | | | |\ | | | | | | | |
58 | | | | | | | | \| | | | | | | |
59 | | | | | | | | X | | | | | | |
60 | | | | | | | | |\ | | | | | | |
61 | | | | | | | | | \| | | | | | |
62 | | | | | | | | | X | | | | | |
63 | | | | | | | | | |\ | | | | | |
64 | | | | | | | | | | \| | | | | |
65 | | | | | | | | | | X | | | | |
66 | | | | | | | | | | |\ | | | | |
67 | | | | | | | | | | | \| | | | |
68 | | | | | | | | | | | X | | | |
69 | | | | | | | | | | | |\ | | | |
70 | | | | | | | | | | | | \| | | |
71 | | | | | | | | | | | | X | | |
72 | | | | | | | | | | | | |\ | | |
73 | | | | | | | | | | | | | \| | |
74 | | | | | | | | | | | | | X | |
75 | | | | | | | | | | | | | |\ | |
76 | | | | | | | | | | | | | | \| |
77 | | | | | | | | | | | | | | X |
78 | | | | | | | | | | | | | | |\ |
79 | | | | | | | | | | | | | | | \|
80 | | | | | | | ● | | | | | | | @
81 | | | | | | | |\ | | | | | | | |
82 | | | | | | | | \| | | | | | | |
83 | | | | | | | | X | | | | | | |
84 | | | | | | | | |\ | | | | | | |
85 | | | | | | | | | \| | | | | | |
86 | | | | | | | | | X | | | | | |
87 | | | | | | | | | |\ | | | | | |
88 | | | | | | | | | | \| | | | | |
89 | | | | | | | | | | X | | | | |
90 | | | | | | | | | | |\ | | | | |
91 | | | | | | | | | | | \| | | | |
92 | | | ● | | | ● | | | @ | | | |
93 | | | |\ | | | |\ | | | |\ | | | |
94 | | | | \| | | | \| | | | \| | | |
95 | | | | X | | | X | | | X | | |
96 | | | | |\ | | | |\ | | | |\ | | |
97 | | | | | \| | | | \| | | | \| | |
98 | ● | ● | @ | ● | @ | ● | @ | |
99 | |\ | |\ | |\ | |\ | |\ | |\ | |\ | |
100 | | \| | \| | \| | \| | \| | \| | \| |
101 | | @ | @ | @ | @ | @ | @ | @ |
102 | | | | | | | | | | | | | | | |
103 """
104 expected = expected[1:-1] # trim newline at start and end
105 if text != expected:
106 print("text:")
107 print(text)
108 print()
109 self.assertEqual(expected, text)
110
111 def test_render_not_work_efficient(self):
112 text = render_prefix_sum_diagram(16, work_efficient=False, plus="@")
113 expected = r"""
114 | | | | | | | | | | | | | | | |
115 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● |
116 |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |
117 | \| \| \| \| \| \| \| \| \| \| \| \| \| \| \|
118 ● @ @ @ @ @ @ @ @ @ @ @ @ @ @ @
119 |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ | |
120 | \| \| \| \| \| \| \| \| \| \| \| \| \| \| |
121 | X X X X X X X X X X X X X X |
122 | |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |
123 | | \| \| \| \| \| \| \| \| \| \| \| \| \| \|
124 ● ● @ @ @ @ @ @ @ @ @ @ @ @ @ @
125 |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ | | | |
126 | \| \| \| \| \| \| \| \| \| \| \| \| | | |
127 | X X X X X X X X X X X X | | |
128 | |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ | | |
129 | | \| \| \| \| \| \| \| \| \| \| \| \| | |
130 | | X X X X X X X X X X X X | |
131 | | |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ | |
132 | | | \| \| \| \| \| \| \| \| \| \| \| \| |
133 | | | X X X X X X X X X X X X |
134 | | | |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |\ |
135 | | | | \| \| \| \| \| \| \| \| \| \| \| \|
136 ● ● ● ● @ @ @ @ @ @ @ @ @ @ @ @
137 |\ |\ |\ |\ |\ |\ |\ |\ | | | | | | | |
138 | \| \| \| \| \| \| \| \| | | | | | | |
139 | X X X X X X X X | | | | | | |
140 | |\ |\ |\ |\ |\ |\ |\ |\ | | | | | | |
141 | | \| \| \| \| \| \| \| \| | | | | | |
142 | | X X X X X X X X | | | | | |
143 | | |\ |\ |\ |\ |\ |\ |\ |\ | | | | | |
144 | | | \| \| \| \| \| \| \| \| | | | | |
145 | | | X X X X X X X X | | | | |
146 | | | |\ |\ |\ |\ |\ |\ |\ |\ | | | | |
147 | | | | \| \| \| \| \| \| \| \| | | | |
148 | | | | X X X X X X X X | | | |
149 | | | | |\ |\ |\ |\ |\ |\ |\ |\ | | | |
150 | | | | | \| \| \| \| \| \| \| \| | | |
151 | | | | | X X X X X X X X | | |
152 | | | | | |\ |\ |\ |\ |\ |\ |\ |\ | | |
153 | | | | | | \| \| \| \| \| \| \| \| | |
154 | | | | | | X X X X X X X X | |
155 | | | | | | |\ |\ |\ |\ |\ |\ |\ |\ | |
156 | | | | | | | \| \| \| \| \| \| \| \| |
157 | | | | | | | X X X X X X X X |
158 | | | | | | | |\ |\ |\ |\ |\ |\ |\ |\ |
159 | | | | | | | | \| \| \| \| \| \| \| \|
160 | | | | | | | | @ @ @ @ @ @ @ @
161 | | | | | | | | | | | | | | | |
162 """
163 expected = expected[1:-1] # trim newline at start and end
164 if text != expected:
165 print("text:")
166 print(text)
167 print()
168 self.assertEqual(expected, text)
169
170 # TODO: add more tests
171
172
173 if __name__ == "__main__":
174 unittest.main()