Index: lib/src/prism/tests/helper/test-discovery.js |
diff --git a/lib/src/prism/tests/helper/test-discovery.js b/lib/src/prism/tests/helper/test-discovery.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..622b6192711569d33bbbfeb69400ddd070132ee8 |
--- /dev/null |
+++ b/lib/src/prism/tests/helper/test-discovery.js |
@@ -0,0 +1,117 @@ |
+"use strict"; |
+ |
+var fs = require("fs"); |
+var path = require("path"); |
+ |
+ |
+module.exports = { |
+ |
+ /** |
+ * Loads the list of all available tests |
+ * |
+ * @param {string} rootDir |
+ * @returns {Object.<string, string[]>} |
+ */ |
+ loadAllTests: function (rootDir) { |
+ var testSuite = {}; |
+ var self = this; |
+ |
+ this.getAllDirectories(rootDir).forEach( |
+ function (language) { |
+ testSuite[language] = self.getAllFiles(path.join(rootDir, language)); |
+ } |
+ ); |
+ |
+ return testSuite; |
+ }, |
+ |
+ /** |
+ * Loads the list of available tests that match the given languages |
+ * |
+ * @param {string} rootDir |
+ * @param {string|string[]} languages |
+ * @returns {Object.<string, string[]>} |
+ */ |
+ loadSomeTests: function (rootDir, languages) { |
+ var testSuite = {}; |
+ var self = this; |
+ |
+ this.getSomeDirectories(rootDir, languages).forEach( |
+ function (language) { |
+ testSuite[language] = self.getAllFiles(path.join(rootDir, language)); |
+ } |
+ ); |
+ |
+ return testSuite; |
+ }, |
+ |
+ |
+ /** |
+ * Returns a list of all (sub)directories (just the directory names, not full paths) |
+ * in the given src directory |
+ * |
+ * @param {string} src |
+ * @returns {Array.<string>} |
+ */ |
+ getAllDirectories: function (src) { |
+ return fs.readdirSync(src).filter( |
+ function (file) { |
+ return fs.statSync(path.join(src, file)).isDirectory(); |
+ } |
+ ); |
+ }, |
+ |
+ /** |
+ * Returns a list of all (sub)directories (just the directory names, not full paths) |
+ * in the given src directory, matching the given languages |
+ * |
+ * @param {string} src |
+ * @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); |
+ } |
+ ); |
+ }, |
+ |
+ /** |
+ * Returns whether a directory matches one of the given languages. |
+ * @param {string} directory |
+ * @param {string|string[]} languages |
+ */ |
+ directoryMatches: function (directory, languages) { |
+ if (!Array.isArray(languages)) { |
+ languages = [languages]; |
+ } |
+ var dirLanguages = directory.split(/!?\+!?/); |
+ return dirLanguages.some(function (lang) { |
+ return languages.indexOf(lang) >= 0; |
+ }); |
+ }, |
+ |
+ |
+ /** |
+ * Returns a list of all full file paths to all files in the given src directory |
+ * |
+ * @private |
+ * @param {string} src |
+ * @returns {Array.<string>} |
+ */ |
+ getAllFiles: function (src) { |
+ return fs.readdirSync(src).filter( |
+ function (fileName) { |
+ // only find files that have the ".test" extension |
+ return ".test" === path.extname(fileName) && |
+ fs.statSync(path.join(src, fileName)).isFile(); |
+ } |
+ ).map( |
+ function (fileName) { |
+ return path.join(src, fileName); |
+ } |
+ ); |
+ } |
+}; |