diff --git a/test/extensions/twitter/basic.html b/test/extensions/twitter/basic.html new file mode 100644 index 0000000..4e9b316 --- /dev/null +++ b/test/extensions/twitter/basic.html @@ -0,0 +1,5 @@ +
Testing of the twitter extension.
+ +Ping @andstuff to find out more about #extensions with showdown
+ +And @something shouldn't render as a twitter link
\ No newline at end of file diff --git a/test/extensions/twitter/basic.md b/test/extensions/twitter/basic.md new file mode 100644 index 0000000..6269c9d --- /dev/null +++ b/test/extensions/twitter/basic.md @@ -0,0 +1,5 @@ +Testing of the twitter extension. + +Ping @andstuff to find out more about #extensions with showdown + +And \@something shouldn't render as a twitter link \ No newline at end of file diff --git a/test/run.js b/test/run.js index 71ea07b..9f69a5a 100644 --- a/test/run.js +++ b/test/run.js @@ -1,44 +1,92 @@ var showdown = new require('../src/showdown'), - convertor = new showdown.converter(), fs = require('fs'), path = require('path'), should = require('should'); -// Load test cases from disk -var cases = fs.readdirSync('test/cases').filter(function(file){ - return ~file.indexOf('.md'); -}).map(function(file){ - return file.replace('.md', ''); + +var runTestsInDir = function(dir, converter) { + + // Load test cases from disk + var cases = fs.readdirSync(dir).filter(function(file){ + return ~file.indexOf('.md'); + }).map(function(file){ + return file.replace('.md', ''); + }); + + // Run each test case (markdown -> html) + cases.forEach(function(test){ + var name = test.replace(/[-.]/g, ' '); + it (name, function(){ + var mdpath = path.join(dir, test + '.md'), + htmlpath = path.join(dir, test + '.html'), + md = fs.readFileSync(mdpath, 'utf8'), + expected = fs.readFileSync(htmlpath, 'utf8').trim(), + actual = converter.makeHtml(md).trim(); + + // Normalize line returns + expected = expected.replace(/\r/g, ''); + + // Ignore all leading/trailing whitespace + expected = expected.split('\n').map(function(x){ + return x.trim(); + }).join('\n'); + actual = actual.split('\n').map(function(x){ + return x.trim(); + }).join('\n'); + + // Convert whitespace to a visible character so that it shows up on error reports + expected = expected.replace(/ /g, '·'); + expected = expected.replace(/\n/g, '•\n'); + actual = actual.replace(/ /g, '·'); + actual = actual.replace(/\n/g, '•\n'); + + // Compare + actual.should.equal(expected); + }); + }); +}; + + +// +// :: Markdown to HTML testing :: +// + +describe('Markdown', function() { + var converter = new showdown.converter(); + runTestsInDir('test/cases', converter); }); -// Run each test case -cases.forEach(function(test){ - var name = test.replace(/[-.]/g, ' '); - it (name, function(){ - var mdpath = path.join('test/cases', test + '.md'), - htmlpath = path.join('test/cases', test + '.html'), - md = fs.readFileSync(mdpath, 'utf8'), - expected = fs.readFileSync(htmlpath, 'utf8').trim(), - actual = convertor.makeHtml(md).trim(); - // Normalize line returns - expected = expected.replace(/\r/g, ''); +// +// :: Extensions Testing :: +// - // Ignore all leading/trailing whitespace - expected = expected.split('\n').map(function(x){ - return x.trim(); - }).join('\n'); - actual = actual.split('\n').map(function(x){ - return x.trim(); - }).join('\n'); +if (path.existsSync('test/extensions')) { - // Convert whitespace to a visible character so that it shows up on error reports - expected = expected.replace(/ /g, '·'); - expected = expected.replace(/\n/g, '•\n'); - actual = actual.replace(/ /g, '·'); - actual = actual.replace(/\n/g, '•\n'); + describe('extensions', function() { + // Search all sub-folders looking for directory-specific tests + var extensions = fs.readdirSync('test/extensions').filter(function(file){ + return fs.lstatSync('test/extensions/' + file).isDirectory(); + }); - // Compare - actual.should.equal(expected); + // Run tests in each extension sub-folder + extensions.forEach(function(ext){ + // Make sure extension exists + var src = 'src/extensions/' + ext + '.js'; + if (!path.existsSync(src)) { + throw "Attempting tests for '" + ext + "' but sourc file (" + src + ") was not found."; + } + + // Build converter with extension included + var extension = require('../src/extensions/' + ext); + if (!extension) { + throw "Could not load extension '" + ext + "'. Did you forget module.exports?"; + } + + var converter = new showdown.converter({ extensions: [ extension ] }); + var dir = 'test/extensions/' + ext; + runTestsInDir(dir, converter); + }); }); -}); \ No newline at end of file + +} \ No newline at end of file