1 # SPDX-License-Identifier: LGPL-3-or-later
2 # Copyright 2022 Jacob Lifshay programmerjake@gmail.com
4 # Funded by NLnet Assure Programme 2021-02-052, https://nlnet.nl/assure part
5 # of Horizon 2020 EU Programme 957073.
7 from nmutil
.formaltest
import FHDLTestCase
8 from itertools
import accumulate
10 from nmutil
.prefix_sum
import prefix_sum
, render_prefix_sum_diagram
14 def reference_prefix_sum(items
, fn
):
15 return list(accumulate(items
, fn
))
18 class TestPrefixSum(FHDLTestCase
):
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
)
31 def test_render_work_efficient(self
):
32 text
= render_prefix_sum_diagram(16, work_efficient
=True, plus
="@")
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 | | | | | | | | | | | | | | | |
104 expected
= expected
[1:-1] # trim newline at start and end
109 self
.assertEqual(expected
, text
)
111 def test_render_not_work_efficient(self
):
112 text
= render_prefix_sum_diagram(16, work_efficient
=False, plus
="@")
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 | | | | | | | | | | | | | | | |
163 expected
= expected
[1:-1] # trim newline at start and end
168 self
.assertEqual(expected
, text
)
170 # TODO: add more tests
173 if __name__
== "__main__":