Add possibility to check parsed query
This commit is contained in:
parent
0f51652ad3
commit
7cefee027a
1 changed files with 144 additions and 21 deletions
|
@ -58,7 +58,8 @@ function extractFunction(content, functionName) {
|
||||||
} while (pos < content.length && content[pos] !== '/' && content[pos - 1] !== '*');
|
} while (pos < content.length && content[pos] !== '/' && content[pos - 1] !== '*');
|
||||||
|
|
||||||
// Eat quoted strings
|
// Eat quoted strings
|
||||||
} else if (content[pos] === '"' || content[pos] === "'" || content[pos] === "`") {
|
} else if ((content[pos] === '"' || content[pos] === "'" || content[pos] === "`") &&
|
||||||
|
(pos === 0 || content[pos - 1] !== '/')) {
|
||||||
stop = content[pos];
|
stop = content[pos];
|
||||||
do {
|
do {
|
||||||
if (content[pos] === '\\') {
|
if (content[pos] === '\\') {
|
||||||
|
@ -269,8 +270,7 @@ function loadSearchJsAndIndex(searchJs, searchIndex, storageJs, crate) {
|
||||||
// execQuery last parameter is built in buildIndex.
|
// execQuery last parameter is built in buildIndex.
|
||||||
// buildIndex requires the hashmap from search-index.
|
// buildIndex requires the hashmap from search-index.
|
||||||
var functionsToLoad = ["buildHrefAndPath", "pathSplitter", "levenshtein", "validateResult",
|
var functionsToLoad = ["buildHrefAndPath", "pathSplitter", "levenshtein", "validateResult",
|
||||||
"handleAliases", "getQuery", "buildIndex", "execQuery", "execSearch",
|
"buildIndex", "execQuery", "parseQuery", "createQueryResults"];
|
||||||
"removeEmptyStringsFromArray"];
|
|
||||||
|
|
||||||
const functions = ["hasOwnPropertyRustdoc", "onEach"];
|
const functions = ["hasOwnPropertyRustdoc", "onEach"];
|
||||||
ALIASES = {};
|
ALIASES = {};
|
||||||
|
@ -286,12 +286,100 @@ function loadSearchJsAndIndex(searchJs, searchIndex, storageJs, crate) {
|
||||||
return [loaded, index];
|
return [loaded, index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function checkFieldNeededFields(fullPath, expected, error_text, queryName, position) {
|
||||||
|
let fieldsToCheck;
|
||||||
|
if (fullPath.length === 0) {
|
||||||
|
fieldsToCheck = [
|
||||||
|
"foundElems",
|
||||||
|
"id",
|
||||||
|
"nameSplit",
|
||||||
|
"original",
|
||||||
|
"returned",
|
||||||
|
"typeFilter",
|
||||||
|
"val",
|
||||||
|
"error",
|
||||||
|
];
|
||||||
|
} else if (fullPath.endsWith("elems") || fullPath.endsWith("generics")) {
|
||||||
|
fieldsToCheck = [
|
||||||
|
"name",
|
||||||
|
"fullPath",
|
||||||
|
"pathWithoutLast",
|
||||||
|
"pathLast",
|
||||||
|
"generics",
|
||||||
|
];
|
||||||
|
} else {
|
||||||
|
fieldsToCheck = [];
|
||||||
|
}
|
||||||
|
for (var i = 0; i < fieldsToCheck.length; ++i) {
|
||||||
|
const field = fieldsToCheck[i];
|
||||||
|
if (!expected.hasOwnProperty(field)) {
|
||||||
|
let text = `${queryName}==> Mandatory key \`${field}\` is not present`;
|
||||||
|
if (fullPath.length > 0) {
|
||||||
|
text += ` in field \`${fullPath}\``;
|
||||||
|
if (position != null) {
|
||||||
|
text += ` (position ${position})`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
error_text.push(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function valueCheck(fullPath, expected, result, error_text, queryName) {
|
||||||
|
if (Array.isArray(expected)) {
|
||||||
|
for (var i = 0; i < expected.length; ++i) {
|
||||||
|
checkFieldNeededFields(fullPath, expected[i], error_text, queryName, i);
|
||||||
|
if (i >= result.length) {
|
||||||
|
error_text.push(`${queryName}==> EXPECTED has extra value in array from field ` +
|
||||||
|
`\`${fullPath}\` (position ${i}): \`${JSON.stringify(expected[i])}\``);
|
||||||
|
} else {
|
||||||
|
valueCheck(fullPath + '[' + i + ']', expected[i], result[i], error_text, queryName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (; i < result.length; ++i) {
|
||||||
|
error_text.push(`${queryName}==> RESULT has extra value in array from field ` +
|
||||||
|
`\`${fullPath}\` (position ${i}): \`${JSON.stringify(result[i])}\` ` +
|
||||||
|
'compared to EXPECTED');
|
||||||
|
}
|
||||||
|
} else if (expected !== null && typeof expected !== "undefined" &&
|
||||||
|
expected.constructor == Object)
|
||||||
|
{
|
||||||
|
for (const key in expected) {
|
||||||
|
if (!expected.hasOwnProperty(key)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!result.hasOwnProperty(key)) {
|
||||||
|
error_text.push('==> Unknown key "' + key + '"');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
const obj_path = fullPath + (fullPath.length > 0 ? '.' : '') + key;
|
||||||
|
valueCheck(obj_path, expected[key], result[key], error_text, queryName);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
expectedValue = JSON.stringify(expected);
|
||||||
|
resultValue = JSON.stringify(result);
|
||||||
|
if (expectedValue != resultValue) {
|
||||||
|
error_text.push(`${queryName}==> Different values for field \`${fullPath}\`:\n` +
|
||||||
|
`EXPECTED: \`${expectedValue}\`\nRESULT: \`${resultValue}\``);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function runParser(query, expected, loaded, loadedFile, queryName) {
|
||||||
|
var error_text = [];
|
||||||
|
checkFieldNeededFields("", expected, error_text, queryName, null);
|
||||||
|
if (error_text.length === 0) {
|
||||||
|
valueCheck('', expected, loaded.parseQuery(query), error_text, queryName);
|
||||||
|
}
|
||||||
|
return error_text;
|
||||||
|
}
|
||||||
|
|
||||||
function runSearch(query, expected, index, loaded, loadedFile, queryName) {
|
function runSearch(query, expected, index, loaded, loadedFile, queryName) {
|
||||||
const filter_crate = loadedFile.FILTER_CRATE;
|
const filter_crate = loadedFile.FILTER_CRATE;
|
||||||
const ignore_order = loadedFile.ignore_order;
|
const ignore_order = loadedFile.ignore_order;
|
||||||
const exact_check = loadedFile.exact_check;
|
const exact_check = loadedFile.exact_check;
|
||||||
|
|
||||||
var results = loaded.execSearch(loaded.getQuery(query), index, filter_crate);
|
var results = loaded.execQuery(loaded.parseQuery(query), index, filter_crate);
|
||||||
var error_text = [];
|
var error_text = [];
|
||||||
|
|
||||||
for (var key in expected) {
|
for (var key in expected) {
|
||||||
|
@ -353,40 +441,75 @@ function checkResult(error_text, loadedFile, displaySuccess) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
function runChecks(testFile, loaded, index) {
|
function runCheck(loadedFile, key, callback) {
|
||||||
var testFileContent = readFile(testFile) + 'exports.QUERY = QUERY;exports.EXPECTED = EXPECTED;';
|
const expected = loadedFile[key];
|
||||||
if (testFileContent.indexOf("FILTER_CRATE") !== -1) {
|
|
||||||
testFileContent += "exports.FILTER_CRATE = FILTER_CRATE;";
|
|
||||||
} else {
|
|
||||||
testFileContent += "exports.FILTER_CRATE = null;";
|
|
||||||
}
|
|
||||||
var loadedFile = loadContent(testFileContent);
|
|
||||||
|
|
||||||
const expected = loadedFile.EXPECTED;
|
|
||||||
const query = loadedFile.QUERY;
|
const query = loadedFile.QUERY;
|
||||||
|
|
||||||
if (Array.isArray(query)) {
|
if (Array.isArray(query)) {
|
||||||
if (!Array.isArray(expected)) {
|
if (!Array.isArray(expected)) {
|
||||||
console.log("FAILED");
|
console.log("FAILED");
|
||||||
console.log("==> If QUERY variable is an array, EXPECTED should be an array too");
|
console.log(`==> If QUERY variable is an array, ${key} should be an array too`);
|
||||||
return 1;
|
return 1;
|
||||||
} else if (query.length !== expected.length) {
|
} else if (query.length !== expected.length) {
|
||||||
console.log("FAILED");
|
console.log("FAILED");
|
||||||
console.log("==> QUERY variable should have the same length as EXPECTED");
|
console.log(`==> QUERY variable should have the same length as ${key}`);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
for (var i = 0; i < query.length; ++i) {
|
for (var i = 0; i < query.length; ++i) {
|
||||||
var error_text = runSearch(query[i], expected[i], index, loaded, loadedFile,
|
var error_text = callback(query[i], expected[i], "[ query `" + query[i] + "`]");
|
||||||
"[ query `" + query[i] + "`]");
|
|
||||||
if (checkResult(error_text, loadedFile, false) !== 0) {
|
if (checkResult(error_text, loadedFile, false) !== 0) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.log("OK");
|
console.log("OK");
|
||||||
return 0;
|
} else {
|
||||||
|
var error_text = callback(query, expected, "");
|
||||||
|
if (checkResult(error_text, loadedFile, true) !== 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
var error_text = runSearch(query, expected, index, loaded, loadedFile, "");
|
return 0;
|
||||||
return checkResult(error_text, loadedFile, true);
|
}
|
||||||
|
|
||||||
|
function runChecks(testFile, loaded, index) {
|
||||||
|
var checkExpected = false;
|
||||||
|
var checkParsed = false;
|
||||||
|
var testFileContent = readFile(testFile) + 'exports.QUERY = QUERY;';
|
||||||
|
|
||||||
|
if (testFileContent.indexOf("FILTER_CRATE") !== -1) {
|
||||||
|
testFileContent += "exports.FILTER_CRATE = FILTER_CRATE;";
|
||||||
|
} else {
|
||||||
|
testFileContent += "exports.FILTER_CRATE = null;";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (testFileContent.indexOf("\nconst EXPECTED") !== -1) {
|
||||||
|
testFileContent += 'exports.EXPECTED = EXPECTED;';
|
||||||
|
checkExpected = true;
|
||||||
|
}
|
||||||
|
if (testFileContent.indexOf("\nconst PARSED") !== -1) {
|
||||||
|
testFileContent += 'exports.PARSED = PARSED;';
|
||||||
|
checkParsed = true;
|
||||||
|
}
|
||||||
|
if (!checkParsed && !checkExpected) {
|
||||||
|
console.log("FAILED");
|
||||||
|
console.log("==> At least `PARSED` or `EXPECTED` is needed!");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadedFile = loadContent(testFileContent);
|
||||||
|
var res = 0;
|
||||||
|
|
||||||
|
if (checkExpected) {
|
||||||
|
res += runCheck(loadedFile, "EXPECTED", (query, expected, text) => {
|
||||||
|
return runSearch(query, expected, index, loaded, loadedFile, text);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (checkParsed) {
|
||||||
|
res += runCheck(loadedFile, "PARSED", (query, expected, text) => {
|
||||||
|
return runParser(query, expected, loaded, loadedFile, text);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
function load_files(doc_folder, resource_suffix, crate) {
|
function load_files(doc_folder, resource_suffix, crate) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue