Verdict executeOnTestCase(string testCaseName) { string testCaseInputFilename = generator->getTestCasesDir() + "/" + testCaseName + ".in"; os->limitExecutionTime(generator->getTimeLimit()); os->limitExecutionMemory(generator->getMemoryLimit()); ExecutionResult result = os->execute(testCaseName + "-submission-evaluation", submissionCommand, testCaseInputFilename, "_submission.out", "_error.out"); os->limitExecutionTime(0); os->limitExecutionMemory(0); if (result.exitStatus == 0) { return Verdict::unknown(); } vector<Failure> failures; if (result.exitStatus & (1<<7)) { int signal = WTERMSIG(result.exitStatus); if (signal == SIGXCPU) { return Verdict::timeLimitExceeded(); } failures.push_back(Failure("Execution of submission failed:", 0)); failures.push_back(Failure(string(strsignal(signal)), 1)); } else { failures.push_back(Failure("Execution of submission failed:", 0)); failures.push_back(Failure("Exit code: " + Util::toString(result.exitStatus), 1)); failures.push_back(Failure("Standard error: " + string(istreambuf_iterator<char>(*result.errorStream), istreambuf_iterator<char>()), 1)); } return Verdict::runtimeError(failures); }
Verdict scoreOnTestCase(string testCaseName) { string testCaseOutputFilename = generator->getTestCasesDir() + "/" + testCaseName + ".out"; string diffCommand = "diff --unchanged-line-format=' %.2dn %L' --old-line-format='(expected) [line %.2dn] %L' --new-line-format='(received) [line %.2dn] %L' " + testCaseOutputFilename + " _submission.out | head -n 10"; ExecutionResult result = os->execute(testCaseName + "-submission-scoring", diffCommand, "", "_diff.out", ""); string briefDiffCommand = "diff --brief _submission.out " + testCaseOutputFilename; ExecutionResult briefResult = os->execute(testCaseName + "-submission-scoring-brief", briefDiffCommand, "", "", ""); if (briefResult.exitStatus == 0) { return Verdict::accepted(); } else { string diff = string(istreambuf_iterator<char>(*result.outputStream), istreambuf_iterator<char>()); return Verdict::wrongAnswer({ Failure("Diff:\n" + diff, 0) }); } }
EvaluationResult evaluate( const string& inputFilename, const string& outputFilename, const EvaluatorConfig& config) { ExecutionRequestBuilder request = ExecutionRequestBuilder() .setCommand(config.solutionCommand()) .setInputFilename(inputFilename) .setOutputFilename(outputFilename) .setErrorFilename("_error.out"); if (config.timeLimit()) { request.setTimeLimit(config.timeLimit().value()); } if (config.memoryLimit()) { request.setMemoryLimit(config.memoryLimit().value()); } ExecutionResult executionResult = os_->execute(request.build()); return createResult(executionResult); }