Skip to content

Commit d7f6ce2

Browse files
mehdi.cheracher@gmail.comchermehdi
authored andcommitted
wip: add python judge
1 parent ff6171b commit d7f6ce2

File tree

1 file changed

+70
-6
lines changed

1 file changed

+70
-6
lines changed

commands/run.go

+70-6
Original file line numberDiff line numberDiff line change
@@ -362,19 +362,83 @@ func (judge *CppJudge) Cleanup() error {
362362
// Python Judge
363363
//
364364
type PythonJudge struct {
365-
Meta config.EgorMeta
365+
Meta config.EgorMeta
366+
CurrentWorkDir string
367+
Checker Checker
366368
}
367369

368370
func (judge *PythonJudge) Setup() error {
369-
panic("implement me")
371+
// No setup required for python
372+
return nil
370373
}
371374

372-
func (judge *PythonJudge) RunTestCase(CaseDescription) CaseStatus {
373-
panic("implement me")
375+
func (judge *PythonJudge) RunTestCase(desc CaseDescription) CaseStatus {
376+
cmd := exec.Command("python3", "main.py")
377+
cmd.Dir = judge.CurrentWorkDir
378+
inputFile, err := os.Open(desc.InputFile)
379+
if err != nil {
380+
return CaseStatus{
381+
Status: RE,
382+
CheckerError: nil,
383+
}
384+
}
385+
defer inputFile.Close()
386+
387+
outputFile, err := os.OpenFile(desc.WorkFile, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0777)
388+
if err != nil {
389+
return CaseStatus{
390+
Status: RE,
391+
CheckerError: nil,
392+
}
393+
}
394+
defer outputFile.Close()
395+
396+
var stderrBuffer bytes.Buffer
397+
cmd.Stdin = inputFile
398+
cmd.Stdout = outputFile
399+
cmd.Stderr = &stderrBuffer
400+
if err = cmd.Run(); err != nil {
401+
return CaseStatus{
402+
Status: RE,
403+
CheckerError: nil,
404+
Stderr: stderrBuffer.String(),
405+
}
406+
407+
}
408+
409+
expectedOutput, err := ioutil.ReadFile(desc.OutputFile)
410+
if err != nil {
411+
return CaseStatus{
412+
Status: RE,
413+
CheckerError: nil,
414+
}
415+
}
416+
output, err := ioutil.ReadFile(desc.WorkFile)
417+
418+
if err != nil {
419+
return CaseStatus{
420+
Status: RE,
421+
CheckerError: nil,
422+
}
423+
}
424+
err = judge.Checker.Check(string(output), string(expectedOutput))
425+
if err != nil {
426+
return CaseStatus{
427+
Status: WA,
428+
CheckerError: err,
429+
Stderr: stderrBuffer.String(),
430+
}
431+
}
432+
return CaseStatus{
433+
Status: AC,
434+
CheckerError: nil,
435+
Stderr: stderrBuffer.String(),
436+
}
374437
}
375438

376439
func (judge *PythonJudge) Cleanup() error {
377-
panic("implement me")
440+
// No cleanup required for python
441+
return nil
378442
}
379443

380444
// Creates and returns a Judge implementation corresponding to the given language
@@ -387,7 +451,7 @@ func NewJudgeFor(meta config.EgorMeta) (Judge, error) {
387451
case "c":
388452
return &CppJudge{Meta: meta, Checker: &DiffChecker{}}, nil
389453
case "python":
390-
return &PythonJudge{Meta: meta}, nil
454+
return &PythonJudge{Meta: meta, Checker: &DiffChecker{}}, nil
391455
}
392456
return nil, errors.New(fmt.Sprintf("Cannot find judge for the given lang %s", meta.TaskLang))
393457
}

0 commit comments

Comments
 (0)