Skip to content

Commit

Permalink
Refactored tests (#1795)
Browse files Browse the repository at this point in the history
This refactors all test related JS files.
  • Loading branch information
RunDevelopment authored Mar 10, 2019
1 parent 729cb28 commit 832a964
Show file tree
Hide file tree
Showing 6 changed files with 234 additions and 268 deletions.
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

0 comments on commit 832a964

Please sign in to comment.