GCC Code Coverage Report


Directory: ./
File: src/iguana/tests/iguana_test.cc
Date: 2026-01-07 23:30:02
Coverage Exec Excl Total
Lines: 82.7% 134 0 162
Functions: 72.7% 8 0 11
Branches: 41.2% 143 0 347

Line Branch Exec Source
1 #include <getopt.h>
2
3 #include "TestAlgorithm.h"
4 #include "TestBanklist.h"
5 #include "TestConfig.h"
6 #include "TestLogger.h"
7 #include "TestMultithreading.h"
8 #include "TestValidator.h"
9 #include <iguana/services/Tools.h>
10
11 37 int main(int argc, char** argv)
12 {
13 // user parameters
14 37 std::string command = "";
15
1/4
✓ Branch 3 → 4 taken 37 times.
✗ Branch 3 → 550 not taken.
✗ Branch 550 → 551 not taken.
✗ Branch 550 → 553 not taken.
37 std::string data_file = "";
16 37 int num_events = 10;
17
1/4
✓ Branch 4 → 5 taken 37 times.
✗ Branch 4 → 544 not taken.
✗ Branch 544 → 545 not taken.
✗ Branch 544 → 547 not taken.
37 std::string algo_name = "";
18 int test_num = 0;
19 37 int num_threads = 0;
20
1/4
✓ Branch 5 → 6 taken 37 times.
✗ Branch 5 → 538 not taken.
✗ Branch 538 → 539 not taken.
✗ Branch 538 → 541 not taken.
37 std::string concurrency_model = "";
21 bool vary_run = false;
22
2/6
✓ Branch 6 → 7 taken 37 times.
✗ Branch 6 → 532 not taken.
✓ Branch 7 → 8 taken 37 times.
✗ Branch 7 → 522 not taken.
✗ Branch 532 → 533 not taken.
✗ Branch 532 → 535 not taken.
37 std::string output_dir = "";
23 int verbosity = 0;
24 std::vector<std::string> bank_names;
25 std::vector<std::string> prerequisite_algos;
26
27 // get the command
28
1/2
✓ Branch 7 → 8 taken 37 times.
✗ Branch 7 → 522 not taken.
37 auto exe = std::string(argv[0]);
29 1 auto UsageCommands = [&](int exit_code) {
30
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 1 time.
2 fmt::print("\nUSAGE: {} [COMMAND] [OPTIONS]...\n", exe);
31 1 fmt::print("\n COMMANDS:\n\n");
32 1 fmt::print(" {:<20} {}\n", "algorithm", "call `Run` on an algorithm");
33 1 fmt::print(" {:<20} {}\n", "multithreading", "call `Run` on an algorithm, multithreaded");
34 1 fmt::print(" {:<20} {}\n", "validator", "run an algorithm's validator");
35 1 fmt::print(" {:<20} {}\n", "unit", "call `Test` on an algorithm, for unit tests");
36 1 fmt::print(" {:<20} {}\n", "config", "test config file parsing");
37 1 fmt::print(" {:<20} {}\n", "logger", "test Logger");
38 1 fmt::print(" {:<20} {}\n", "banklist", "test hipo::banklist");
39 1 fmt::print("\n OPTIONS:\n\n");
40 1 fmt::print(" Each command has its own set of OPTIONS; either provide no OPTIONS\n");
41 1 fmt::print(" or use the --help option for more usage information about a specific command\n");
42 1 fmt::print("\n");
43 1 return exit_code;
44 37 };
45
2/2
✓ Branch 8 → 9 taken 1 time.
✓ Branch 8 → 10 taken 36 times.
37 if(argc <= 1)
46
1/2
✓ Branch 9 → 339 taken 1 time.
✗ Branch 9 → 516 not taken.
1 return UsageCommands(2);
47
1/2
✓ Branch 10 → 11 taken 36 times.
✗ Branch 10 → 516 not taken.
36 command = std::string(argv[1]);
48
2/4
✓ Branch 17 → 18 taken 36 times.
✗ Branch 17 → 19 not taken.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 20 taken 36 times.
36 if(command == "--help" || command == "-h")
49 return UsageCommands(0);
50 // omit the command, for getopt
51 36 argv++;
52 36 argc--;
53
54 // usage options
55 // clang-format off
56
1/2
✓ Branch 2 → 3 taken 5 times.
✗ Branch 2 → 132 not taken.
5 auto UsageOptions = [&](int exit_code)
57 {
58 std::unordered_map<std::string, std::function<void()>> print_option = {
59 {"f", [&]()
60 {
61 3 fmt::print(" {:<20} {}\n", "-f FILE", "input data file");
62 }},
63
1/2
✓ Branch 3 → 4 taken 5 times.
✗ Branch 3 → 132 not taken.
8 {"n", [&]()
64 {
65 3 fmt::print(" {:<20} {}\n", "-n NUM_EVENTS", "number of events from the data file");
66 3 fmt::print(" {:<20} set to 0 to process ALL events\n", "");
67 3 fmt::print(" {:<20} default: {}\n", "", num_events);
68 3 }},
69
70 {"a-algo", [&]()
71 {
72 2 fmt::print(" {:<20} {}\n", "-a ALGORITHM", "the name of the algorithm");
73 }},
74 {"a-vdor", [&]()
75 {
76 1 fmt::print(" {:<20} {}\n", "-a VALIDATOR", "the name of the validator");
77 }},
78 3 {"b", [&]()
79 {
80 3 fmt::print(" {:<20} {}\n", "-b BANKS", "add a single bank to process");
81 3 fmt::print(" {:<20} you may add as many banks as you need (-b BANK1 -b BANK2 ...)\n", "");
82 3 fmt::print(" {:<20} default: if you do not add any banks, ALL of them will be used\n", "");
83 3 }},
84 2 {"p", [&]()
85 {
86 2 fmt::print(" {:<20} {}\n", "-p PREREQUISITE_ALGOS", "add a prerequisite algorithm");
87 2 fmt::print(" {:<20} these are the algorithms needed upstream of ALGORITHM\n", "");
88 2 fmt::print(" {:<20} this option is repeatable\n", "");
89 2 fmt::print(" {:<20} default: no prerequisites\n", "");
90 2 }},
91 {"t", [&]()
92 {
93 1 fmt::print(" {:<20} {}\n", "-t TESTNUM", "test number");
94 }},
95
1/2
✓ Branch 9 → 10 taken 5 times.
✗ Branch 9 → 132 not taken.
5 {"j", [&]()
96 {
97 fmt::print(" {:<20} {}\n", "-j NUM_THREADS", "number of threads to run");
98 fmt::print(" {:<20} - if = 0: run with `std::thread::hardware_concurrency()` threads\n", "");
99 fmt::print(" {:<20} - if > 0: run with NUM_THREADS threads\n", "");
100 fmt::print(" {:<20} default: {}\n", "", num_threads);
101 }},
102 {"m", [&]()
103 {
104 fmt::print(" {:<20} {}\n", "-m CONCURRENCY_MODEL", "concurrency model");
105 fmt::print(" {:<20} 'memoize' is currently the only option\n", "");
106 }},
107 {"V", [&]()
108 {
109 fmt::print(" {:<20} {}\n", "-V", "randomly vary the run number");
110 fmt::print(" {:<20} this is for testing run-dependent configuration thread safety\n", "");
111 }},
112
1/2
✓ Branch 12 → 13 taken 5 times.
✗ Branch 12 → 132 not taken.
5 {"o", [&]()
113 {
114
3/6
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 1 time.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 1 time.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 11 taken 1 time.
4 fmt::print(" {:<20} {}\n", "-o OUTPUT_DIR", fmt::format("if specified, {} output will write to this directory;", command));
115 1 fmt::print(" {:<20} if not specified, output will not be written\n", "");
116 1 }},
117 4 {"v", [&]()
118 {
119 4 fmt::print(" {:<20} {}\n", "-v", "increase verbosity by one level;");
120 4 fmt::print(" {:<20} repeated uses increase verbosity more\n", "");
121
2/4
✓ Branch 18 → 19 taken 60 times.
✓ Branch 18 → 20 taken 5 times.
✗ Branch 129 → 130 not taken.
✗ Branch 129 → 131 not taken.
65 }}};
122 std::map<std::string, std::vector<std::string>> available_options = {
123
1/2
✓ Branch 20 → 21 taken 5 times.
✗ Branch 20 → 195 not taken.
5 {"algorithm", {"f", "n", "a-algo", "b", "p"}},
124
1/2
✓ Branch 23 → 24 taken 5 times.
✗ Branch 23 → 187 not taken.
5 {"unit", {"f", "n", "a-algo", "b", "p"}},
125
1/2
✓ Branch 26 → 27 taken 5 times.
✗ Branch 26 → 179 not taken.
5 {"multithreading", {"f", "n", "a-algo", "b", "p", "j", "m", "V"}},
126
1/2
✓ Branch 29 → 30 taken 5 times.
✗ Branch 29 → 171 not taken.
5 {"validator", {"f", "n", "a-vdor", "b", "o"}},
127
1/2
✓ Branch 32 → 33 taken 5 times.
✗ Branch 32 → 163 not taken.
5 {"config", {"t"}},
128
1/2
✓ Branch 35 → 36 taken 5 times.
✗ Branch 35 → 155 not taken.
5 {"logger", {}},
129
1/2
✓ Branch 37 → 38 taken 5 times.
✗ Branch 37 → 147 not taken.
5 {"banklist", {"f"}}
130
16/46
✓ Branch 21 → 22 taken 5 times.
✗ Branch 21 → 189 not taken.
✓ Branch 24 → 25 taken 5 times.
✗ Branch 24 → 181 not taken.
✓ Branch 27 → 28 taken 5 times.
✗ Branch 27 → 173 not taken.
✓ Branch 30 → 31 taken 5 times.
✗ Branch 30 → 165 not taken.
✓ Branch 33 → 34 taken 5 times.
✗ Branch 33 → 157 not taken.
✓ Branch 38 → 39 taken 5 times.
✗ Branch 38 → 141 not taken.
✗ Branch 40 → 41 not taken.
✓ Branch 40 → 42 taken 5 times.
✓ Branch 43 → 44 taken 35 times.
✓ Branch 43 → 45 taken 5 times.
✓ Branch 46 → 47 taken 5 times.
✗ Branch 46 → 49 not taken.
✓ Branch 52 → 53 taken 5 times.
✗ Branch 52 → 55 not taken.
✓ Branch 58 → 59 taken 5 times.
✗ Branch 58 → 61 not taken.
✓ Branch 64 → 65 taken 5 times.
✗ Branch 64 → 67 not taken.
✓ Branch 70 → 71 taken 5 times.
✗ Branch 70 → 73 not taken.
✓ Branch 76 → 77 taken 5 times.
✗ Branch 76 → 79 not taken.
✓ Branch 82 → 83 taken 5 times.
✗ Branch 82 → 85 not taken.
✗ Branch 136 → 137 not taken.
✗ Branch 136 → 138 not taken.
✗ Branch 141 → 142 not taken.
✗ Branch 141 → 144 not taken.
✗ Branch 149 → 150 not taken.
✗ Branch 149 → 152 not taken.
✗ Branch 157 → 158 not taken.
✗ Branch 157 → 160 not taken.
✗ Branch 165 → 166 not taken.
✗ Branch 165 → 168 not taken.
✗ Branch 173 → 174 not taken.
✗ Branch 173 → 176 not taken.
✗ Branch 181 → 182 not taken.
✗ Branch 181 → 184 not taken.
✗ Branch 189 → 190 not taken.
✗ Branch 189 → 192 not taken.
105 };
131
2/2
✓ Branch 96 → 88 taken 35 times.
✓ Branch 96 → 97 taken 5 times.
40 for(auto& it : available_options)
132
1/2
✓ Branch 88 → 89 taken 35 times.
✗ Branch 88 → 211 not taken.
70 it.second.push_back("v");
133
2/2
✓ Branch 97 → 98 taken 4 times.
✓ Branch 97 → 122 taken 1 time.
5 if(auto it{available_options.find(command)}; it != available_options.end()) {
134
2/4
✗ Branch 98 → 99 not taken.
✓ Branch 98 → 100 taken 4 times.
✓ Branch 103 → 104 taken 4 times.
✗ Branch 103 → 211 not taken.
8 fmt::print("\nUSAGE: {} {} [OPTIONS]...\n", exe, command);
135 4 fmt::print("\n OPTIONS:\n\n");
136
2/2
✓ Branch 120 → 105 taken 20 times.
✓ Branch 120 → 121 taken 4 times.
24 for(auto available_opt : it->second) {
137 print_option.at(available_opt)();
138
1/2
✓ Branch 114 → 115 taken 20 times.
✗ Branch 114 → 117 not taken.
20 fmt::print("\n");
139 }
140 4 return exit_code;
141 }
142 else {
143
1/2
✗ Branch 122 → 123 not taken.
✓ Branch 122 → 124 taken 1 time.
1 fmt::print(stderr, "ERROR: unknown command '{}'\n", command);
144 1 return 1;
145 }
146
7/18
✓ Branch 22 → 23 taken 5 times.
✗ Branch 22 → 187 not taken.
✓ Branch 25 → 26 taken 5 times.
✗ Branch 25 → 179 not taken.
✓ Branch 28 → 29 taken 5 times.
✗ Branch 28 → 171 not taken.
✓ Branch 31 → 32 taken 5 times.
✗ Branch 31 → 163 not taken.
✓ Branch 34 → 35 taken 5 times.
✗ Branch 34 → 155 not taken.
✓ Branch 36 → 37 taken 5 times.
✗ Branch 36 → 147 not taken.
✓ Branch 39 → 40 taken 5 times.
✗ Branch 39 → 139 not taken.
✗ Branch 133 → 134 not taken.
✗ Branch 133 → 135 not taken.
✗ Branch 196 → 197 not taken.
✗ Branch 196 → 198 not taken.
35 };
147 // clang-format on
148
149
4/8
✓ Branch 20 → 21 taken 30 times.
✓ Branch 20 → 22 taken 6 times.
✓ Branch 21 → 23 taken 30 times.
✗ Branch 21 → 516 not taken.
✓ Branch 22 → 23 taken 6 times.
✗ Branch 22 → 516 not taken.
✗ Branch 516 → 517 not taken.
✗ Branch 516 → 519 not taken.
36 auto first_option = argc >= 2 ? std::string(argv[1]) : "";
150
2/4
✓ Branch 23 → 24 taken 36 times.
✗ Branch 23 → 26 not taken.
✓ Branch 24 → 25 taken 36 times.
✗ Branch 24 → 26 not taken.
36 if(first_option == "--help" || first_option == "-h")
151 return UsageOptions(0);
152
4/4
✓ Branch 25 → 27 taken 6 times.
✓ Branch 25 → 28 taken 30 times.
✓ Branch 27 → 28 taken 1 time.
✓ Branch 27 → 29 taken 5 times.
36 if(argc <= 2 && command != "logger")
153
1/2
✓ Branch 29 → 333 taken 5 times.
✗ Branch 29 → 510 not taken.
5 return UsageOptions(2);
154
155 // parse option arguments
156 int opt;
157
2/2
✓ Branch 113 → 30 taken 136 times.
✓ Branch 113 → 114 taken 31 times.
167 while((opt = getopt(argc, argv, "hf:n:a:b:p:t:j:m:Vo:v|")) != -1) {
158
8/13
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 27 times.
✓ Branch 30 → 40 taken 26 times.
✓ Branch 30 → 48 taken 26 times.
✓ Branch 30 → 56 taken 35 times.
✓ Branch 30 → 64 taken 6 times.
✓ Branch 30 → 73 taken 3 times.
✗ Branch 30 → 81 not taken.
✗ Branch 30 → 91 not taken.
✓ Branch 30 → 100 taken 10 times.
✓ Branch 30 → 108 taken 3 times.
✗ Branch 30 → 109 not taken.
✗ Branch 30 → 111 not taken.
136 switch(opt) {
159 case 'h':
160 return UsageOptions(0);
161 case 'f':
162
1/2
✓ Branch 32 → 33 taken 27 times.
✗ Branch 32 → 510 not taken.
27 data_file = std::string(optarg);
163 27 break;
164 case 'n':
165
2/4
✓ Branch 40 → 41 taken 26 times.
✗ Branch 40 → 510 not taken.
✓ Branch 42 → 43 taken 26 times.
✗ Branch 42 → 45 not taken.
52 num_events = std::stoi(optarg);
166 26 break;
167 case 'a':
168
1/2
✓ Branch 48 → 49 taken 26 times.
✗ Branch 48 → 510 not taken.
26 algo_name = std::string(optarg);
169 26 break;
170 case 'b':
171
1/2
✓ Branch 56 → 57 taken 35 times.
✗ Branch 56 → 510 not taken.
35 bank_names.push_back(std::string(optarg));
172 35 break;
173 case 'p':
174
1/2
✓ Branch 64 → 65 taken 6 times.
✗ Branch 64 → 510 not taken.
6 prerequisite_algos.push_back(std::string(optarg));
175 6 break;
176 case 't':
177
1/2
✓ Branch 73 → 74 taken 3 times.
✗ Branch 73 → 510 not taken.
3 test_num = std::stoi(optarg);
178 3 break;
179 case 'j':
180 num_threads = std::stoi(optarg);
181 if(num_threads == 0)
182 num_threads = std::thread::hardware_concurrency();
183 break;
184 case 'm':
185 concurrency_model = std::string(optarg);
186 break;
187 case 'V':
188 vary_run = true;
189 break;
190 case 'o':
191
1/2
✓ Branch 100 → 101 taken 10 times.
✗ Branch 100 → 510 not taken.
10 output_dir = std::string(optarg);
192 10 break;
193 3 case 'v':
194 3 verbosity++;
195 3 break;
196 default:
197 return UsageOptions(2);
198 }
199 }
200
201 // list of ALL banks needed by the algorithms and validators; we need all of them here,
202 // so that the caller does not have to specifiy the banks
203 std::vector<std::string> const all_bank_names = {
204 "RUN::config",
205 "REC::Particle",
206 "REC::Calorimeter",
207 "REC::Track",
208 "REC::Scintillator",
209
3/6
✓ Branch 114 → 115 taken 31 times.
✗ Branch 114 → 510 not taken.
✓ Branch 115 → 116 taken 16 times.
✓ Branch 115 → 117 taken 15 times.
✗ Branch 510 → 511 not taken.
✗ Branch 510 → 513 not taken.
62 "REC::Traj"};
210
2/2
✓ Branch 115 → 116 taken 16 times.
✓ Branch 115 → 117 taken 15 times.
31 if(bank_names.empty())
211
1/2
✓ Branch 116 → 117 taken 16 times.
✗ Branch 116 → 508 not taken.
16 bank_names = all_bank_names;
212
213
1/2
✗ Branch 118 → 119 not taken.
✓ Branch 118 → 120 taken 31 times.
31 fmt::print("TEST IGUANA:\n");
214
1/2
✗ Branch 121 → 122 not taken.
✓ Branch 121 → 123 taken 31 times.
31 fmt::print(" {:>20} = {}\n", "command", command);
215
1/2
✓ Branch 124 → 125 taken 31 times.
✗ Branch 124 → 508 not taken.
31 fmt::print(" {:>20} = {}\n", "data_file", data_file);
216
1/2
✗ Branch 125 → 126 not taken.
✓ Branch 125 → 127 taken 31 times.
31 fmt::print(" {:>20} = {}\n", "num_events", num_events);
217
1/2
✓ Branch 128 → 129 taken 31 times.
✗ Branch 128 → 508 not taken.
31 fmt::print(" {:>20} = {}\n", "algo_name", algo_name);
218
1/2
✓ Branch 129 → 130 taken 31 times.
✗ Branch 129 → 508 not taken.
31 fmt::print(" {:>20} = {}\n", "banks", fmt::join(bank_names, ", "));
219
1/2
✓ Branch 130 → 131 taken 31 times.
✗ Branch 130 → 508 not taken.
31 fmt::print(" {:>20} = {}\n", "prerequisite_algos", fmt::join(prerequisite_algos, ", "));
220
1/2
✓ Branch 131 → 132 taken 31 times.
✗ Branch 131 → 508 not taken.
31 fmt::print(" {:>20} = {}\n", "test_num", test_num);
221
1/2
✗ Branch 132 → 133 not taken.
✓ Branch 132 → 134 taken 31 times.
31 fmt::print(" {:>20} = {}\n", "num_threads", num_threads);
222
1/2
✓ Branch 135 → 136 taken 31 times.
✗ Branch 135 → 508 not taken.
31 fmt::print(" {:>20} = {}\n", "concurrency_model", concurrency_model);
223
1/2
✗ Branch 136 → 137 not taken.
✓ Branch 136 → 138 taken 31 times.
31 fmt::print(" {:>20} = {}\n", "vary_run", vary_run);
224
1/2
✓ Branch 139 → 140 taken 31 times.
✗ Branch 139 → 508 not taken.
31 fmt::print(" {:>20} = {}\n", "output_dir", output_dir);
225 31 fmt::print("\n");
226
227 // expand `~` in paths
228
1/2
✓ Branch 140 → 141 taken 31 times.
✗ Branch 140 → 508 not taken.
31 data_file = iguana::tools::ExpandTilde(data_file);
229
3/6
✓ Branch 147 → 148 taken 31 times.
✗ Branch 147 → 508 not taken.
✓ Branch 154 → 155 taken 28 times.
✓ Branch 154 → 156 taken 3 times.
✗ Branch 154 → 157 not taken.
✗ Branch 154 → 158 not taken.
62 output_dir = iguana::tools::ExpandTilde(output_dir);
230
231 // set log level
232 std::string log_level;
233
2/4
✓ Branch 154 → 155 taken 28 times.
✓ Branch 154 → 156 taken 3 times.
✗ Branch 154 → 157 not taken.
✗ Branch 154 → 158 not taken.
31 switch(verbosity) {
234 case 0:
235 log_level = "info";
236 break;
237 case 1:
238 log_level = "debug";
239 break;
240 case 2:
241 log_level = "trace";
242 break;
243 default:
244 fmt::println(stderr, "WARNING: no higher verbosity levels are available for `iguana_test`");
245 log_level = "trace";
246 break;
247 }
248
249 // run test
250
3/4
✓ Branch 160 → 161 taken 15 times.
✓ Branch 160 → 163 taken 16 times.
✓ Branch 161 → 162 taken 15 times.
✗ Branch 161 → 163 not taken.
31 if(command == "algorithm" || command == "unit")
251
7/20
✗ Branch 167 → 168 not taken.
✓ Branch 167 → 169 taken 16 times.
✓ Branch 171 → 172 taken 16 times.
✗ Branch 171 → 418 not taken.
✓ Branch 172 → 173 taken 16 times.
✗ Branch 172 → 416 not taken.
✓ Branch 181 → 182 taken 16 times.
✗ Branch 181 → 402 not taken.
✗ Branch 187 → 188 not taken.
✓ Branch 187 → 190 taken 16 times.
✗ Branch 194 → 195 not taken.
✓ Branch 194 → 197 taken 16 times.
✓ Branch 199 → 200 taken 16 times.
✗ Branch 199 → 202 not taken.
✗ Branch 408 → 409 not taken.
✗ Branch 408 → 411 not taken.
✗ Branch 418 → 419 not taken.
✗ Branch 418 → 421 not taken.
✗ Branch 424 → 425 not taken.
✗ Branch 424 → 427 not taken.
112 return TestAlgorithm(command, algo_name, prerequisite_algos, bank_names, data_file, num_events, log_level);
252
1/2
✗ Branch 162 → 205 not taken.
✓ Branch 162 → 256 taken 15 times.
15 if(command == "multithreading")
253 return TestMultithreading(command, algo_name, prerequisite_algos, bank_names, data_file, num_events, num_threads, concurrency_model, vary_run, log_level);
254
2/2
✓ Branch 256 → 257 taken 10 times.
✓ Branch 256 → 297 taken 5 times.
15 else if(command == "validator")
255
6/18
✗ Branch 265 → 266 not taken.
✓ Branch 265 → 267 taken 10 times.
✓ Branch 269 → 270 taken 10 times.
✗ Branch 269 → 472 not taken.
✓ Branch 274 → 275 taken 10 times.
✗ Branch 274 → 464 not taken.
✗ Branch 281 → 282 not taken.
✓ Branch 281 → 284 taken 10 times.
✗ Branch 286 → 287 not taken.
✓ Branch 286 → 289 taken 10 times.
✓ Branch 291 → 292 taken 10 times.
✗ Branch 291 → 294 not taken.
✗ Branch 472 → 473 not taken.
✗ Branch 472 → 475 not taken.
✗ Branch 478 → 479 not taken.
✗ Branch 478 → 481 not taken.
✗ Branch 484 → 485 not taken.
✗ Branch 484 → 487 not taken.
70 return TestValidator(algo_name, bank_names, data_file, num_events, output_dir, log_level);
256
2/2
✓ Branch 297 → 298 taken 3 times.
✓ Branch 297 → 309 taken 2 times.
5 else if(command == "config")
257
1/2
✓ Branch 302 → 303 taken 3 times.
✗ Branch 302 → 490 not taken.
6 return TestConfig(test_num, log_level);
258
2/2
✓ Branch 309 → 310 taken 1 time.
✓ Branch 309 → 311 taken 1 time.
2 else if(command == "logger")
259
1/2
✓ Branch 310 → 327 taken 1 time.
✗ Branch 310 → 502 not taken.
1 return TestLogger();
260
1/2
✓ Branch 311 → 312 taken 1 time.
✗ Branch 311 → 323 not taken.
1 else if(command == "banklist")
261
1/4
✓ Branch 316 → 317 taken 1 time.
✗ Branch 316 → 496 not taken.
✗ Branch 502 → 503 not taken.
✗ Branch 502 → 505 not taken.
2 return TestBanklist(data_file);
262 else {
263 fmt::print(stderr, "ERROR: unknown command '{}'\n", command);
264 return 1;
265 }
266 return 0;
267 37 }
268