Skip to content

Commit

Permalink
feat: add check park on Judge
Browse files Browse the repository at this point in the history
Signed-off-by: himself65 <himself6565@gmail.com>
  • Loading branch information
himself65 committed Apr 14, 2019
1 parent 4fa1bc7 commit 02502b8
Show file tree
Hide file tree
Showing 5 changed files with 145 additions and 11 deletions.
73 changes: 67 additions & 6 deletions packages/rrreol-core/src/judge.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,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 +28,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 +92,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,16 +115,67 @@ 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
Array(realFM.lines()).forEach((_, line) => {
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}`)
}
})
return success
}

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

line = (line) => {
return JudgeWrapper.of.call(this, curry(function (val) {
return equals(this.targetFile.line(line), val)
}))
}

lines = () => {
return JudgeWrapper.of.call(this, curry(function (val) {
return this.targetFile.lines() === val
}))
}

maxline = () => {
return JudgeWrapper.of.call(this, curry(function (val) {
return this.targetFile.lines() <= val
}))
}

minline = () => {
return JudgeWrapper.of.call(this, curry((val) => {
return this.targetFile.lines() >= val
}))
}
}

export default Judge
14 changes: 9 additions & 5 deletions packages/rrreol-core/src/judgeWrapper.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,22 @@ export class JudgeWrapper {
return new JudgeWrapper(val, this)
}

constructor (val, target) {
if (isNil(val)) {
constructor (fn, target) {
if (isNil(fn)) {
throw TypeError('val is null')
}
this.__target = target || null
this.__val = val
this.__fn = fn
}

toBe = (val) => {
if ('on' in this.__target) {
this.__target.on('finished', (answer) => {

this.__target.on('finished_compile', () => {
if (!isFunction(this.__fn)) return
const success = this.__fn.call(this.__target, val)
if (!success) {
console.log(`${chalk.red('error')} on ${this.__target.toString()}`)
}
})
} else {
throw new Error('no property \'on\'')
Expand Down
11 changes: 11 additions & 0 deletions packages/rrreol-core/test/unit/index.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
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.JudgeWrapper).toBeDefined()
expect(rrreol.Runner).toBeDefined()
})
})
52 changes: 52 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,55 @@ 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 get the correct line content', (done) => {
judge.in(1).loadContent('1\n2\n3')
judge.out(1).loadContent('4\n5\n6')
judge.line(1).toBe('1')
judge.line(2).toBe('2')
judge.line(3).toBe('3')
// judge.exec()
// todo
// judge.once('judge_done', (state) => {
// expect(state).toBe(true)
// done()
// })
judge.emit('finish_compile')
})

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

it('should get the correct max/min line content', () => {
judge.in(1).loadContent('1\n2\n3')
judge.out(1).loadContent('4\n5\n6')
judge.lines().toBe(3)
judge.maxline().toBe(4)
judge.minline().toBe(1)
// judge.exec()
judge.emit('finished')
})
})
6 changes: 6 additions & 0 deletions packages/rrreol-core/test/unit/judgeWrapper.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,10 @@ describe('JudgeWrapper base test', () => {
expect(judgeWrapper.toBe('1')).toBe(target)
expect(judgeWrapper.toBe(1)).toBe(target)
})

it('should throw error', () => {
const target = {}
const judgeWrapper = new JudgeWrapper(1, target)
expect(() => judgeWrapper.toBe(1)).toThrowError()
})
})

0 comments on commit 02502b8

Please sign in to comment.