UNPKG

@coorpacademy/progression-engine

Version:

145 lines 7.65 kB
import assert from 'assert'; import test from 'ava'; import { getConfig } from '../config'; import { assertCorrect, assertIncorrect, assertIncorrectEmptyAnswer } from './helpers/assert-check-answer-correctness'; const config = getConfig({ ref: 'microlearning', version: 'latest' }); function createQuestion(answers, choiceTypes, maxTypos) { answers.forEach(answer => { assert.equal(answer.length, choiceTypes.length, 'The number of answers in an allowed answer should match the number of answer inputs'); }); return { type: 'template', content: { matchOrder: true, maxTypos, choices: choiceTypes.map((type, index) => ({ _id: `id-${index}`, label: `choice-${index}`, type })), answers } }; } test('should return true when all the given answer matches a possible answer exactly', t => { const question = createQuestion([['2', 'un'], ['deux', 'un'], ['saut', 'parachute']], ['text', 'text']); assertCorrect(t, config, question, ['2', 'un']); assertCorrect(t, config, question, ['deux', 'un']); assertCorrect(t, config, question, ['saut', 'parachute']); }); test('should return false when answers are correct but in an incorrect order', t => { const question = createQuestion([['2', 'un'], ['deux', 'un'], ['saut', 'parachute']], ['text', 'text']); assertIncorrect(t, config, question, ['un', '2'], [false, false]); assertIncorrect(t, config, question, ['un', 'deux'], [false, false]); assertIncorrect(t, config, question, ['parachute', 'saut'], [false, false]); }); test('should return false when the given answer is partially incorrect', t => { const question = createQuestion([['2', 'un'], ['deux', 'un'], ['saut', 'parachute']], ['text', 'text']); assertIncorrect(t, config, question, ['2', 'AAAAAAA'], [true, false]); assertIncorrect(t, config, question, ['deux', 'AAAAAAAA'], [true, false]); assertIncorrect(t, config, question, ['saut', 'AAAAAAAA'], [true, false]); assertIncorrect(t, config, question, ['AAAAAAAA', 'un'], [false, true]); assertIncorrect(t, config, question, ['AAAAAAAA', 'un'], [false, true]); assertIncorrect(t, config, question, ['AAAAAAAA', 'parachute'], [false, true]); }); test('should allow typos in text inputs', t => { const question = createQuestion([['2', 'un'], ['deux', 'un'], ['saut', 'parachute']], ['text', 'text']); assertCorrect(t, config, question, ['saut', 'parachutee']); assertCorrect(t, config, question, ['sauZt', 'parachute']); assertCorrect(t, config, question, ['sauZZt', 'parachutee']); assertCorrect(t, config, question, ['saut', 'pOrOchute']); assertIncorrect(t, config, question, ['sauZZZZZt', 'parachute'], [false, true]); assertIncorrect(t, config, question, ['saut', 'parachutZZZe'], [true, false]); }); test('should allow and ignore blank spaces in text inputs', t => { const question = createQuestion([['2', 'un'], ['deux', 'un'], ['saut', 'parachute']], ['text', 'text']); assertCorrect(t, config, question, ['saut ', 'parachute']); assertCorrect(t, config, question, [' saut', 'parachute']); assertCorrect(t, config, question, ['saut', ' parachute']); assertCorrect(t, config, question, ['saut', 'parachute ']); assertCorrect(t, config, question, [' saut ', ' parachute ']); assertIncorrect(t, config, question, [' sauZZZZZt', ' parachute'], [false, true]); assertIncorrect(t, config, question, ['saut ', 'parachutZZZe '], [true, false]); }); test('should use the maxTypos value from the question if available', t => { const questionWithTypos0 = createQuestion([['parachute']], ['text'], 0); const questionWithTypos3 = createQuestion([['parachute']], ['text'], 3); assertCorrect(t, config, questionWithTypos0, ['parachute']); assertIncorrect(t, config, questionWithTypos0, ['parachutZe'], [false]); assertCorrect(t, config, questionWithTypos3, ['parachute']); assertCorrect(t, config, questionWithTypos3, ['parachut']); assertCorrect(t, config, questionWithTypos3, ['parachu']); assertCorrect(t, config, questionWithTypos3, ['parach']); assertIncorrect(t, config, questionWithTypos3, ['parac'], [false]); }); test('allowed answers should be made case insensitive', t => { const question = createQuestion([['fooBAR', 'PARACHUTE']], ['text', 'text']); assertCorrect(t, config, question, ['fooBAR', 'PARACHUTE']); assertCorrect(t, config, question, ['foobar', 'parachute']); assertCorrect(t, config, question, ['FOOBAR', 'PARACHUTE']); assertCorrect(t, config, question, ['ZZZZZfooBAR', 'ZZZZZPARACHUTE']); assertCorrect(t, config, question, ['ZZZZZfoobar', 'ZZZZZparachute']); assertCorrect(t, config, question, ['ZZZZZFOOBAR', 'ZZZZZPARACHUTE']); }); test('should allow additional characters on the sides of text inputs', t => { const question = createQuestion([['parachute']], ['text']); assertCorrect(t, config, question, ['parachute']); assertCorrect(t, config, question, ['Parachute']); assertCorrect(t, config, question, ['parachuté']); assertCorrect(t, config, question, ['parachuteZZZZZ']); assertCorrect(t, config, question, ['ZZZZZparachute']); assertCorrect(t, config, question, ['ZZZZZparachuteZZZZZ']); assertCorrect(t, config, question, ['PARACHUTEZZZZ']); assertIncorrect(t, config, question, ['parachuteZZZZZZ'], [false]); assertIncorrect(t, config, question, ['ZZZZZZparachute'], [false]); assertIncorrect(t, config, question, ['ZZZZZZparachuteZZZZZZ'], [false]); }); test('should not allow typos or additional characters for select inputs', t => { const question = createQuestion([['parachute']], ['select']); assertCorrect(t, config, question, ['parachute']); assertIncorrect(t, config, question, ['Parachute'], [false]); assertIncorrect(t, config, question, ['PARACHUTE'], [false]); assertIncorrect(t, config, question, ['parachOte'], [false]); assertIncorrect(t, config, question, ['parachuteZ'], [false]); assertIncorrect(t, config, question, ['Zparachute'], [false]); assertIncorrect(t, config, question, ['parachuté'], [false]); }); test('should return false when the given answer has more elements that the accepted answers', t => { const question = createQuestion([['2', 'un'], ['deux', 'un'], ['saut', 'parachute']], ['text', 'text']); assertIncorrect(t, config, question, ['2', 'un', 'trois'], [true, true, false]); assertIncorrect(t, config, question, ['deux', 'un', 'trois'], [true, true, false]); assertIncorrect(t, config, question, ['saut', 'parachute', 'avion'], [true, true, false]); assertIncorrect(t, config, question, ['saut', 'parachute', 'avion', 'pilote'], [true, true, false, false]); }); test('should return false when the given answer has less elements that the accepted answerss', t => { const question = createQuestion([['2', 'un'], ['deux', 'un'], ['saut', 'parachute']], ['text', 'text']); assertIncorrect(t, config, question, ['2'], [true]); assertIncorrect(t, config, question, ['deux'], [true]); assertIncorrect(t, config, question, ['saut'], [true]); assertIncorrect(t, config, question, [], []); }); test('should return false when there are no correct answers', t => { const question = { type: 'template', content: { matchOrder: true, choices: [{ _id: `1`, label: `choice-1`, type: 'text' }, { _id: `1`, label: `choice-1`, type: 'text' }], answers: [] } }; assertIncorrectEmptyAnswer(t, config, question, []); assertIncorrectEmptyAnswer(t, config, question, ['foo']); assertIncorrectEmptyAnswer(t, config, question, ['foo', 'bar']); }); //# sourceMappingURL=check-answer-correctness.template.js.map