@@ -184,7 +184,7 @@ func (judge *JavaJudge) Setup() error {
184
184
fmt .Printf ("javac %s -d \" %s\" \n " , judge .Meta .TaskFile , workDirPath )
185
185
cmd .Stderr = & stderrBuffer
186
186
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 ())
188
188
return err
189
189
}
190
190
judge .CurrentWorkDir = workDirPath
@@ -264,18 +264,98 @@ func (judge *JavaJudge) Cleanup() error {
264
264
// C / Cpp Judge
265
265
//
266
266
type CppJudge struct {
267
- Meta config.EgorMeta
267
+ Meta config.EgorMeta
268
+ CurrentWorkDir string
269
+ Checker Checker
268
270
}
269
271
270
272
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
271
290
return nil
272
291
}
273
292
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
+ }
276
356
}
277
357
func (judge * CppJudge ) Cleanup () error {
278
- return nil
358
+ return os . RemoveAll ( judge . CurrentWorkDir )
279
359
}
280
360
281
361
//
@@ -303,8 +383,9 @@ func NewJudgeFor(meta config.EgorMeta) (Judge, error) {
303
383
case "java" :
304
384
return & JavaJudge {Meta : meta , Checker : & DiffChecker {}}, nil
305
385
case "cpp" :
386
+ return & CppJudge {Meta : meta , Checker : & DiffChecker {}}, nil
306
387
case "c" :
307
- return & CppJudge {Meta : meta }, nil
388
+ return & CppJudge {Meta : meta , Checker : & DiffChecker {} }, nil
308
389
case "python" :
309
390
return & PythonJudge {Meta : meta }, nil
310
391
}
0 commit comments