fix: unify single and multifile testing

This commit is contained in:
Oliver Eyton-Williams
2020-07-13 18:59:40 +02:00
committed by Mrugesh Mohapatra
parent d7dc1acb4a
commit 0f3f27287d
4 changed files with 87 additions and 75 deletions

View File

@ -19,22 +19,23 @@ function defaultFile(lang) {
tail: ''
};
}
function createCodeGetter(key, regEx, seeds) {
function createCodeGetter(codeKey, regEx, seeds) {
return container => {
const {
properties: { id }
} = container;
const lang = id.match(regEx)[1];
const key = `index${lang}`;
const code = select('code', container).children[0].value;
if (lang in seeds) {
seeds[lang] = {
...seeds[lang],
[key]: code
if (key in seeds) {
seeds[key] = {
...seeds[key],
[codeKey]: code
};
} else {
seeds[lang] = {
seeds[key] = {
...defaultFile(lang),
[key]: code
[codeKey]: code
};
}
};
@ -89,30 +90,28 @@ function createPlugin() {
file.data = {
...file.data,
files: Object.keys(seeds).map(lang => seeds[lang])
files: seeds
};
// TODO: make this readable.
if (file.data.files) {
file.data.files.forEach(fileData => {
const editRegionMarkers = findRegionMarkers(fileData);
if (editRegionMarkers) {
fileData.contents = removeLines(
fileData.contents,
editRegionMarkers
);
Object.keys(seeds).forEach(key => {
const fileData = seeds[key];
const editRegionMarkers = findRegionMarkers(fileData);
if (editRegionMarkers) {
fileData.contents = removeLines(
fileData.contents,
editRegionMarkers
);
if (editRegionMarkers[1] <= editRegionMarkers[0]) {
throw Error('Editable region must be non zero');
}
fileData.editableRegionBoundaries = editRegionMarkers;
} else {
fileData.editableRegionBoundaries = [];
if (editRegionMarkers[1] <= editRegionMarkers[0]) {
throw Error('Editable region must be non zero');
}
});
}
fileData.editableRegionBoundaries = editRegionMarkers;
} else {
fileData.editableRegionBoundaries = [];
}
});
// TODO: TESTS!
}
}
@ -122,3 +121,4 @@ function createPlugin() {
exports.challengeSeedToData = createPlugin;
exports.createCodeGetter = createCodeGetter;
exports.defaultFile = defaultFile;

View File

@ -2,23 +2,27 @@ const visit = require('unist-util-visit');
const { selectAll } = require('hast-util-select');
const { sectionFilter } = require('./utils');
const { createCodeGetter } = require('./challengeSeed-to-data');
const { createCodeGetter, defaultFile } = require('./challengeSeed-to-data');
const { isEmpty } = require('lodash');
const solutionRE = /(.+)-solution$/;
function indexByKey(obj) {
return { [obj.key]: { ...obj } };
}
function createPlugin() {
return function transformer(tree, file) {
function visitor(node) {
if (sectionFilter(node, 'solution')) {
// fallback for single-file challenges
const solutions = selectAll('code', node).map(
element => element.children[0].value
);
file.data = {
...file.data,
solutions
};
const rawSolutions = selectAll('code', node).map(element => ({
lang: element.properties.className[0].split('-')[1],
contents: element.children[0].value
}));
const solutionFiles = {};
const codeDivs = selectAll('div', node);
const solutionContainers = codeDivs.filter(({ properties: { id } }) =>
solutionRE.test(id)
@ -27,11 +31,20 @@ function createPlugin() {
createCodeGetter('contents', solutionRE, solutionFiles)
);
const solutionsAsFiles = rawSolutions
.map(({ lang, contents }) => ({
...defaultFile(lang),
contents
}))
.map(indexByKey);
const solutions = isEmpty(solutionFiles)
? solutionsAsFiles
: [solutionFiles];
file.data = {
...file.data,
solutionFiles: Object.keys(solutionFiles).map(
lang => solutionFiles[lang]
)
solutions
};
}
}