Skip to content

Commit ff6171b

Browse files
mehdi.cheracher@gmail.comchermehdi
authored andcommitted
wip: add cpp judge
1 parent 147ff1d commit ff6171b

File tree

1 file changed

+87
-6
lines changed

1 file changed

+87
-6
lines changed

commands/run.go

+87-6
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ func (judge *JavaJudge) Setup() error {
184184
fmt.Printf("javac %s -d \"%s\"\n", judge.Meta.TaskFile, workDirPath)
185185
cmd.Stderr = &stderrBuffer
186186
if err = cmd.Run(); err != nil {
187-
color.Red("Could not compile %s, Cause: \n", stderrBuffer.String())
187+
color.Red("Could not compile, Cause: \n%s", stderrBuffer.String())
188188
return err
189189
}
190190
judge.CurrentWorkDir = workDirPath
@@ -264,18 +264,98 @@ func (judge *JavaJudge) Cleanup() error {
264264
// C / Cpp Judge
265265
//
266266
type CppJudge struct {
267-
Meta config.EgorMeta
267+
Meta config.EgorMeta
268+
CurrentWorkDir string
269+
Checker Checker
268270
}
269271

270272
func (judge *CppJudge) Setup() error {
273+
currentDir, err := os.Getwd()
274+
if err != nil {
275+
return err
276+
}
277+
workDirPath := path.Join(currentDir, "work")
278+
if err = os.Mkdir(workDirPath, 0777); err != nil {
279+
return err
280+
}
281+
var stderrBuffer bytes.Buffer
282+
cmd := exec.Command("g++", judge.Meta.TaskFile, "-o", "work/sol")
283+
cmd.Dir = currentDir
284+
cmd.Stderr = &stderrBuffer
285+
if err = cmd.Run(); err != nil {
286+
color.Red("Could not compile, Cause: \n%s", stderrBuffer.String())
287+
return err
288+
}
289+
judge.CurrentWorkDir = workDirPath
271290
return nil
272291
}
273292

274-
func (judge *CppJudge) RunTestCase(description CaseDescription) CaseStatus {
275-
return CaseStatus{}
293+
func (judge *CppJudge) RunTestCase(desc CaseDescription) CaseStatus {
294+
// We suppose that all java executables will be called Main
295+
cmd := exec.Command("./sol")
296+
cmd.Dir = judge.CurrentWorkDir
297+
inputFile, err := os.Open(desc.InputFile)
298+
if err != nil {
299+
return CaseStatus{
300+
Status: RE,
301+
CheckerError: nil,
302+
}
303+
}
304+
defer inputFile.Close()
305+
306+
outputFile, err := os.OpenFile(desc.WorkFile, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0777)
307+
if err != nil {
308+
return CaseStatus{
309+
Status: RE,
310+
CheckerError: nil,
311+
}
312+
}
313+
defer outputFile.Close()
314+
315+
var stderrBuffer bytes.Buffer
316+
cmd.Stdin = inputFile
317+
cmd.Stdout = outputFile
318+
cmd.Stderr = &stderrBuffer
319+
if err = cmd.Run(); err != nil {
320+
return CaseStatus{
321+
Status: RE,
322+
CheckerError: nil,
323+
Stderr: stderrBuffer.String(),
324+
}
325+
326+
}
327+
328+
expectedOutput, err := ioutil.ReadFile(desc.OutputFile)
329+
if err != nil {
330+
return CaseStatus{
331+
Status: RE,
332+
CheckerError: nil,
333+
}
334+
}
335+
output, err := ioutil.ReadFile(desc.WorkFile)
336+
337+
if err != nil {
338+
return CaseStatus{
339+
Status: RE,
340+
CheckerError: nil,
341+
}
342+
}
343+
err = judge.Checker.Check(string(output), string(expectedOutput))
344+
if err != nil {
345+
return CaseStatus{
346+
Status: WA,
347+
CheckerError: err,
348+
Stderr: stderrBuffer.String(),
349+
}
350+
}
351+
return CaseStatus{
352+
Status: AC,
353+
CheckerError: nil,
354+
Stderr: stderrBuffer.String(),
355+
}
276356
}
277357
func (judge *CppJudge) Cleanup() error {
278-
return nil
358+
return os.RemoveAll(judge.CurrentWorkDir)
279359
}
280360

281361
//
@@ -303,8 +383,9 @@ func NewJudgeFor(meta config.EgorMeta) (Judge, error) {
303383
case "java":
304384
return &JavaJudge{Meta: meta, Checker: &DiffChecker{}}, nil
305385
case "cpp":
386+
return &CppJudge{Meta: meta, Checker: &DiffChecker{}}, nil
306387
case "c":
307-
return &CppJudge{Meta: meta}, nil
388+
return &CppJudge{Meta: meta, Checker: &DiffChecker{}}, nil
308389
case "python":
309390
return &PythonJudge{Meta: meta}, nil
310391
}

0 commit comments

Comments
 (0)