RunJudge 执行评测
()
| 119 | |
| 120 | // RunJudge 执行评测 |
| 121 | func (session *JudgeSession) RunJudge() commonStructs.JudgeResult { |
| 122 | session.Logger.Info("Start Judgement") |
| 123 | |
| 124 | // make judge result |
| 125 | judgeResult := commonStructs.JudgeResult{} |
| 126 | judgeResult.SessionID = session.SessionID |
| 127 | |
| 128 | // compile code |
| 129 | err := session.compileTargetProgram(&judgeResult) |
| 130 | if err != nil { |
| 131 | judgeResult.JudgeLogs = session.Logger.GetLogs() |
| 132 | return judgeResult |
| 133 | } |
| 134 | |
| 135 | if session.JudgeConfig.SpecialJudge.Mode > 0 { |
| 136 | // 如果需要特殊评测,则编译相关代码 |
| 137 | err := session.compileJudgerProgram(&judgeResult) |
| 138 | if err != nil { |
| 139 | judgeResult.JudgeResult = constants.JudgeFlagSE |
| 140 | judgeResult.SeInfo = err.Error() |
| 141 | judgeResult.JudgeLogs = session.Logger.GetLogs() |
| 142 | return judgeResult |
| 143 | } |
| 144 | } |
| 145 | |
| 146 | // 资源限制信息更新 |
| 147 | updateLimitation(session) |
| 148 | |
| 149 | session.Logger.Info("Ready for judgement") |
| 150 | // Init exit code |
| 151 | exitCodes := make([]int, 0, 1) |
| 152 | for i := 0; i < len(session.JudgeConfig.TestCases); i++ { |
| 153 | if session.JudgeConfig.TestCases[i].Handle == "" { |
| 154 | session.JudgeConfig.TestCases[i].Handle = strconv.Itoa(i) |
| 155 | } |
| 156 | id := session.JudgeConfig.TestCases[i].Handle |
| 157 | |
| 158 | tcResult := session.runOneCase(&session.JudgeConfig, session.JudgeConfig.TestCases[i], id) |
| 159 | |
| 160 | flagName, ok := constants.FlagMeansMap[tcResult.JudgeResult] |
| 161 | if !ok { |
| 162 | flagName = "Unknown" |
| 163 | } |
| 164 | session.Logger.Infof("This case's result is " + flagName) |
| 165 | |
| 166 | isFault := session.isDisastrousFault(&judgeResult, tcResult) |
| 167 | judgeResult.TestCases = append(judgeResult.TestCases, *tcResult) |
| 168 | judgeResult.MemoryUsed = Max32(tcResult.MemoryUsed, judgeResult.MemoryUsed) |
| 169 | judgeResult.TimeUsed = Max32(tcResult.TimeUsed, judgeResult.TimeUsed) |
| 170 | // 这里使用动态增加的方式是为了保证len(exitCodes)<=len(testCases) |
| 171 | // 方便计算最终结果的时候判定测试数据是否全部跑完 |
| 172 | exitCodes = append(exitCodes, tcResult.JudgeResult) |
| 173 | |
| 174 | // 如果发生灾难性错误,直接退出 |
| 175 | if isFault { |
| 176 | break |
| 177 | } |
| 178 |
no test coverage detected