/* * * * * * * * * * * * * DO NOT EDIT THIS FILE * For FCC testing purposes! * * * * * * * * * * * */ function objParser(str, init) { // finds objects, arrays, strings, and function arguments // between parens, because they may contain ',' let openSym = ['[', '{', '"', "'", '(']; let closeSym = [']', '}', '"', "'", ')']; let type; let i; for (i = (init || 0); i < str.length; i++) { type = openSym.indexOf(str[i]); if (type !== -1) break; } if (type === -1) return null; let open = openSym[type]; let close = closeSym[type]; let count = 1; let k; for (k = i + 1; k < str.length; k++) { if (open === '"' || open === "'") { if (str[k] === close) count--; if (str[k] === '\\') k++; } else { if (str[k] === open) count++; if (str[k] === close) count--; } if (count === 0) break; } if (count !== 0) return null; let obj = str.slice(i, k + 1); return { start: i, end: k, obj: obj }; } function replacer(str) { // replace objects with a symbol ( __#n) let obj; let cnt = 0; let data = []; while (obj = objParser(str)) { data[cnt] = obj.obj; str = str.substring(0, obj.start) + '__#' + cnt++ + str.substring(obj.end + 1) } return { str: str, dictionary: data } } function splitter(str) { // split on commas, then restore the objects let strObj = replacer(str); let args = strObj.str.split(','); args = args.map(function (a) { let m = a.match(/__#(\d+)/); while (m) { a = a.replace(/__#(\d+)/, strObj.dictionary[m[1]]); m = a.match(/__#(\d+)/); } return a.trim(); }) return args; } function assertionAnalyser(body) { // already filtered in the test runner // // remove comments // body = body.replace(/\/\/.*\n|\/\*.*\*\//g, ''); // // get test function body // body = body.match(/\{\s*([\s\S]*)\}\s*$/)[1]; if (!body) return "invalid assertion"; // replace assertions bodies, so that they cannot // contain the word 'assertion' let cleanedBody = body.match(/(?:browser\s*\.\s*)?assert\s*\.\s*\w*\([\s\S]*\)/) if (cleanedBody && Array.isArray(cleanedBody)) { body = cleanedBody[0]; } else { // No assertions present return []; } let s = replacer(body); // split on 'assertion' let splittedAssertions = s.str.split('assert'); let assertions = splittedAssertions.slice(1); // match the METHODS let assertionBodies = []; let methods = assertions.map(function (a, i) { let m = a.match(/^\s*\.\s*(\w+)__#(\d+)/); assertionBodies.push(parseInt(m[2])); let pre = splittedAssertions[i].match(/browser\s*\.\s*/) ? 'browser.' : ''; return pre + m[1]; }); if (methods.some(function (m) { return !m })) return "invalid assertion"; // remove parens from the assertions bodies let bodies = assertionBodies.map(function (b) { return s.dictionary[b].slice(1, -1).trim(); }); assertions = methods.map(function (m, i) { return { method: m, args: splitter(bodies[i]) //replace objects, split on ',' ,then restore objects } }) return assertions; } module.exports = assertionAnalyser;