Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add check park on Judge #116

Merged
merged 1 commit into from
Apr 20, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions packages/rrreol-core/src/index.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
import { Compiler } from './compiler'
import { FileManager } from './fileManager'
import { Judge } from './judge'
import { JudgeWrapper } from './judgeWrapper'
import { Runner } from './runner'

export {
Compiler,
FileManager,
Judge,
JudgeWrapper,
Runner
}

Expand Down
58 changes: 49 additions & 9 deletions packages/rrreol-core/src/judge.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
import { existsSync } from 'fs'
import chalk from 'chalk'
import { dirname, resolve, basename } from 'path'
import isNumber from 'is-number'
import { isString, isNil } from 'lodash'
import { curry, equals, propEq, findIndex } from 'ramda'
import { EventEmitter } from 'events'
import { FileManager } from './fileManager'
import { JudgeWrapper } from './judgeWrapper'
import { Runner } from './runner'
import { Compiler } from './compiler'
import { renameSuffix } from './utils'
Expand All @@ -17,7 +14,8 @@ export class Judge extends EventEmitter {
const {
input = [],
output = [],
file = isString(props) ? props : null
file = isString(props) ? props : null,
ignoreEndEnter = true
} = props

this.__outputs = output.map((val) => {
Expand All @@ -27,13 +25,21 @@ export class Judge extends EventEmitter {
return new FileManager(val)
})
this.__answer = []
this.__config = Object.assign({
ignoreEndEnter: true // if ignore the `\n` at the line end
}, {
ignoreEndEnter
})

this.__task = []

this.__path = file || null
this.__target = 0

this.on('start', this.exec)
this.on('finished', () => {
this.on('finish_compile', () => {
// todo
console.log(chalk.greenBright('finished'))
})
}

Expand Down Expand Up @@ -83,9 +89,10 @@ export class Judge extends EventEmitter {
if (isNil(this.__outputs[this.__target])) {
console.log(chalk.red('error') + 'target file is empty')
} else if (isString(val)) {
// todo
findIndex(propEq('name', val))(this.__outputs)
}
this.__target = val
this.__target = val - 1
return this
}

Expand All @@ -105,15 +112,48 @@ export class Judge extends EventEmitter {
const path = await Compiler.compile(this.__path, outputPath)
console.log(`${chalk.yellowBright('Compiled')} file`)
const runner = new Runner(path)

let index = 0
for await (const input of this.__inputs) {
const res = await runner.execUnsafe(input)
const fm = FileManager.of().loadContent(res)
this.__answer.push(fm)
this.emit('finished', fm)
const fileManager = FileManager.of().loadContent(res)
this.__answer.push(fileManager)
// check output
const success = this.compareFileManager(fileManager, this.out(index + 1))
if (!success) {
console.log(`${chalk.red('error on file')} ${index + 1}`)
}

++index
}
return this
}

compareFileManager = (realFM, expectedFM) => {
if (!(realFM instanceof FileManager) ||
!(expectedFM instanceof FileManager)) {
throw new TypeError()
}
let success = true
Object.keys(Array(realFM.lines()).fill(null)).forEach((_, line) => {
console.log(`judging line ${line + 1}`)
const realLine = realFM.line(++line)
const expectedLine = expectedFM.line(line)
const same = equals(realLine, expectedLine)
if (!same) {
success = false
// todo: support log column
console.log(`${chalk.red('wrong answer:')} On line ${line}, read ${realLine} expected ${expectedLine}`)
}
})
if (success) {
console.log(`${chalk.greenBright('success')} compare`)
} else {
console.log(`${chalk.yellowBright('finished')} compare`)
}
return success
}

run = () => this.emit('start')
}

Expand Down
31 changes: 0 additions & 31 deletions packages/rrreol-core/src/judgeWrapper.js

This file was deleted.

10 changes: 10 additions & 0 deletions packages/rrreol-core/test/unit/index.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import * as rrreol from '@/'

describe('index test', () => {
it('should have content', () => {
expect(rrreol.Compiler).toBeDefined()
expect(rrreol.FileManager).toBeDefined()
expect(rrreol.Judge).toBeDefined()
expect(rrreol.Runner).toBeDefined()
})
})
35 changes: 35 additions & 0 deletions packages/rrreol-core/test/unit/judge.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ describe('Judge base test', () => {
judge = new Judge()
})

it('should have correct props', () => {
expect(judge.__config.ignoreEndEnter).toBe(true)
})

it('should throw error when invoke get method', () => {
expect(() => {
judge.targetFile = 1
Expand Down Expand Up @@ -64,7 +68,38 @@ describe('Judge check test', () => {
expect(judge.answer(1).content).toEqual('1 2')
})

it('should emit check running success', () => {
const fm1 = FileManager.of().loadContent('1\n2\n')
const fm2 = FileManager.of().loadContent('1\n2\n')
judge.rawListeners('check')
.map(f => f(fm1, fm2))
.every(v => expect(v).toBeTruthy())
})

afterAll(() => {
removeFiles(fixturesPath, /\.test\.out$/)
})
})

describe('Judge check park', () => {
let judge = null
beforeEach(() => {
judge = new Judge()
})

it('should compare success', () => {
const success = judge.compareFileManager(
FileManager.of().loadContent('1'),
FileManager.of().loadContent('1')
)
expect(success).toBe(true)
})

it('should compare fail', () => {
const fail = judge.compareFileManager(
FileManager.of().loadContent('1'),
FileManager.of().loadContent('2')
)
expect(fail).toBe(false)
})
})
16 changes: 0 additions & 16 deletions packages/rrreol-core/test/unit/judgeWrapper.test.js

This file was deleted.