@@ -362,19 +362,83 @@ func (judge *CppJudge) Cleanup() error {
362
362
// Python Judge
363
363
//
364
364
type PythonJudge struct {
365
- Meta config.EgorMeta
365
+ Meta config.EgorMeta
366
+ CurrentWorkDir string
367
+ Checker Checker
366
368
}
367
369
368
370
func (judge * PythonJudge ) Setup () error {
369
- panic ("implement me" )
371
+ // No setup required for python
372
+ return nil
370
373
}
371
374
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
+ }
374
437
}
375
438
376
439
func (judge * PythonJudge ) Cleanup () error {
377
- panic ("implement me" )
440
+ // No cleanup required for python
441
+ return nil
378
442
}
379
443
380
444
// Creates and returns a Judge implementation corresponding to the given language
@@ -387,7 +451,7 @@ func NewJudgeFor(meta config.EgorMeta) (Judge, error) {
387
451
case "c" :
388
452
return & CppJudge {Meta : meta , Checker : & DiffChecker {}}, nil
389
453
case "python" :
390
- return & PythonJudge {Meta : meta }, nil
454
+ return & PythonJudge {Meta : meta , Checker : & DiffChecker {} }, nil
391
455
}
392
456
return nil , errors .New (fmt .Sprintf ("Cannot find judge for the given lang %s" , meta .TaskLang ))
393
457
}
0 commit comments