Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tests: Refactoring #1795

Merged
merged 2 commits into from
Mar 10, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 19 additions & 22 deletions tests/helper/prism-loader.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
"use strict";

var fs = require("fs");
var vm = require("vm");
var components = require("../../components");
var languagesCatalog = components.languages;
const fs = require("fs");
const vm = require("vm");
const components = require("../../components");
const languagesCatalog = components.languages;


module.exports = {
Expand All @@ -14,8 +14,8 @@ module.exports = {
* @param {string|string[]} languages
* @returns {Prism}
*/
createInstance: function (languages) {
var context = {
createInstance(languages) {
let context = {
loadedLanguages: [],
Prism: this.createEmptyPrism()
};
Expand All @@ -33,16 +33,14 @@ module.exports = {
* @param {{loadedLanguages: string[], Prism: Prism}} context
* @returns {{loadedLanguages: string[], Prism: Prism}}
*/
loadLanguages: function (languages, context) {
loadLanguages(languages, context) {
if (typeof languages === 'string') {
languages = [languages];
}

var self = this;

languages.forEach(function (language) {
context = self.loadLanguage(language, context);
});
for (const language of languages) {
context = this.loadLanguage(language, context);
}

return context;
},
Expand All @@ -56,7 +54,7 @@ module.exports = {
* @param {{loadedLanguages: string[], Prism: Prism}} context
* @returns {{loadedLanguages: string[], Prism: Prism}}
*/
loadLanguage: function (language, context) {
loadLanguage(language, context) {
if (!languagesCatalog[language]) {
throw new Error("Language '" + language + "' not found.");
}
Expand All @@ -72,8 +70,8 @@ module.exports = {
}

// load the language itself
var languageSource = this.loadFileSource(language);
context.Prism = this.runFileWithContext(languageSource, {Prism: context.Prism}).Prism;
const languageSource = this.loadFileSource(language);
context.Prism = this.runFileWithContext(languageSource, { Prism: context.Prism }).Prism;
context.loadedLanguages.push(language);

return context;
Expand All @@ -86,9 +84,9 @@ module.exports = {
* @private
* @returns {Prism}
*/
createEmptyPrism: function () {
var coreSource = this.loadFileSource("core");
var context = this.runFileWithContext(coreSource);
createEmptyPrism() {
const coreSource = this.loadFileSource("core");
const context = this.runFileWithContext(coreSource);
return context.Prism;
},

Expand All @@ -109,7 +107,7 @@ module.exports = {
* @param {string} name
* @returns {string}
*/
loadFileSource: function (name) {
loadFileSource(name) {
return this.fileSourceCache[name] = this.fileSourceCache[name] || fs.readFileSync(__dirname + "/../../components/prism-" + name + ".js", "utf8");
},

Expand All @@ -119,12 +117,11 @@ module.exports = {
*
* @private
* @param {string} fileSource
* @param {*} [context]
* @param {*} [context={}]
*
* @returns {*}
*/
runFileWithContext: function (fileSource, context) {
context = context || {};
runFileWithContext(fileSource, context = {}) {
vm.runInNewContext(fileSource, context);
return context;
}
Expand Down
75 changes: 41 additions & 34 deletions tests/helper/test-case.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
"use strict";

var fs = require("fs");
var assert = require("chai").assert;
var PrismLoader = require("./prism-loader");
var TokenStreamTransformer = require("./token-stream-transformer");
const fs = require("fs");
const { assert } = require("chai");
const PrismLoader = require("./prism-loader");
const TokenStreamTransformer = require("./token-stream-transformer");

/**
* Handles parsing of a test case file.
Expand Down Expand Up @@ -32,7 +32,6 @@ var TokenStreamTransformer = require("./token-stream-transformer");
* the test case will later be marked as failed.
*
*
* @type {{runTestCase: Function, transformCompiledTokenStream: Function, parseTestCaseFile: Function}}
*/
module.exports = {

Expand All @@ -52,41 +51,49 @@ module.exports = {
* @param {string} filePath
* @param {boolean} [pretty=false]
*/
runTestCase: function (languageIdentifier, filePath, pretty) {
var testCase = this.parseTestCaseFile(filePath);
var usedLanguages = this.parseLanguageNames(languageIdentifier);
runTestCase(languageIdentifier, filePath, pretty = false) {
const testCase = this.parseTestCaseFile(filePath);
const usedLanguages = this.parseLanguageNames(languageIdentifier);

if (null === testCase) {
throw new Error("Test case file has invalid format (or the provided token stream is invalid JSON), please read the docs.");
}

var Prism = PrismLoader.createInstance(usedLanguages.languages);
const Prism = PrismLoader.createInstance(usedLanguages.languages);
// the first language is the main language to highlight
var mainLanguageGrammar = Prism.languages[usedLanguages.mainLanguage];
var env = {
const mainLanguageGrammar = Prism.languages[usedLanguages.mainLanguage];
const env = {
code: testCase.testSource,
grammar: mainLanguageGrammar,
language: usedLanguages.mainLanguage
};
Prism.hooks.run('before-tokenize', env);
env.tokens = Prism.tokenize(env.code, env.grammar);
Prism.hooks.run('after-tokenize', env);
var compiledTokenStream = env.tokens;

var simplifiedTokenStream = TokenStreamTransformer.simplify(compiledTokenStream);

var tzd = JSON.stringify(simplifiedTokenStream);
var exp = JSON.stringify(testCase.expectedTokenStream);
var i = 0; var j = 0; var diff = "";
while (j < tzd.length) { if (exp[i] != tzd[j] || i == exp.length) diff += tzd[j]; else i++; j++; }
const compiledTokenStream = env.tokens;

const simplifiedTokenStream = TokenStreamTransformer.simplify(compiledTokenStream);

const tzd = JSON.stringify(simplifiedTokenStream);
const exp = JSON.stringify(testCase.expectedTokenStream);
let i = 0;
let j = 0;
let diff = "";
while (j < tzd.length) {
if (exp[i] != tzd[j] || i == exp.length)
diff += tzd[j];
else
i++;
j++;
}

const tokenStreamStr = pretty ? TokenStreamTransformer.prettyprint(simplifiedTokenStream) : tzd;
var message = "\nToken Stream: \n" + tokenStreamStr +
const message = "\nToken Stream: \n" + tokenStreamStr +
"\n-----------------------------------------\n" +
"Expected Token Stream: \n" + exp +
"\n-----------------------------------------\n" + diff;

var result = assert.deepEqual(simplifiedTokenStream, testCase.expectedTokenStream, testCase.comment + message);
const result = assert.deepEqual(simplifiedTokenStream, testCase.expectedTokenStream, testCase.comment + message);
},


Expand All @@ -100,13 +107,13 @@ module.exports = {
*
* @returns {{languages: string[], mainLanguage: string}}
*/
parseLanguageNames: function (languageIdentifier) {
var languages = languageIdentifier.split("+");
var mainLanguage = null;
parseLanguageNames(languageIdentifier) {
let languages = languageIdentifier.split("+");
let mainLanguage = null;

languages = languages.map(
function (language) {
var pos = language.indexOf("!");
const pos = language.indexOf("!");

if (-1 < pos) {
if (mainLanguage) {
Expand Down Expand Up @@ -139,12 +146,12 @@ module.exports = {
* @param {string} filePath
* @returns {{testSource: string, expectedTokenStream: Array.<Array.<string>>, comment:string?}|null}
*/
parseTestCaseFile: function (filePath) {
var testCaseSource = fs.readFileSync(filePath, "utf8");
var testCaseParts = testCaseSource.split(/^-{10,}\w*$/m);
parseTestCaseFile(filePath) {
const testCaseSource = fs.readFileSync(filePath, "utf8");
const testCaseParts = testCaseSource.split(/^-{10,}\w*$/m);

try {
var testCase = {
const testCase = {
testSource: testCaseParts[0].trim(),
expectedTokenStream: JSON.parse(testCaseParts[1]),
comment: null
Expand Down Expand Up @@ -172,14 +179,14 @@ module.exports = {
* @param {string} languageIdentifier
* @param {object} codes
*/
runTestsWithHooks: function (languageIdentifier, codes) {
var usedLanguages = this.parseLanguageNames(languageIdentifier);
var Prism = PrismLoader.createInstance(usedLanguages.languages);
runTestsWithHooks(languageIdentifier, codes) {
const usedLanguages = this.parseLanguageNames(languageIdentifier);
const Prism = PrismLoader.createInstance(usedLanguages.languages);
// the first language is the main language to highlight

for (var code in codes) {
for (const code in codes) {
if (codes.hasOwnProperty(code)) {
var env = {
const env = {
element: {},
language: usedLanguages.mainLanguage,
grammar: Prism.languages[usedLanguages.mainLanguage],
Expand Down
75 changes: 31 additions & 44 deletions tests/helper/test-discovery.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"use strict";

var fs = require("fs");
var path = require("path");
const fs = require("fs");
const path = require("path");


module.exports = {
Expand All @@ -12,15 +12,13 @@ module.exports = {
* @param {string} rootDir
* @returns {Object.<string, string[]>}
*/
loadAllTests: function (rootDir) {
var testSuite = {};
var self = this;
loadAllTests(rootDir) {
/** @type {Object.<string, string[]>} */
const testSuite = {};

this.getAllDirectories(rootDir).forEach(
function (language) {
testSuite[language] = self.getAllFiles(path.join(rootDir, language));
}
);
for (const language of this.getAllDirectories(rootDir)) {
testSuite[language] = this.getAllFiles(path.join(rootDir, language));
}

return testSuite;
},
Expand All @@ -32,15 +30,13 @@ module.exports = {
* @param {string|string[]} languages
* @returns {Object.<string, string[]>}
*/
loadSomeTests: function (rootDir, languages) {
var testSuite = {};
var self = this;
loadSomeTests(rootDir, languages) {
/** @type {Object.<string, string[]>} */
const testSuite = {};

this.getSomeDirectories(rootDir, languages).forEach(
function (language) {
testSuite[language] = self.getAllFiles(path.join(rootDir, language));
}
);
for (const language of this.getSomeDirectories(rootDir, languages)) {
testSuite[language] = this.getAllFiles(path.join(rootDir, language));
}

return testSuite;
},
Expand All @@ -53,12 +49,10 @@ module.exports = {
* @param {string} src
* @returns {Array.<string>}
*/
getAllDirectories: function (src) {
return fs.readdirSync(src).filter(
function (file) {
return fs.statSync(path.join(src, file)).isDirectory();
}
);
getAllDirectories(src) {
return fs.readdirSync(src).filter(file => {
return fs.statSync(path.join(src, file)).isDirectory();
});
},

/**
Expand All @@ -69,28 +63,23 @@ module.exports = {
* @param {string|string[]} languages
* @returns {Array.<string>}
*/
getSomeDirectories: function (src, languages) {
var self = this;
return fs.readdirSync(src).filter(
function (file) {
return fs.statSync(path.join(src, file)).isDirectory() && self.directoryMatches(file, languages);
}
);
getSomeDirectories(src, languages) {
return fs.readdirSync(src).filter(file => {
return fs.statSync(path.join(src, file)).isDirectory() && this.directoryMatches(file, languages);
});
},

/**
* Returns whether a directory matches one of the given languages.
* @param {string} directory
* @param {string|string[]} languages
*/
directoryMatches: function (directory, languages) {
directoryMatches(directory, languages) {
if (!Array.isArray(languages)) {
languages = [languages];
}
var dirLanguages = directory.split(/!?\+!?/);
return dirLanguages.some(function (lang) {
return languages.indexOf(lang) >= 0;
});
const dirLanguages = directory.split(/!?\+!?/);
return dirLanguages.some(lang => languages.indexOf(lang) >= 0);
},


Expand All @@ -101,15 +90,13 @@ module.exports = {
* @param {string} src
* @returns {Array.<string>}
*/
getAllFiles: function (src) {
return fs.readdirSync(src).filter(
function (fileName) {
getAllFiles(src) {
return fs.readdirSync(src)
.filter(fileName => {
return fs.statSync(path.join(src, fileName)).isFile();
}
).map(
function (fileName) {
})
.map(fileName => {
return path.join(src, fileName);
}
);
});
}
};
Loading