UNPKG

mdexam

Version:

Exam questions/answers/checkers written in markdown

288 lines (254 loc) 6.63 kB
/** * Created by haomo on 17/2/11. */ "use strict"; const fs = require('fs'); const path = require('path'); const mdexam = require('../lib/mdexam'); //获取测试试卷 const testPaper= require('./oPaper.json'); // require(./testPaper.json); const originPaper= require('./tPaper.json'); let md = mdexam(); test('测试将选择题转换成JSON', () => { var mdq = "\ ## [选择题] 题目内容\ \n\ #### [标签]\ * 标签1\ * 标签2\ \n\ #### [选项] \ * 选项1\ * 选项2\ * 选项3\ \n\ #### [答案]\ * 选项1\ * 选项2"; var qj = md.convertMdQ2J(mdq); // console.log(qj); expect(qj.type).toBe('multiple-choice'); expect(qj.question).toBe('题目内容'); expect(qj.tags.indexOf('标签1')).toBeGreaterThanOrEqual(0); expect(qj.tags.indexOf('标签2')).toBeGreaterThanOrEqual(0); expect(qj.options.indexOf('选项1')).toBeGreaterThanOrEqual(0); expect(qj.options.indexOf('选项2')).toBeGreaterThanOrEqual(0); expect(qj.options.indexOf('选项3')).toBeGreaterThanOrEqual(0); expect(qj.answer.indexOf('选项1')).toBeGreaterThanOrEqual(0); expect(qj.answer.indexOf('选项2')).toBeGreaterThanOrEqual(0); }); test('测试将填空题转换成JSON', () => { var mdq = "## [填空题] 题目内容\n\ #### [标签]\n\ * 标签11\n\ * 标签12\n\ \n\ #### [答案]\n\ * 正确答案或者用户的回答\n\ \ #### [验证]\n\ * [answer-regex] /\\*\\s\\[answer-regex\\]\\s{0,}(\\S+)/g"; var qj = md.convertFillIn2J(mdq); expect(qj.type).toBe("fill-in"); expect(qj.question).toBe('题目内容'); expect(qj.answer).toBe('正确答案或者用户的回答'); expect(qj.tags.indexOf('标签11')).toBeGreaterThanOrEqual(0); expect(qj.tags.indexOf('标签12')).toBeGreaterThanOrEqual(0); expect(qj.checker.length).toBe(1); expect(qj.checker[0]['answer-regex']).toBe('/\\*\\s\\[answer-regex\\]\\s{0,}(\\S+)/g'); }); test('测试将命令题转换成JSON', () => { var mdq = "## [命令题] 题目内容\n\ #### [标签]\n\ * 标签11\n\ * 标签12\n\ \n\ #### [答案]\n\ * 正确答案或者用户的回答\n\ \ #### [验证]\n\ * [answer-regex] /\\*\\s\\[answer-regex\\]\\s{0,}(\\S+)/g\n\ * [output-regex] /\\*\\s\\[output-regex\\]\\s{0,}(\\S+)/g"; var qj = md.convertCmd2J(mdq); expect(qj.type).toBe("cmd-fill-in"); expect(qj.question).toBe('题目内容'); expect(qj.answer).toBe('正确答案或者用户的回答'); expect(qj.tags.indexOf('标签11')).toBeGreaterThanOrEqual(0); expect(qj.tags.indexOf('标签12')).toBeGreaterThanOrEqual(0); expect(qj.checker.length).toBe(2); expect(qj.checker[0]['answer-regex']).toBe('/\\*\\s\\[answer-regex\\]\\s{0,}(\\S+)/g'); expect(qj.checker[1]['output-regex']).toBe('/\\*\\s\\[output-regex\\]\\s{0,}(\\S+)/g'); }); test('测试解析整个markdown文件', () => { var markdown = fs.readFileSync(__dirname + '/exam.md', {flag: 'r+', encoding: 'utf8'}); var qj = md.m2j(markdown); console.log(qj); expect(qj.title).toBe('试题名称'); expect(qj.author).toBe('胡小根'); expect(qj.email).toBe('hxg@haomo-studio.com'); expect(qj.version).toBe('v1.0.0'); expect(qj.tags.indexOf('标签1')).toBeGreaterThanOrEqual(0); expect(qj.tags.indexOf('标签2')).toBeGreaterThanOrEqual(0); expect(qj.tags.indexOf('标签3')).toBeGreaterThanOrEqual(0); }); test('测试自动评价选择题', () => { var originQj = { "type": "multiple-choice", "question": "题目内容", "tags": [ "标签11", "标签12" ], "options": [ "A", "B", "C" ], "answer": [ "A", "B" ] }; var testQj1 = { "type": "multiple-choice", "question": "题目内容", "tags": [ "标签11", "标签12" ], "options": [ "A", "B", "C" ], "answer": [ "A", "B" ] }; var testQj2 = { "type": "multiple-choice", "question": "题目内容", "tags": [ "标签11", "标签12" ], "options": [ "A", "B", "C" ], "answer": [ "A" ] }; var testQj3 = { "type": "multiple-choice", "question": "题目内容", "tags": [ "标签11", "标签12" ], "options": [ "A", "B", "C" ], "answer": [ "A", "C" ] }; expect(md.checkChoice(originQj, testQj1)).toBe(true); expect(md.checkChoice(originQj, testQj2)).toBe(false); expect(md.checkChoice(originQj, testQj3)).toBe(false); }); test('测试自动评价填空题', () => { var originQj = { "type": "fill-in", "question": "1 + 1 = ?", "answer": "2", "tags": [ "标签11", "标签12" ], "checker": [ { "answer-regex": "/^2$/" } ] }; var testQj1 = { "type": "fill-in", "question": "题目内容", "answer": "2", "tags": [ "标签11", "标签12" ] }; var testQj2 = { "type": "fill-in", "question": "题目内容", "answer": "3", "tags": [ "标签11", "标签12" ] }; expect(md.checkFillIn(originQj, testQj1)).toBe(true); expect(md.checkFillIn(originQj, testQj2)).toBe(false); }); test('测试自动评价命令题', () => { var originQj = { "type": "cmd-fill-in", "question": "请用一行命令杀死所有包含进程中包含字符串node的命令", "answer": "kill -9 `ps -ef|grep node|awk '{print $2}'`", "tags": [ "标签11", "标签12" ], "checker": [ { "answer-regex": "/grep/" }, { "output-regex": "/abc/g" } ] }; var testQj1 = { "type": "cmd-fill-in", "question": "请用一行命令杀死所有包含进程中包含字符串node的命令", "answer": "kill -9 `ps -ef|grep node|awk '{print $2}'`", "tags": [ "标签11", "标签12" ] }; var testQj2 = { "type": "cmd-fill-in", "question": "请用一行命令杀死所有包含进程中包含字符串node的命令", "answer": "kill -9 `ps -ef|awk '{print $2}'`", "tags": [ "标签11", "标签12" ] }; var testQj3 = { "type": "cmd-fill-in", "question": "请用一行命令杀死所有包含进程中包含字符串node的命令", "answer": "我不知道", "tags": [ "标签11", "标签12" ] }; expect(md.checkCmdFillIn(originQj, testQj1)).toBe(true); expect(md.checkCmdFillIn(originQj, testQj2)).toBe(false); expect(md.checkCmdFillIn(originQj, testQj3)).toBe(false); }); test('测试试卷', () => { expect(md.jsonCheck(originPaper,testPaper)).toBe(true); });