mirror of https://github.com/IoTcat/docsify.git
parent
fd86c727af
commit
b53571810b
5 changed files with 316 additions and 12 deletions
@ -0,0 +1,74 @@ |
||||
// load ES6 modules in Node.js on the fly
|
||||
require = require('esm')(module/*, options*/) |
||||
|
||||
const {expect} = require('chai') |
||||
|
||||
const {JSDOM} = require('jsdom') |
||||
const XMLHttpRequest = require('xhr2') // JSDOM doesn't support XMLHttpRequest
|
||||
// TODO: try to fix tests when using `<div id="app"></div>` in body
|
||||
const markup = `<!DOCTYPE html>
|
||||
<html> |
||||
<head></head> |
||||
<body></body> |
||||
</html>` |
||||
// TODO: this may not work if tests are mutate the DOM, instead a new instance needs to be created
|
||||
// for every test case but that will slow down the tests
|
||||
const dom = new JSDOM(markup)
|
||||
|
||||
global.window = dom.window |
||||
global.document = dom.window.document |
||||
global.navigator = dom.window.navigator |
||||
global.location = dom.window.location |
||||
global.XMLHttpRequest = XMLHttpRequest |
||||
|
||||
const {initMixin} = require('../src/core/init') |
||||
const {routerMixin} = require('../src/core//router') |
||||
const {renderMixin} = require('../src/core//render') |
||||
const {fetchMixin} = require('../src/core/fetch') |
||||
const {eventMixin} = require('../src/core//event') |
||||
|
||||
// mimic src/core/index.js but for Node.js
|
||||
|
||||
function Docsify() { |
||||
this._init() |
||||
} |
||||
|
||||
const proto = Docsify.prototype |
||||
|
||||
initMixin(proto) |
||||
routerMixin(proto) |
||||
renderMixin(proto) |
||||
fetchMixin(proto) |
||||
eventMixin(proto) |
||||
|
||||
function ready(callback) { |
||||
const state = document.readyState |
||||
|
||||
if (state === 'complete' || state === 'interactive') { |
||||
return setTimeout(callback, 0) |
||||
} |
||||
|
||||
document.addEventListener('DOMContentLoaded', callback) |
||||
} |
||||
let docsify = null |
||||
module.exports.init = function(callback) { |
||||
return new Promise((resolve, reject) => { |
||||
// return cached version / TODO: see above: this might not scale, new instance of JSDOM is reqiured
|
||||
if (docsify != null) { |
||||
return resolve(docsify) |
||||
} |
||||
ready(_ => { |
||||
docsify = new Docsify() |
||||
return resolve(docsify) |
||||
}) |
||||
|
||||
}) |
||||
} |
||||
module.exports.expectSameDom = function(actual, expected) { |
||||
const WHITESPACES_BETWEEN_TAGS = />(\s\s+)</g |
||||
function replacer(match, group1) { |
||||
return match.replace(group1, '') |
||||
} |
||||
expect(actual.replace(WHITESPACES_BETWEEN_TAGS, replacer).trim()) |
||||
.equal(expected.replace(WHITESPACES_BETWEEN_TAGS, replacer).trim()) |
||||
} |
@ -1,10 +0,0 @@ |
||||
require = require('esm')(module/*, options*/) |
||||
const {JSDOM} = require('jsdom') |
||||
const dom = new JSDOM('<!DOCTYPE html><body></body>') |
||||
|
||||
global.window = dom.window |
||||
global.document = dom.window.document |
||||
global.navigator = dom.window.navigator |
||||
global.location = dom.window.location |
||||
|
||||
require('../src/core') |
@ -0,0 +1,89 @@ |
||||
const path = require('path') |
||||
|
||||
const {expect} = require('chai') |
||||
|
||||
const {init, expectSameDom} = require('./_helper') |
||||
|
||||
describe('render', function() { |
||||
it('important content (tips)', async function() { |
||||
docsify = await init() |
||||
const output = docsify.compiler.compile('!> **Time** is money, my friend!') |
||||
expect(output).equal('<p class="tip"><strong>Time</strong> is money, my friend!</p>') |
||||
}) |
||||
|
||||
describe('lists', function() { |
||||
it('as unordered task list', async function() { |
||||
docsify = await init() |
||||
const output = docsify.compiler.compile(` |
||||
- [x] Task 1 |
||||
- [ ] Task 2 |
||||
- [ ] Task 3`)
|
||||
expect(output, `<ul class="task-list">
|
||||
<li class="task-list-item"><label><input checked="" disabled="" type="checkbox"> Task 1</label></li> |
||||
<li class="task-list-item"><label><input disabled="" type="checkbox"> Task 2</label></li> |
||||
<li class="task-list-item"><label><input disabled="" type="checkbox"> Task 3</label></li> |
||||
</ul>`) |
||||
}) |
||||
|
||||
it('as ordered task list', async function() { |
||||
docsify = await init() |
||||
const output = docsify.compiler.compile(` |
||||
1. [ ] Task 1 |
||||
2. [x] Task 2`)
|
||||
expectSameDom(output, `<ol class="task-list">
|
||||
<li class="task-list-item"><label><input disabled="" type="checkbox"> Task 1</label></li> |
||||
<li class="task-list-item"><label><input checked="" disabled="" type="checkbox"> Task 2</label></li> |
||||
</ol>`) |
||||
}) |
||||
|
||||
it('normal unordered', async function() { |
||||
docsify = await init() |
||||
const output = docsify.compiler.compile(` |
||||
- [linktext](link) |
||||
- just text`)
|
||||
expectSameDom(output, `<ul >
|
||||
<li><a href="#/link">linktext</a></li> |
||||
<li>just text</li> |
||||
</ul>`) |
||||
}) |
||||
|
||||
it('unordered with custom start', async function() { |
||||
docsify = await init() |
||||
const output = docsify.compiler.compile(` |
||||
1. first |
||||
2. second |
||||
|
||||
text |
||||
|
||||
3. third`)
|
||||
expectSameDom(output, `<ol >
|
||||
<li>first</li> |
||||
<li>second</li> |
||||
</ol> |
||||
<p>text</p> |
||||
<ol start="3"> |
||||
<li>third</li> |
||||
</ol>`) |
||||
}) |
||||
|
||||
it('nested', async function() { |
||||
docsify = await init() |
||||
const output = docsify.compiler.compile(` |
||||
- 1 |
||||
- 2 |
||||
- 2 a |
||||
- 2 b |
||||
- 3`)
|
||||
expectSameDom(output, `<ul >
|
||||
<li>1</li> |
||||
<li>2<ul > |
||||
<li>2 a</li> |
||||
<li>2 b</li> |
||||
</ul> |
||||
</li> |
||||
<li>3</li> |
||||
</ul>`) |
||||
}) |
||||
}) |
||||
|
||||
}) |
Loading…
Reference in new issue