UNPKG

1.68 kBJavaScriptView Raw
1const path = require('path')
2
3let exercise = require('workshopper-exercise')()
4const filecheck = require('workshopper-exercise/filecheck')
5
6const { readableStream } = require('./utils')
7const stdinProcessor = require('./stdinProcessor')
8const solutionSetup = require('./solutionSetup')
9
10exercise = solutionSetup(exercise)
11
12exercise = filecheck(exercise)
13
14exercise.addSetup(function (mode, callback) {
15 this.submissionFn = require(path.resolve(this.args[0]))
16
17 if (typeof this.submissionFn !== 'function') {
18 this.emit('fail', this.__('fail.invalid_export'))
19 }
20 this.solutionFn = require(this.solution)
21
22 process.nextTick(callback)
23})
24
25exercise.addProcessor(function (mode, callback) {
26 if (this.execArgs) {
27 this.submissionChild = this.submissionFn(process.execPath, this.execArgs)
28 } else {
29 this.submissionChild = this.submissionFn(this.submissionArgs)
30 }
31 this.submissionStdout = this.submissionChild
32 this.submissionChild.stdin = this.submissionChild
33
34 // We need a readable stream for `submissionChild.stderr`, since is piped to
35 // `process.stderr` later by comparestdout
36 // https://github.com/workshopper/workshopper-exercise/blob/master/comparestdout.js#L37
37 this.submissionChild.stderr = readableStream()
38
39 if (mode === 'verify') {
40 if (this.execArgs) {
41 this.solutionChild = this.solutionFn(process.execPath, this.execArgs)
42 } else {
43 this.solutionChild = this.solutionFn(this.solutionArgs)
44 }
45 this.solutionStdout = this.solutionChild
46 this.solutionChild.stdin = this.solutionChild
47 }
48
49 process.nextTick(function () {
50 callback(null, true)
51 })
52})
53
54exercise = stdinProcessor(exercise)
55
56module.exports = exercise