GCC Code Coverage Report


Directory: ../
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 98.2% 164 / 27 / 194
Functions: 100.0% 62 / 3 / 65
Branches: 43.4% 274 / 78 / 709

test/TestRunner.cpp
Line Branch Exec Source
1 // Copyright (c) 2021-2026 ChilliBits. All rights reserved.
2
3 #include <string>
4 #include <vector>
5
6 #include <gtest/gtest.h>
7
8 #include <SourceFile.h>
9 #include <driver/Driver.h>
10 #include <exception/CompilerError.h>
11 #include <exception/LexerError.h>
12 #include <exception/LinkerError.h>
13 #include <exception/ParserError.h>
14 #include <exception/SemanticError.h>
15 #include <global/GlobalResourceManager.h>
16 #include <global/TypeRegistry.h>
17 #include <llvm/TargetParser/Triple.h>
18 #include <symboltablebuilder/Scope.h>
19 #include <symboltablebuilder/SymbolTable.h>
20 #include <typechecker/FunctionManager.h>
21 #include <typechecker/InterfaceManager.h>
22 #include <typechecker/StructManager.h>
23 #include <util/SystemUtil.h>
24
25 #include "driver/TestDriver.h"
26 #include "util/TestUtil.h"
27
28 using namespace spice::compiler;
29
30 namespace spice::testing {
31
32 extern TestDriverCliOptions testDriverCliOptions;
33
34 445 void execTestCase(const TestCase &testCase) {
35 // Check if test is disabled
36
3/4
✓ Branch 2 → 3 taken 445 times.
✗ Branch 2 → 576 not taken.
✓ Branch 3 → 4 taken 2 times.
✓ Branch 3 → 10 taken 443 times.
445 if (TestUtil::isDisabled(testCase))
37
3/6
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 275 not taken.
✓ Branch 5 → 6 taken 2 times.
✗ Branch 5 → 272 not taken.
✓ Branch 6 → 7 taken 2 times.
✗ Branch 6 → 270 not taken.
2 GTEST_SKIP();
38
39 // Create fake cli options
40
2/4
✓ Branch 10 → 11 taken 443 times.
✗ Branch 10 → 278 not taken.
✓ Branch 11 → 12 taken 443 times.
✗ Branch 11 → 276 not taken.
443 const std::filesystem::path mainSourceFilePath = testCase.testPath / REF_NAME_SOURCE;
41 443 CliOptions cliOptions = {
42 /* mainSourceFile= */ mainSourceFilePath,
43 /* targetTriple= */ {},
44 /* targetArch= */ TARGET_UNKNOWN, // GCOV_EXCL_LINE - coverage tool bug
45 443 /* targetVendor= */ TARGET_UNKNOWN,
46 443 /* targetOs= */ TARGET_UNKNOWN,
47 /* isNativeTarget= */ true,
48 /* useCPUFeatures*/ false, // Disabled because it makes the refs differ on different machines
49 /* execute= */ false, // If we set this to 'true', the compiler will not emit object files
50 /* cacheDir= */ "./cache",
51 /* outputDir= */ "./",
52 /* outputPath= */ "",
53 /* buildMode= */ BuildMode::DEBUG,
54 /* compileJobCount= */ 0,
55 /* ignoreCache */ true,
56 443 /* llvmArgs= */ "",
57 /* printDebugOutput= */ false,
58 CliOptions::DumpSettings{
59 /* dumpCST= */ false,
60 /* dumpAST= */ false,
61 /* dumpSymbolTables= */ false,
62 /* dumpTypes= */ false,
63 /* dumpCacheStats= */ false,
64 /* dumpDependencyGraph= */ false,
65 /* dumpIR= */ false,
66 /* dumpAssembly= */ false,
67 /* dumpObjectFile= */ false,
68 /* dumpToFiles= */ false,
69 /* abortAfterDump */ false,
70 },
71 /* namesForIRValues= */ true,
72 /* useLifetimeMarkers= */ false,
73 /* useTBAAMetadata */ false,
74 /* optLevel= */ OptLevel::O0,
75 /* useLTO= */ false,
76
2/4
✓ Branch 31 → 32 taken 443 times.
✗ Branch 31 → 287 not taken.
✓ Branch 32 → 33 taken 443 times.
✗ Branch 32 → 285 not taken.
886 /* noEntryFct= */ exists(testCase.testPath / CTL_RUN_BUILTIN_TESTS),
77
2/4
✓ Branch 34 → 35 taken 443 times.
✗ Branch 34 → 281 not taken.
✓ Branch 35 → 36 taken 443 times.
✗ Branch 35 → 279 not taken.
886 /* generateTestMain= */ exists(testCase.testPath / CTL_RUN_BUILTIN_TESTS),
78 /* staticLinking= */ false,
79 CliOptions::InstrumentationSettings{
80 /* generateDebugInfo= */ false,
81 /* sanitizer= */ Sanitizer::NONE,
82 },
83 /* disableVerifier= */ false,
84 /* testMode= */ true,
85 /* comparableOutput= */ true,
86
10/38
✓ Branch 13 → 14 taken 443 times.
✗ Branch 13 → 574 not taken.
✓ Branch 17 → 18 taken 443 times.
✗ Branch 17 → 321 not taken.
✓ Branch 20 → 21 taken 443 times.
✗ Branch 20 → 315 not taken.
✓ Branch 23 → 24 taken 443 times.
✗ Branch 23 → 309 not taken.
✓ Branch 24 → 25 taken 443 times.
✗ Branch 24 → 306 not taken.
✓ Branch 25 → 26 taken 443 times.
✗ Branch 25 → 303 not taken.
✓ Branch 26 → 27 taken 443 times.
✗ Branch 26 → 300 not taken.
✓ Branch 29 → 30 taken 443 times.
✗ Branch 29 → 294 not taken.
✓ Branch 30 → 31 taken 443 times.
✗ Branch 30 → 289 not taken.
✓ Branch 33 → 34 taken 443 times.
✗ Branch 33 → 283 not taken.
✗ Branch 291 → 292 not taken.
✗ Branch 291 → 293 not taken.
✗ Branch 297 → 298 not taken.
✗ Branch 297 → 299 not taken.
✗ Branch 300 → 301 not taken.
✗ Branch 300 → 302 not taken.
✗ Branch 303 → 304 not taken.
✗ Branch 303 → 305 not taken.
✗ Branch 306 → 307 not taken.
✗ Branch 306 → 308 not taken.
✗ Branch 312 → 313 not taken.
✗ Branch 312 → 314 not taken.
✗ Branch 318 → 319 not taken.
✗ Branch 318 → 320 not taken.
✗ Branch 324 → 325 not taken.
✗ Branch 324 → 326 not taken.
✗ Branch 327 → 328 not taken.
✗ Branch 327 → 329 not taken.
3101 };
87 static_assert(sizeof(CliOptions::DumpSettings) == 11, "CliOptions::DumpSettings struct size changed");
88 static_assert(sizeof(CliOptions::InstrumentationSettings) == 2, "CliOptions::InstrumentationSettings struct size changed");
89 #if defined(__clang__) && defined(__apple_build_version__)
90 // some std types for Apple Clang are smaller than for GCC and Clang
91 static_assert(sizeof(CliOptions) == 288, "CliOptions struct size changed");
92 #else
93 static_assert(sizeof(CliOptions) == 392, "CliOptions struct size changed");
94 #endif
95
96 // Parse test args
97
1/2
✓ Branch 46 → 47 taken 443 times.
✗ Branch 46 → 330 not taken.
886 std::vector<std::string> args = {"spice", "build"};
98
1/2
✓ Branch 48 → 49 taken 443 times.
✗ Branch 48 → 570 not taken.
443 TestUtil::parseTestArgs(cliOptions.mainSourceFile, args);
99
2/4
✓ Branch 49 → 50 taken 443 times.
✗ Branch 49 → 335 not taken.
✓ Branch 50 → 51 taken 443 times.
✗ Branch 50 → 333 not taken.
443 args.push_back(mainSourceFilePath.string());
100
101 443 bool explicitlySelectedTarget = false;
102 443 std::vector<const char *> argv;
103
1/2
✓ Branch 53 → 54 taken 443 times.
✗ Branch 53 → 568 not taken.
443 argv.reserve(args.size());
104
2/2
✓ Branch 64 → 56 taken 1353 times.
✓ Branch 64 → 65 taken 443 times.
1796 for (const std::string &arg : args) {
105
2/2
✓ Branch 58 → 59 taken 5 times.
✓ Branch 58 → 60 taken 1348 times.
1353 if (arg.starts_with("--target"))
106 5 explicitlySelectedTarget = true;
107
1/2
✓ Branch 61 → 62 taken 1353 times.
✗ Branch 61 → 336 not taken.
1353 argv.push_back(arg.c_str());
108 }
109
1/2
✓ Branch 65 → 66 taken 443 times.
✗ Branch 65 → 568 not taken.
443 Driver driver(cliOptions, true);
110
1/2
✓ Branch 68 → 69 taken 443 times.
✗ Branch 68 → 566 not taken.
443 driver.parse(static_cast<int>(argv.size()), argv.data());
111
1/2
✓ Branch 69 → 70 taken 443 times.
✗ Branch 69 → 566 not taken.
443 driver.enrich();
112
113 // If this is a cross-compilation test, we want to emit the target information in IR. For this we need to set native to false
114
2/2
✓ Branch 70 → 71 taken 5 times.
✓ Branch 70 → 72 taken 438 times.
443 if (explicitlySelectedTarget)
115 5 cliOptions.isNativeTarget = false;
116
117 // Instantiate GlobalResourceManager
118
1/2
✓ Branch 72 → 73 taken 443 times.
✗ Branch 72 → 566 not taken.
443 GlobalResourceManager resourceManager(cliOptions);
119
120 try {
121 // Create source file instance for main source file
122
2/4
✓ Branch 75 → 76 taken 443 times.
✗ Branch 75 → 340 not taken.
✓ Branch 76 → 77 taken 443 times.
✗ Branch 76 → 338 not taken.
443 SourceFile *mainSourceFile = resourceManager.createSourceFile(nullptr, MAIN_FILE_NAME, cliOptions.mainSourceFile, false);
123
124 // Run Lexer and Parser
125
2/2
✓ Branch 79 → 80 taken 441 times.
✓ Branch 79 → 525 taken 2 times.
443 mainSourceFile->runLexer();
126
1/2
✓ Branch 80 → 81 taken 441 times.
✗ Branch 80 → 525 not taken.
441 mainSourceFile->runParser();
127
128 // Check CST
129
3/6
✓ Branch 83 → 84 taken 441 times.
✗ Branch 83 → 348 not taken.
✓ Branch 84 → 85 taken 441 times.
✗ Branch 84 → 346 not taken.
✓ Branch 85 → 86 taken 441 times.
✗ Branch 85 → 344 not taken.
441 TestUtil::checkRefMatch(testCase.testPath / REF_NAME_PARSE_TREE, [&] {
130 8 mainSourceFile->runCSTVisualizer();
131 8 return mainSourceFile->compilerOutput.cstString;
132 });
133
134 // Build and optimize AST
135
2/2
✓ Branch 90 → 91 taken 433 times.
✓ Branch 90 → 525 taken 8 times.
441 mainSourceFile->runASTBuilder();
136
137 // Check AST
138
3/6
✓ Branch 93 → 94 taken 433 times.
✗ Branch 93 → 362 not taken.
✓ Branch 94 → 95 taken 433 times.
✗ Branch 94 → 360 not taken.
✓ Branch 95 → 96 taken 433 times.
✗ Branch 95 → 358 not taken.
433 TestUtil::checkRefMatch(testCase.testPath / REF_NAME_SYNTAX_TREE, [&] {
139 8 mainSourceFile->runASTVisualizer();
140 8 return mainSourceFile->compilerOutput.astString;
141 });
142
143 // Execute import collector and semantic analysis stages
144
2/2
✓ Branch 100 → 101 taken 428 times.
✓ Branch 100 → 525 taken 5 times.
433 mainSourceFile->runImportCollector();
145
2/2
✓ Branch 101 → 102 taken 410 times.
✓ Branch 101 → 525 taken 18 times.
428 mainSourceFile->runSymbolTableBuilder();
146
2/2
✓ Branch 102 → 103 taken 258 times.
✓ Branch 102 → 525 taken 152 times.
410 mainSourceFile->runMiddleEnd(); // TypeChecker pre + post
147
148 // Check symbol table output (check happens here to include updates from type checker)
149
3/6
✓ Branch 105 → 106 taken 258 times.
✗ Branch 105 → 376 not taken.
✓ Branch 106 → 107 taken 258 times.
✗ Branch 106 → 374 not taken.
✓ Branch 107 → 108 taken 258 times.
✗ Branch 107 → 372 not taken.
516 TestUtil::checkRefMatch(testCase.testPath / REF_NAME_SYMBOL_TABLE,
150
2/4
✓ Branch 3 → 4 taken 9 times.
✗ Branch 3 → 11 not taken.
✓ Branch 4 → 5 taken 9 times.
✗ Branch 4 → 9 not taken.
525 [&] { return mainSourceFile->globalScope->getSymbolTableJSON().dump(/*indent=*/2); });
151
152 // Fail if an error was expected
153 if (TestUtil::doesRefExist(testCase.testPath / REF_NAME_ERROR_OUTPUT)) // GCOV_EXCL_LINE
154 FAIL() << "Expected error, but got no error"; // GCOV_EXCL_LINE
155
156 // Check dependency graph
157
3/6
✓ Branch 127 → 128 taken 258 times.
✗ Branch 127 → 402 not taken.
✓ Branch 128 → 129 taken 258 times.
✗ Branch 128 → 400 not taken.
✓ Branch 129 → 130 taken 258 times.
✗ Branch 129 → 398 not taken.
258 TestUtil::checkRefMatch(testCase.testPath / REF_NAME_DEP_GRAPH, [&] {
158 2 mainSourceFile->runDependencyGraphVisualizer();
159 2 return mainSourceFile->compilerOutput.depGraphString;
160 });
161
162 // Run backend for all dependencies
163
5/8
✓ Branch 134 → 135 taken 258 times.
✗ Branch 134 → 412 not taken.
✓ Branch 135 → 136 taken 258 times.
✗ Branch 135 → 412 not taken.
✓ Branch 136 → 137 taken 258 times.
✗ Branch 136 → 412 not taken.
✓ Branch 142 → 138 taken 202 times.
✓ Branch 142 → 143 taken 258 times.
460 for (SourceFile *sourceFile : mainSourceFile->dependencies | std::views::values)
164
1/2
✓ Branch 139 → 140 taken 202 times.
✗ Branch 139 → 412 not taken.
202 sourceFile->runBackEnd();
165
166 // Execute IR generator in normal or debug mode
167
1/2
✓ Branch 143 → 144 taken 258 times.
✗ Branch 143 → 525 not taken.
258 mainSourceFile->runIRGenerator();
168
169 // Check IR code
170
2/2
✓ Branch 155 → 145 taken 1548 times.
✓ Branch 155 → 156 taken 258 times.
1806 for (uint8_t i = 0; i <= 5; i++) {
171
1/2
✓ Branch 149 → 150 taken 1548 times.
✗ Branch 149 → 413 not taken.
1548 TestUtil::checkRefMatch(
172
2/4
✓ Branch 147 → 148 taken 1548 times.
✗ Branch 147 → 417 not taken.
✓ Branch 148 → 149 taken 1548 times.
✗ Branch 148 → 415 not taken.
3096 testCase.testPath / REF_NAME_OPT_IR[i],
173
1/2
✓ Branch 146 → 147 taken 1548 times.
✗ Branch 146 → 421 not taken.
3096 [&] {
174 180 cliOptions.optLevel = static_cast<OptLevel>(i);
175
176
2/2
✓ Branch 2 → 3 taken 1 time.
✓ Branch 2 → 6 taken 179 times.
180 if (cliOptions.useLTO) {
177 1 mainSourceFile->runPreLinkIROptimizer();
178 1 mainSourceFile->runBitcodeLinker();
179 1 mainSourceFile->runPostLinkIROptimizer();
180 } else {
181 179 mainSourceFile->runDefaultIROptimizer();
182 }
183
184 180 return mainSourceFile->compilerOutput.irOptString;
185 },
186 3096 [&](std::string &expectedOutput, std::string &actualOutput) {
187
2/2
✓ Branch 2 → 3 taken 6 times.
✓ Branch 2 → 5 taken 174 times.
180 if (cliOptions.instrumentation.generateDebugInfo) {
188 // Remove the lines, containing paths on the local file system
189 6 TestUtil::eraseLinesBySubstring(expectedOutput, " = !DIFile(filename:");
190 6 TestUtil::eraseLinesBySubstring(actualOutput, " = !DIFile(filename:");
191 }
192 180 },
193 true);
194 }
195
196 // Link the bitcode if not happened yet
197
3/4
✓ Branch 156 → 157 taken 1 time.
✓ Branch 156 → 159 taken 257 times.
✗ Branch 157 → 158 not taken.
✓ Branch 157 → 159 taken 1 time.
258 if (cliOptions.useLTO && cliOptions.optLevel == OptLevel::O0)
198 mainSourceFile->runBitcodeLinker();
199
200 // Check assembly code (only when not running test on GitHub Actions)
201 258 bool objectFilesEmitted = false;
202 // GCOV_EXCL_START
203 if (!testDriverCliOptions.isGitHubActions) {
204 TestUtil::checkRefMatch(testCase.testPath / REF_NAME_ASM, [&] {
205 mainSourceFile->runObjectEmitter();
206 objectFilesEmitted = true;
207
208 return mainSourceFile->compilerOutput.asmString;
209 });
210 }
211 // GCOV_EXCL_STOP
212
213 // Check warnings
214
1/2
✓ Branch 170 → 171 taken 258 times.
✗ Branch 170 → 525 not taken.
258 mainSourceFile->collectAndPrintWarnings();
215
3/6
✓ Branch 173 → 174 taken 258 times.
✗ Branch 173 → 446 not taken.
✓ Branch 174 → 175 taken 258 times.
✗ Branch 174 → 444 not taken.
✓ Branch 175 → 176 taken 258 times.
✗ Branch 175 → 442 not taken.
258 TestUtil::checkRefMatch(testCase.testPath / REF_NAME_WARNING_OUTPUT, [&] {
216
1/2
✓ Branch 2 → 3 taken 22 times.
✗ Branch 2 → 19 not taken.
22 std::stringstream actualWarningString;
217
2/2
✓ Branch 10 → 5 taken 23 times.
✓ Branch 10 → 11 taken 22 times.
45 for (const CompilerWarning &warning : mainSourceFile->compilerOutput.warnings)
218
2/4
✓ Branch 6 → 7 taken 23 times.
✗ Branch 6 → 16 not taken.
✓ Branch 7 → 8 taken 23 times.
✗ Branch 7 → 16 not taken.
23 actualWarningString << warning.warningMessage << "\n";
219
1/2
✓ Branch 11 → 12 taken 22 times.
✗ Branch 11 → 17 not taken.
44 return actualWarningString.str();
220 22 });
221
222 // Do linking and conclude compilation
223
3/6
✓ Branch 180 → 181 taken 258 times.
✗ Branch 180 → 460 not taken.
✓ Branch 181 → 182 taken 258 times.
✗ Branch 181 → 458 not taken.
✓ Branch 182 → 183 taken 258 times.
✗ Branch 182 → 456 not taken.
258 const bool needsNormalRun = TestUtil::doesRefExist(testCase.testPath / REF_NAME_EXECUTION_OUTPUT);
224
3/6
✓ Branch 185 → 186 taken 258 times.
✗ Branch 185 → 466 not taken.
✓ Branch 186 → 187 taken 258 times.
✗ Branch 186 → 464 not taken.
✓ Branch 187 → 188 taken 258 times.
✗ Branch 187 → 462 not taken.
258 const bool needsDebuggerRun = TestUtil::doesRefExist(testCase.testPath / REF_NAME_GDB_OUTPUT);
225
3/4
✓ Branch 190 → 191 taken 54 times.
✓ Branch 190 → 192 taken 204 times.
✗ Branch 191 → 192 not taken.
✓ Branch 191 → 198 taken 54 times.
258 if (needsNormalRun || needsDebuggerRun) {
226 // Emit main source file object if not done already
227
1/2
✓ Branch 192 → 193 taken 204 times.
✗ Branch 192 → 194 not taken.
204 if (!objectFilesEmitted)
228
1/2
✓ Branch 193 → 194 taken 204 times.
✗ Branch 193 → 525 not taken.
204 mainSourceFile->runObjectEmitter();
229
230 // Conclude the compilation
231
1/2
✓ Branch 194 → 195 taken 204 times.
✗ Branch 194 → 525 not taken.
204 mainSourceFile->concludeCompilation();
232
233 // Prepare linker
234
1/2
✓ Branch 195 → 196 taken 204 times.
✗ Branch 195 → 468 not taken.
204 resourceManager.linker.outputPath = TestUtil::getDefaultExecutableName();
235
236 // Prepare and run linker
237
1/2
✓ Branch 196 → 197 taken 204 times.
✗ Branch 196 → 525 not taken.
204 resourceManager.linker.prepare();
238
1/2
✓ Branch 197 → 198 taken 204 times.
✗ Branch 197 → 525 not taken.
204 resourceManager.linker.link();
239 }
240
241 // Check type registry output
242
3/6
✓ Branch 200 → 201 taken 258 times.
✗ Branch 200 → 473 not taken.
✓ Branch 201 → 202 taken 258 times.
✗ Branch 201 → 471 not taken.
✓ Branch 202 → 203 taken 258 times.
✗ Branch 202 → 469 not taken.
265 TestUtil::checkRefMatch(testCase.testPath / REF_NAME_TYPE_REGISTRY, [&] { return TypeRegistry::dump(); });
243
244 // Check cache stats output
245
3/6
✓ Branch 209 → 210 taken 258 times.
✗ Branch 209 → 487 not taken.
✓ Branch 210 → 211 taken 258 times.
✗ Branch 210 → 485 not taken.
✓ Branch 211 → 212 taken 258 times.
✗ Branch 211 → 483 not taken.
258 TestUtil::checkRefMatch(testCase.testPath / REF_NAME_CACHE_STATS, [&] {
246
1/2
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 31 not taken.
1 std::stringstream cacheStats;
247
3/6
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 22 not taken.
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 20 not taken.
✓ Branch 5 → 6 taken 1 time.
✗ Branch 5 → 20 not taken.
1 cacheStats << FunctionManager::dumpLookupCacheStatistics() << std::endl;
248
3/6
✓ Branch 7 → 8 taken 1 time.
✗ Branch 7 → 25 not taken.
✓ Branch 8 → 9 taken 1 time.
✗ Branch 8 → 23 not taken.
✓ Branch 9 → 10 taken 1 time.
✗ Branch 9 → 23 not taken.
1 cacheStats << StructManager::dumpLookupCacheStatistics() << std::endl;
249
3/6
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 28 not taken.
✓ Branch 12 → 13 taken 1 time.
✗ Branch 12 → 26 not taken.
✓ Branch 13 → 14 taken 1 time.
✗ Branch 13 → 26 not taken.
1 cacheStats << InterfaceManager::dumpLookupCacheStatistics() << std::endl;
250
1/2
✓ Branch 15 → 16 taken 1 time.
✗ Branch 15 → 29 not taken.
2 return cacheStats.str();
251 1 });
252
253 // Check if the execution output matches the expected output
254
3/6
✓ Branch 218 → 219 taken 258 times.
✗ Branch 218 → 501 not taken.
✓ Branch 219 → 220 taken 258 times.
✗ Branch 219 → 499 not taken.
✓ Branch 220 → 221 taken 258 times.
✗ Branch 220 → 497 not taken.
258 TestUtil::checkRefMatch(testCase.testPath / REF_NAME_EXECUTION_OUTPUT, [&] {
255
2/4
✓ Branch 2 → 3 taken 204 times.
✗ Branch 2 → 65 not taken.
✓ Branch 3 → 4 taken 204 times.
✗ Branch 3 → 63 not taken.
204 const std::filesystem::path cliFlagsFile = testCase.testPath / INPUT_NAME_CLI_FLAGS;
256 // Execute binary
257
1/2
✓ Branch 5 → 6 taken 204 times.
✗ Branch 5 → 110 not taken.
204 std::stringstream cmd;
258
1/2
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 204 times.
204 if (testDriverCliOptions.enableLeakDetection)
259 cmd << "valgrind -q --leak-check=full --num-callers=100 --error-exitcode=1 ";
260
1/2
✓ Branch 8 → 9 taken 204 times.
✗ Branch 8 → 108 not taken.
204 cmd << TestUtil::getDefaultExecutableName();
261
3/4
✓ Branch 9 → 10 taken 204 times.
✗ Branch 9 → 108 not taken.
✓ Branch 10 → 11 taken 2 times.
✓ Branch 10 → 17 taken 202 times.
204 if (exists(cliFlagsFile))
262
4/8
✓ Branch 11 → 12 taken 2 times.
✗ Branch 11 → 108 not taken.
✓ Branch 12 → 13 taken 2 times.
✗ Branch 12 → 68 not taken.
✓ Branch 13 → 14 taken 2 times.
✗ Branch 13 → 66 not taken.
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 66 not taken.
2 cmd << " " << TestUtil::getFileContentLinesVector(cliFlagsFile).at(0);
263
2/4
✓ Branch 17 → 18 taken 204 times.
✗ Branch 17 → 71 not taken.
✓ Branch 18 → 19 taken 204 times.
✗ Branch 18 → 69 not taken.
204 const auto [output, exitCode] = SystemUtil::exec(cmd.str(), true);
264
265 #if not OS_WINDOWS // Windows does not give us the exit code, so we cannot check it on Windows
266 // Check if the exit code matches the expected one
267 // If no exit code ref file exists, check against 0
268
5/8
✓ Branch 22 → 23 taken 204 times.
✗ Branch 22 → 76 not taken.
✓ Branch 23 → 24 taken 204 times.
✗ Branch 23 → 74 not taken.
✓ Branch 24 → 25 taken 204 times.
✗ Branch 24 → 72 not taken.
✓ Branch 29 → 30 taken 4 times.
✓ Branch 29 → 43 taken 200 times.
208 if (TestUtil::checkRefMatch(testCase.testPath / REF_NAME_EXIT_CODE, [&] { return std::to_string(exitCode); })) {
269
2/12
✓ Branch 30 → 31 taken 4 times.
✗ Branch 30 → 86 not taken.
✗ Branch 32 → 33 not taken.
✓ Branch 32 → 41 taken 4 times.
✗ Branch 33 → 34 not taken.
✗ Branch 33 → 92 not taken.
✗ Branch 34 → 35 not taken.
✗ Branch 34 → 90 not taken.
✗ Branch 36 → 37 not taken.
✗ Branch 36 → 89 not taken.
✗ Branch 37 → 38 not taken.
✗ Branch 37 → 87 not taken.
4 EXPECT_NE(0, exitCode) << "Program exited with zero exit code, but expected erroneous exit code";
270 } else {
271
2/12
✓ Branch 43 → 44 taken 200 times.
✗ Branch 43 → 96 not taken.
✗ Branch 45 → 46 not taken.
✓ Branch 45 → 54 taken 200 times.
✗ Branch 46 → 47 not taken.
✗ Branch 46 → 102 not taken.
✗ Branch 47 → 48 not taken.
✗ Branch 47 → 100 not taken.
✗ Branch 49 → 50 not taken.
✗ Branch 49 → 99 not taken.
✗ Branch 50 → 51 not taken.
✗ Branch 50 → 97 not taken.
200 EXPECT_EQ(0, exitCode) << "Program exited with non-zero exit code";
272 }
273 #endif
274
275
1/2
✓ Branch 56 → 57 taken 204 times.
✗ Branch 56 → 106 not taken.
408 return output;
276 204 });
277
278 // Check if the debugger output matches the expected output
279 // GCOV_EXCL_START
280 if (!testDriverCliOptions.isGitHubActions) { // GDB tests are currently not support on GH actions
281 TestUtil::checkRefMatch(
282 testCase.testPath / REF_NAME_GDB_OUTPUT,
283 [&] {
284 // Execute debugger script
285 std::filesystem::path gdbScriptPath = testCase.testPath / CTL_DEBUG_SCRIPT;
286 EXPECT_TRUE(std::filesystem::exists(gdbScriptPath)) << "Debug output requested, but debug script not found";
287 gdbScriptPath.make_preferred();
288 const std::string cmd = "gdb -x " + gdbScriptPath.string() + " " + TestUtil::getDefaultExecutableName();
289 const auto [output, exitCode] = SystemUtil::exec(cmd);
290
291 #if not OS_WINDOWS // Windows does not give us the exit code, so we cannot check it on Windows
292 EXPECT_EQ(0, exitCode) << "GDB exited with non-zero exit code when running debug script";
293 #endif
294
295 return output;
296 },
297 [&](std::string &expectedOutput, std::string &actualOutput) {
298 // Do not compare against the GDB header
299 TestUtil::eraseGDBHeader(expectedOutput);
300 TestUtil::eraseGDBHeader(actualOutput);
301 });
302 }
303 // GCOV_EXCL_STOP
304
4/7
✗ Branch 526 → 527 not taken.
✓ Branch 526 → 528 taken 1 time.
✓ Branch 526 → 531 taken 8 times.
✓ Branch 526 → 534 taken 68 times.
✓ Branch 526 → 537 taken 108 times.
✗ Branch 526 → 540 not taken.
✗ Branch 526 → 543 not taken.
185 } catch (LexerError &error) {
305
1/2
✓ Branch 529 → 530 taken 1 time.
✗ Branch 529 → 546 not taken.
1 TestUtil::handleError(testCase, error);
306
1/2
✓ Branch 530 → 238 taken 1 time.
✗ Branch 530 → 564 not taken.
9 } catch (ParserError &error) {
307
1/2
✓ Branch 532 → 533 taken 8 times.
✗ Branch 532 → 548 not taken.
8 TestUtil::handleError(testCase, error);
308
1/2
✓ Branch 533 → 238 taken 8 times.
✗ Branch 533 → 564 not taken.
76 } catch (SemanticError &error) {
309
1/2
✓ Branch 535 → 536 taken 68 times.
✗ Branch 535 → 550 not taken.
68 TestUtil::handleError(testCase, error);
310
1/2
✓ Branch 536 → 238 taken 68 times.
✗ Branch 536 → 564 not taken.
176 } catch (CompilerError &error) {
311
1/2
✓ Branch 538 → 539 taken 108 times.
✗ Branch 538 → 552 not taken.
108 TestUtil::handleError(testCase, error);
312 108 } catch (LinkerError &error) {
313 TestUtil::handleError(testCase, error);
314 } catch (std::exception &error) { // GCOV_EXCL_LINE
315 TestUtil::handleError(testCase, error); // GCOV_EXCL_LINE
316 } // GCOV_EXCL_LINE
317
318
3/6
✓ Branch 238 → 239 taken 443 times.
✗ Branch 238 → 563 not taken.
✓ Branch 239 → 240 taken 443 times.
✗ Branch 239 → 560 not taken.
✓ Branch 240 → 241 taken 443 times.
✗ Branch 240 → 558 not taken.
443 SUCCEED();
319
6/12
✓ Branch 245 → 246 taken 443 times.
✗ Branch 245 → 247 not taken.
✓ Branch 249 → 250 taken 443 times.
✗ Branch 249 → 251 not taken.
✓ Branch 253 → 254 taken 443 times.
✗ Branch 253 → 255 not taken.
✓ Branch 257 → 258 taken 443 times.
✗ Branch 257 → 259 not taken.
✓ Branch 261 → 262 taken 443 times.
✗ Branch 261 → 263 not taken.
✓ Branch 265 → 266 taken 443 times.
✗ Branch 265 → 268 not taken.
443 }
320
321 class CommonTests : public ::testing::TestWithParam<TestCase> {};
322
6/14
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 51 not taken.
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 43 not taken.
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 41 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 36 not taken.
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 32 not taken.
✓ Branch 18 → 19 taken 1 time.
✗ Branch 18 → 29 not taken.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
21 TEST_P(CommonTests, ) { execTestCase(GetParam()); }
323
4/14
spice::testing::gtest_CommonTests_EvalGenerator_():
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 10 not taken.
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 8 not taken.
spice::testing::gtest_CommonTests_EvalGenerateName_(testing::TestParamInfo<spice::testing::TestCase> const&):
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 12 taken 7 times.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 20 not taken.
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 18 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 16 not taken.
✓ Branch 12 → 13 taken 7 times.
✗ Branch 12 → 24 not taken.
8 INSTANTIATE_TEST_SUITE_P(, CommonTests, ::testing::ValuesIn(TestUtil::collectTestCases("common", false)),
324 TestUtil::NameResolver());
325
326 class LexerTests : public ::testing::TestWithParam<TestCase> {};
327
6/14
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 51 not taken.
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 43 not taken.
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 41 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 36 not taken.
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 32 not taken.
✓ Branch 18 → 19 taken 1 time.
✗ Branch 18 → 29 not taken.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
9 TEST_P(LexerTests, ) { execTestCase(GetParam()); }
328
4/14
spice::testing::gtest_LexerTests_EvalGenerator_():
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 10 not taken.
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 8 not taken.
spice::testing::gtest_LexerTests_EvalGenerateName_(testing::TestParamInfo<spice::testing::TestCase> const&):
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 12 taken 1 time.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 20 not taken.
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 18 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 16 not taken.
✓ Branch 12 → 13 taken 1 time.
✗ Branch 12 → 24 not taken.
2 INSTANTIATE_TEST_SUITE_P(, LexerTests, ::testing::ValuesIn(TestUtil::collectTestCases("lexer", false)), TestUtil::NameResolver());
329
330 class ParserTests : public ::testing::TestWithParam<TestCase> {};
331
6/14
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 51 not taken.
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 43 not taken.
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 41 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 36 not taken.
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 32 not taken.
✓ Branch 18 → 19 taken 1 time.
✗ Branch 18 → 29 not taken.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
23 TEST_P(ParserTests, ) { execTestCase(GetParam()); }
332
4/14
spice::testing::gtest_ParserTests_EvalGenerator_():
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 10 not taken.
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 8 not taken.
spice::testing::gtest_ParserTests_EvalGenerateName_(testing::TestParamInfo<spice::testing::TestCase> const&):
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 12 taken 8 times.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 20 not taken.
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 18 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 16 not taken.
✓ Branch 12 → 13 taken 8 times.
✗ Branch 12 → 24 not taken.
9 INSTANTIATE_TEST_SUITE_P(, ParserTests, ::testing::ValuesIn(TestUtil::collectTestCases("parser", false)),
333 TestUtil::NameResolver());
334
335 class SymbolTableBuilderTests : public ::testing::TestWithParam<TestCase> {};
336
6/14
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 51 not taken.
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 43 not taken.
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 41 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 36 not taken.
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 32 not taken.
✓ Branch 18 → 19 taken 1 time.
✗ Branch 18 → 29 not taken.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
49 TEST_P(SymbolTableBuilderTests, ) { execTestCase(GetParam()); }
337
4/14
spice::testing::gtest_SymbolTableBuilderTests_EvalGenerator_():
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 10 not taken.
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 8 not taken.
spice::testing::gtest_SymbolTableBuilderTests_EvalGenerateName_(testing::TestParamInfo<spice::testing::TestCase> const&):
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 12 taken 21 times.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 20 not taken.
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 18 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 16 not taken.
✓ Branch 12 → 13 taken 21 times.
✗ Branch 12 → 24 not taken.
22 INSTANTIATE_TEST_SUITE_P(, SymbolTableBuilderTests, ::testing::ValuesIn(TestUtil::collectTestCases("symboltablebuilder", true)),
338 TestUtil::NameResolver());
339
340 class TypeCheckerTests : public ::testing::TestWithParam<TestCase> {};
341
6/14
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 51 not taken.
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 43 not taken.
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 41 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 36 not taken.
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 32 not taken.
✓ Branch 18 → 19 taken 1 time.
✗ Branch 18 → 29 not taken.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
377 TEST_P(TypeCheckerTests, ) { execTestCase(GetParam()); }
342
4/14
spice::testing::gtest_TypeCheckerTests_EvalGenerator_():
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 10 not taken.
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 8 not taken.
spice::testing::gtest_TypeCheckerTests_EvalGenerateName_(testing::TestParamInfo<spice::testing::TestCase> const&):
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 12 taken 185 times.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 20 not taken.
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 18 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 16 not taken.
✓ Branch 12 → 13 taken 185 times.
✗ Branch 12 → 24 not taken.
186 INSTANTIATE_TEST_SUITE_P(, TypeCheckerTests, ::testing::ValuesIn(TestUtil::collectTestCases("typechecker", true)),
343 TestUtil::NameResolver());
344
345 class IRGeneratorTests : public ::testing::TestWithParam<TestCase> {};
346
6/14
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 51 not taken.
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 43 not taken.
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 41 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 36 not taken.
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 32 not taken.
✓ Branch 18 → 19 taken 1 time.
✗ Branch 18 → 29 not taken.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
293 TEST_P(IRGeneratorTests, ) { execTestCase(GetParam()); }
347
4/14
spice::testing::gtest_IRGeneratorTests_EvalGenerator_():
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 10 not taken.
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 8 not taken.
spice::testing::gtest_IRGeneratorTests_EvalGenerateName_(testing::TestParamInfo<spice::testing::TestCase> const&):
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 12 taken 143 times.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 20 not taken.
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 18 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 16 not taken.
✓ Branch 12 → 13 taken 143 times.
✗ Branch 12 → 24 not taken.
144 INSTANTIATE_TEST_SUITE_P(, IRGeneratorTests, ::testing::ValuesIn(TestUtil::collectTestCases("irgenerator", true)),
348 TestUtil::NameResolver());
349
350 class StdTests : public ::testing::TestWithParam<TestCase> {};
351
6/14
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 51 not taken.
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 43 not taken.
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 41 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 36 not taken.
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 32 not taken.
✓ Branch 18 → 19 taken 1 time.
✗ Branch 18 → 29 not taken.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
129 TEST_P(StdTests, ) { execTestCase(GetParam()); }
352
4/14
spice::testing::gtest_StdTests_EvalGenerator_():
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 10 not taken.
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 8 not taken.
spice::testing::gtest_StdTests_EvalGenerateName_(testing::TestParamInfo<spice::testing::TestCase> const&):
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 12 taken 61 times.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 20 not taken.
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 18 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 16 not taken.
✓ Branch 12 → 13 taken 61 times.
✗ Branch 12 → 24 not taken.
62 INSTANTIATE_TEST_SUITE_P(, StdTests, ::testing::ValuesIn(TestUtil::collectTestCases("std", true)), TestUtil::NameResolver());
353
354 class BenchmarkTests : public ::testing::TestWithParam<TestCase> {};
355
6/14
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 51 not taken.
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 43 not taken.
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 41 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 36 not taken.
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 32 not taken.
✓ Branch 18 → 19 taken 1 time.
✗ Branch 18 → 29 not taken.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
21 TEST_P(BenchmarkTests, ) { execTestCase(GetParam()); }
356
4/14
spice::testing::gtest_BenchmarkTests_EvalGenerator_():
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 10 not taken.
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 8 not taken.
spice::testing::gtest_BenchmarkTests_EvalGenerateName_(testing::TestParamInfo<spice::testing::TestCase> const&):
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 12 taken 7 times.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 20 not taken.
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 18 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 16 not taken.
✓ Branch 12 → 13 taken 7 times.
✗ Branch 12 → 24 not taken.
8 INSTANTIATE_TEST_SUITE_P(, BenchmarkTests, ::testing::ValuesIn(TestUtil::collectTestCases("benchmark", false)),
357 TestUtil::NameResolver());
358
359 class ExampleTests : public ::testing::TestWithParam<TestCase> {};
360
6/14
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 51 not taken.
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 43 not taken.
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 41 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 36 not taken.
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 32 not taken.
✓ Branch 18 → 19 taken 1 time.
✗ Branch 18 → 29 not taken.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
17 TEST_P(ExampleTests, ) { execTestCase(GetParam()); }
361
4/14
spice::testing::gtest_ExampleTests_EvalGenerator_():
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 10 not taken.
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 8 not taken.
spice::testing::gtest_ExampleTests_EvalGenerateName_(testing::TestParamInfo<spice::testing::TestCase> const&):
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 12 taken 5 times.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 20 not taken.
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 18 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 16 not taken.
✓ Branch 12 → 13 taken 5 times.
✗ Branch 12 → 24 not taken.
6 INSTANTIATE_TEST_SUITE_P(, ExampleTests, ::testing::ValuesIn(TestUtil::collectTestCases("examples", false)),
362 TestUtil::NameResolver());
363
364 class BootstrapCompilerTests : public ::testing::TestWithParam<TestCase> {};
365
6/14
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 51 not taken.
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 43 not taken.
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 41 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 36 not taken.
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 32 not taken.
✓ Branch 18 → 19 taken 1 time.
✗ Branch 18 → 29 not taken.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
21 TEST_P(BootstrapCompilerTests, ) { execTestCase(GetParam()); }
366
4/14
spice::testing::gtest_BootstrapCompilerTests_EvalGenerator_():
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 10 not taken.
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 8 not taken.
spice::testing::gtest_BootstrapCompilerTests_EvalGenerateName_(testing::TestParamInfo<spice::testing::TestCase> const&):
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 12 taken 7 times.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 20 not taken.
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 18 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 16 not taken.
✓ Branch 12 → 13 taken 7 times.
✗ Branch 12 → 24 not taken.
8 INSTANTIATE_TEST_SUITE_P(, BootstrapCompilerTests, ::testing::ValuesIn(TestUtil::collectTestCases("bootstrap-compiler", false)),
367 TestUtil::NameResolver());
368
369 } // namespace spice::testing
370