| 212 | } |
| 213 | |
| 214 | inline TestResult runTest(const Test& test, DevicePool& devicePool) |
| 215 | { |
| 216 | if (!test.skipMessage.empty()) |
| 217 | return {TestResult::Status::Skipped, {test.skipMessage}}; |
| 218 | |
| 219 | TestResult result{TestResult::Status::Passed}; |
| 220 | |
| 221 | auto startTime = std::chrono::steady_clock::now(); |
| 222 | |
| 223 | try |
| 224 | { |
| 225 | if (test.cpuFunc) |
| 226 | { |
| 227 | CPUUnitTestContext cpuCtx; |
| 228 | test.cpuFunc(cpuCtx); |
| 229 | result.messages = cpuCtx.getFailureMessages(); |
| 230 | } |
| 231 | else if (test.gpuFunc) |
| 232 | { |
| 233 | ref<Device> pDevice; |
| 234 | pDevice = devicePool.acquireDevice(test.deviceType); |
| 235 | |
| 236 | { |
| 237 | GPUUnitTestContext gpuCtx(pDevice); |
| 238 | test.gpuFunc(gpuCtx); |
| 239 | result.messages = gpuCtx.getFailureMessages(); |
| 240 | } |
| 241 | |
| 242 | pDevice->endFrame(); |
| 243 | pDevice->wait(); |
| 244 | devicePool.releaseDevice(std::move(pDevice)); |
| 245 | } |
| 246 | } |
| 247 | catch (const SkippingTestException& e) |
| 248 | { |
| 249 | result.status = TestResult::Status::Skipped; |
| 250 | result.extraMessage = e.what(); |
| 251 | } |
| 252 | catch (const ErrorRunningTestException& e) |
| 253 | { |
| 254 | result.status = TestResult::Status::Failed; |
| 255 | result.extraMessage = e.what(); |
| 256 | } |
| 257 | catch (const AssertingTestException& e) |
| 258 | { |
| 259 | result.status = TestResult::Status::Failed; |
| 260 | result.extraMessage = e.what(); |
| 261 | } |
| 262 | catch (const TooManyFailedTestsException&) |
| 263 | { |
| 264 | result.status = TestResult::Status::Failed; |
| 265 | result.extraMessage = "Gave up after " + std::to_string(kMaxTestFailures) + " failures."; |
| 266 | } |
| 267 | catch (const std::exception& e) |
| 268 | { |
| 269 | result.status = TestResult::Status::Failed; |
| 270 | result.extraMessage = e.what(); |
| 271 | } |
no test coverage detected