Revamped and reworked entire grouping and testing. Added better support for nested groups. Fixed a bunch of bugs.

master v1.0.0
Jonatan Nilsson 2021-06-02 12:08:22 +00:00
parent d7d7f1526e
commit 7c4829c36b
5 changed files with 328 additions and 214 deletions

View File

@ -1,5 +1,5 @@
# eltro # eltro
Eltro is a no-nonsense, no dependancy small test framework created to use in node 13 with ECM. Eltro is a no-nonsense, no dependancy, small test framework created to use in node 13 or higher using ECM modules.
# Installation # Installation
@ -22,7 +22,7 @@ $ npm install --save-dev eltro
$ mkdir test $ mkdir test
``` ```
Next in your favourite editor, create `test/test.js`: Next in your favourite editor, create `test/test.mjs`:
```node ```node
import { Eltro as t, assert} from 'eltro' import { Eltro as t, assert} from 'eltro'
@ -36,11 +36,11 @@ t.describe('Array', function() {
}) })
``` ```
Set up a test script in packagt.json: Set up a test script in package.json:
```json ```json
"scripts": { "scripts": {
"test": "mocha" "test": "eltro"
} }
``` ```

View File

@ -1,9 +1,50 @@
import { printError } from './cli.mjs' import { printError } from './cli.mjs'
function Group(name) { function Group(e, name) {
this.e = e
this.name = name this.name = name
this.hasExclusive = false this.hasExclusive = false
this.parent = null
this.groups = []
this.tests = [] this.tests = []
this.customTimeout = null
this.skipTest = false
this.isExclusive = false
}
Group.prototype.timeout = function(time) {
this.customTimeout = time
}
Group.prototype.skip = function() {
this.skipTest = true
}
Group.prototype.__hasonly = function(markHas) {
if (this.skipTest) return
// Set hasExclusive with either mark or existing value
// Some groups might have .only() but that doesn't mean
// the children have .only() buut they should still be run
this.hasExclusive = this.hasExclusive || markHas
// Travel upwards to the root mark all the groups along the way
let g = this.parent
while (g) {
// If the parent has skipped marked, we definitely don't wanna
// mark that we have tests with exclusivity on.
if (g.skipTest) return
g.hasExclusive = true
g = g.parent
}
this.e.hasExclusive = true
}
Group.prototype.only = function() {
this.isExclusive = true
this.__hasonly(false)
} }
function Test(e, group, name, func) { function Test(e, group, name, func) {
@ -26,7 +67,8 @@ Test.prototype.skip = function() {
} }
Test.prototype.only = function() { Test.prototype.only = function() {
this.e.hasExclusive = this.group.hasExclusive = this.isExclusive = true this.isExclusive = true
this.group.__hasonly(true)
} }
function Eltro() { function Eltro() {
@ -34,10 +76,9 @@ function Eltro() {
this.hasExclusive = false this.hasExclusive = false
this.reporter = 'list' this.reporter = 'list'
this.Eltro = Eltro this.Eltro = Eltro
this.groups = new Map() this.fileGroupMap = new Map()
this.groupsFlat = [] this.groups = []
this.activeGroup = null this.activeGroup = null
this.tests = []
this.failedTests = [] this.failedTests = []
this.hasTests = false this.hasTests = false
this.starting = false this.starting = false
@ -64,8 +105,7 @@ Eltro.prototype.begin = function() {
this.starting = true this.starting = true
this.filename = '' this.filename = ''
this.prefix = '' this.prefix = ''
this.groups.clear() this.fileGroupMap.clear()
this.tests.splice(0, this.tests.length)
} }
Eltro.prototype.__runTest = async function(stats, test) { Eltro.prototype.__runTest = async function(stats, test) {
@ -182,6 +222,23 @@ Eltro.prototype.__runTest = async function(stats, test) {
} }
} }
Eltro.prototype.__runGroup = async function(g, stats) {
if (g.tests.length) {
if (this.reporter === 'list') {
console.log(' ' + g.name)
}
}
for (let x = 0; x < g.tests.length; x++) {
if (!g.tests[x].skipTest && g.tests[x].isExclusive === g.hasExclusive) {
await this.__runTest(stats, g.tests[x])
}
}
for (let x = 0; x < g.groups.length; x++) {
if (!g.groups[x].skipTest && g.hasExclusive === (g.groups[x].hasExclusive || g.groups[x].isExclusive))
await this.__runGroup(g.groups[x], stats)
}
}
Eltro.prototype.run = async function() { Eltro.prototype.run = async function() {
if (this.reporter) { if (this.reporter) {
console.log('') console.log('')
@ -195,24 +252,12 @@ Eltro.prototype.run = async function() {
} }
let start = process.hrtime() let start = process.hrtime()
for (let i = 0; i < this.groupsFlat.length; i++) { for (let i = 0; i < this.groups.length; i++) {
let g = this.groupsFlat[i]; if (!this.groups[i].skipTest && this.hasExclusive === (this.groups[i].hasExclusive || this.groups[i].isExclusive)) {
await this.__runGroup(this.groups[i], stats)
if (g.hasExclusive === this.hasExclusive) {
if (this.reporter === 'list') {
console.log(' ' + g.name)
}
for (let x = 0; x < g.tests.length; x++) {
await this.__runTest(stats, g.tests[x])
}
} }
} }
for (let x = 0; x < this.tests.length; x++) {
if (this.tests[x].isExclusive === this.hasExclusive) {
await this.__runTest(stats, this.tests[x])
}
}
let end = process.hrtime(start) let end = process.hrtime(start)
if (this.reporter) { if (this.reporter) {
@ -232,10 +277,7 @@ Eltro.prototype.run = async function() {
if (this.failedTests.length) { if (this.failedTests.length) {
for (let x = 0; x < this.failedTests.length; x++) { for (let x = 0; x < this.failedTests.length; x++) {
let test = this.failedTests[x]; let test = this.failedTests[x];
console.log(' ' + (x + 1) + ') ' console.log(' ' + (x + 1) + ') ' + test.name + ':')
+ (test.group ? test.group.name + ': ' : '' )
+ test.name + ':'
)
printError(test.error) printError(test.error)
} }
} }
@ -243,34 +285,49 @@ Eltro.prototype.run = async function() {
} }
Eltro.prototype.setFilename = function(filename) { Eltro.prototype.setFilename = function(filename) {
this.filename = filename if (!this.fileGroupMap.has(filename)) {
let g = new Group(this, filename + ':')
this.groups.push(g)
this.fileGroupMap.set(filename, g)
}
this.activeGroup = this.fileGroupMap.get(filename)
} }
Eltro.prototype.resetFilename = function() { Eltro.prototype.resetFilename = function() {
this.filename = '' this.activeGroup = null
} }
Eltro.prototype.describe = function(name, func) { Eltro.prototype.describe = function(name, func) {
let before = this.prefix let before = this.activeGroup
// Store and set the temporary test values for entire group let prefix = before ? before.name + ' ' : ''
let beforeCurrent = this.describeTemporary
this.describeTemporary = { this.activeGroup = new Group(this, prefix + name)
timeout: this.temporary.timeout || beforeCurrent.timeout,
skip: this.temporary.skip || beforeCurrent.skip,
only: this.temporary.only || beforeCurrent.only,
}
this.temporary.timeout = 0
this.temporary.skip = this.temporary.only = false
if (before) { if (before) {
this.prefix = before + ' ' + name before.groups.push(this.activeGroup)
this.activeGroup.parent = before
this.activeGroup.customTimeout = before.customTimeout
} else { } else {
this.prefix = name this.groups.push(this.activeGroup)
} }
if (this.temporary.timeout) {
this.activeGroup.timeout(this.temporary.timeout)
this.temporary.timeout = 0
}
if (this.temporary.skip) {
this.activeGroup.skip()
this.temporary.skip = false
}
if (this.temporary.only) {
this.activeGroup.only()
this.temporary.only = false
}
func() func()
this.describeTemporary = beforeCurrent
this.prefix = before this.activeGroup = before
} }
Eltro.prototype.timeout = function(time) { Eltro.prototype.timeout = function(time) {
@ -289,36 +346,25 @@ Eltro.prototype.only = function() {
} }
Eltro.prototype.test = function(name, func) { Eltro.prototype.test = function(name, func) {
let targetName = name if (!this.activeGroup) {
if (this.prefix) { throw new Error('Tests outside groups are not allowed.')
targetName = this.prefix + ' ' + name
} }
this.hasTests = true
let group = this let test = new Test(this, this.activeGroup, this.activeGroup.name + ' ' + name, func)
if (this.filename) { this.activeGroup.tests.push(test)
if (!this.groups.has(this.filename)) {
let g = new Group(this.filename)
this.groupsFlat.push(g)
this.groups.set(this.filename, g)
}
group = this.groups.get(this.filename)
}
let test = new Test(this, group, targetName, func)
group.tests.push(test)
if ((this.temporary.only || this.describeTemporary.only) && !this.temporary.skip && !this.describeTemporary.skip) { if (this.temporary.only && !this.temporary.skip) {
test.only() test.only()
this.temporary.only = false this.temporary.only = false
} else if (this.temporary.only) { } else if (this.temporary.only) {
this.temporary.only = false this.temporary.only = false
} }
if (this.temporary.skip || this.describeTemporary.skip) { if (this.temporary.skip) {
test.skip() test.skip()
this.temporary.skip = false this.temporary.skip = false
} }
if (this.temporary.timeout || this.describeTemporary.timeout) { if (this.temporary.timeout || this.activeGroup.customTimeout) {
test.timeout(this.temporary.timeout || this.describeTemporary.timeout) test.timeout(this.temporary.timeout || this.activeGroup.customTimeout)
this.temporary.timeout = 0 this.temporary.timeout = 0
} }
return test return test

View File

@ -1,6 +1,6 @@
{ {
"name": "eltro", "name": "eltro",
"version": "0.9.1", "version": "1.0.0",
"description": "Eltro is a tiny no-dependancy test framework for node", "description": "Eltro is a tiny no-dependancy test framework for node",
"main": "index.mjs", "main": "index.mjs",
"scripts": { "scripts": {

View File

@ -6,10 +6,11 @@ t.describe('CLI', function() {
let cli = new CLI() let cli = new CLI()
t.test('#constructor() give default options', function() { t.test('#constructor() give default options', function() {
assert.strictEqual(cli.reporter, 'list') let cliTest = new CLI()
assert.deepEqual(cli.targets, ['test/**']) assert.strictEqual(cliTest.reporter, 'list')
assert.deepEqual(cli.files, []) assert.deepEqual(cliTest.targets, ['test/**'])
assert.notOk(cli.errored) assert.deepEqual(cliTest.files, [])
assert.notOk(cliTest.errored)
}) })
/***************************************** /*****************************************
@ -110,6 +111,7 @@ t.describe('CLI', function() {
await cli.processTargets() await cli.processTargets()
assert.strictEqual(cli.files.length, 2) assert.strictEqual(cli.files.length, 2)
cli.files.sort()
assert.strictEqual(cli.files[0], 'test/folder1/sampletest1.temp.mjs') assert.strictEqual(cli.files[0], 'test/folder1/sampletest1.temp.mjs')
assert.strictEqual(cli.files[1], 'test/folder1/sampletest2.temp.mjs') assert.strictEqual(cli.files[1], 'test/folder1/sampletest2.temp.mjs')
}) })
@ -119,6 +121,7 @@ t.describe('CLI', function() {
await cli.processTargets() await cli.processTargets()
assert.strictEqual(cli.files.length, 2) assert.strictEqual(cli.files.length, 2)
cli.files.sort()
assert.strictEqual(cli.files[0], 'test/folder1/sampletest1.temp.mjs') assert.strictEqual(cli.files[0], 'test/folder1/sampletest1.temp.mjs')
assert.strictEqual(cli.files[1], 'test/folder1/sampletest2.temp.mjs') assert.strictEqual(cli.files[1], 'test/folder1/sampletest2.temp.mjs')
}) })
@ -187,24 +190,12 @@ t.describe('CLI', function() {
} }
for (let i = 0; i < cli.files.length; i++) { for (let i = 0; i < cli.files.length; i++) {
if (cli.files[i] === 'test/folder1/sampletest1.temp.mjs') { found.sampletest1 = found.sampletest1 || cli.files[i] === 'test/folder1/sampletest1.temp.mjs'
found.sampletest1 = true found.sampletest2 = found.sampletest2 || cli.files[i] === 'test/folder1/sampletest2.temp.mjs'
} found.sampletest3 = found.sampletest3 || cli.files[i] === 'test/folder2/sampletest3.temp.mjs'
if (cli.files[i] === 'test/folder1/sampletest2.temp.mjs') { found.sampletest4 = found.sampletest4 || cli.files[i] === 'test/folder2/sampletest4.temp.mjs'
found.sampletest2 = true found.sampletest5 = found.sampletest5 || cli.files[i] === 'test/folder2/sampletest5.temp.txt'
} found.cli = found.cli || cli.files[i] === 'test/cli.test.mjs'
if (cli.files[i] === 'test/folder2/sampletest3.temp.mjs') {
found.sampletest3 = true
}
if (cli.files[i] === 'test/folder2/sampletest4.temp.mjs') {
found.sampletest4 = true
}
if (cli.files[i] === 'test/folder2/sampletest5.temp.txt') {
found.sampletest5 = true
}
if (cli.files[i] === 'test/cli.test.mjs') {
found.cli = true
}
} }
assert.deepEqual(found, { assert.deepEqual(found, {
@ -233,24 +224,12 @@ t.describe('CLI', function() {
} }
for (let i = 0; i < cli.files.length; i++) { for (let i = 0; i < cli.files.length; i++) {
if (cli.files[i] === 'test/folder1/sampletest1.temp.mjs') { found.sampletest1 = found.sampletest1 || cli.files[i] === 'test/folder1/sampletest1.temp.mjs'
found.sampletest1 = true found.sampletest2 = found.sampletest2 || cli.files[i] === 'test/folder1/sampletest2.temp.mjs'
} found.sampletest3 = found.sampletest3 || cli.files[i] === 'test/folder2/sampletest3.temp.mjs'
if (cli.files[i] === 'test/folder1/sampletest2.temp.mjs') { found.sampletest4 = found.sampletest4 || cli.files[i] === 'test/folder2/sampletest4.temp.mjs'
found.sampletest2 = true found.sampletest5 = found.sampletest5 || cli.files[i] === 'test/folder2/sampletest5.temp.txt'
} found.cli = found.cli || cli.files[i] === 'test/cli.test.mjs'
if (cli.files[i] === 'test/folder2/sampletest3.temp.mjs') {
found.sampletest3 = true
}
if (cli.files[i] === 'test/folder2/sampletest4.temp.mjs') {
found.sampletest4 = true
}
if (cli.files[i] === 'test/folder2/sampletest5.temp.txt') {
found.sampletest5 = true
}
if (cli.files[i] === 'test/cli.test.mjs') {
found.cli = true
}
} }
assert.deepEqual(found, { assert.deepEqual(found, {

View File

@ -10,23 +10,18 @@ function CreateT() {
return t return t
} }
e.test('Eltro describe should add prefix to the group tests', async function() { e.test('Eltro should fail if tests are not within a group', function() {
testsWereRun = true assert.throws(function() {
const assertPrefix = 'something' const t = CreateT()
const assertName = 'blabla' t.begin()
const t = CreateT() t.test('should throw', function() {})
t.begin() }, function(e) {
t.setFilename('test') assert.match(e.message, /outside/)
t.describe(assertPrefix, function() { return true
t.test(assertName, function() {})
}) })
assert.strictEqual(t.groupsFlat.length, 1)
assert.strictEqual(t.groupsFlat[0].tests.length, 1)
assert.strictEqual(t.groupsFlat[0].tests[0].name, assertPrefix + ' ' + assertName)
}) })
e.test('Eltro describe should add prefix to individual tests', async function() { e.test('Eltro describe should group tests', async function() {
testsWereRun = true testsWereRun = true
const assertPrefix = 'something' const assertPrefix = 'something'
const assertName = 'blabla' const assertName = 'blabla'
@ -36,25 +31,50 @@ e.test('Eltro describe should add prefix to individual tests', async function()
t.test(assertName, function() {}) t.test(assertName, function() {})
}) })
assert.strictEqual(t.tests.length, 1) assert.strictEqual(t.groups.length, 1)
assert.strictEqual(t.tests[0].name, assertPrefix + ' ' + assertName) assert.strictEqual(t.groups[0].tests.length, 1)
assert.strictEqual(t.groups[0].tests[0].name, assertPrefix + ' ' + assertName)
}) })
e.test('Eltro describe should support multiple describe', async function() { e.test('Eltro setFilename should activate a new for said file', async function() {
testsWereRun = true
const assertFilePrefix = 'testety'
const assertPrefix = 'something'
const assertName = 'blabla'
const t = CreateT()
t.begin()
t.setFilename(assertFilePrefix)
t.describe(assertPrefix, function() {
t.test(assertName, function() {})
})
assert.strictEqual(t.groups.length, 1)
assert.strictEqual(t.groups[0].tests.length, 0)
assert.strictEqual(t.groups[0].groups.length, 1)
assert.strictEqual(t.groups[0].groups[0].tests.length, 1)
assert.strictEqual(t.groups[0].groups[0].tests[0].name, assertFilePrefix + ': ' + assertPrefix + ' ' + assertName)
})
e.test('Eltro describe should support nested describe', async function() {
testsWereRun = true testsWereRun = true
const assertPrefix = 'something' const assertPrefix = 'something'
const assertPrefix2 = 'else' const assertPrefix2 = 'else'
const assertName = 'blabla' const assertName = 'blabla'
const assertFile = 'asdf.js'
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.setFilename(assertFile)
t.describe(assertPrefix, function() { t.describe(assertPrefix, function() {
t.describe(assertPrefix2, function() { t.describe(assertPrefix2, function() {
t.test(assertName, function() {}) t.test(assertName, function() {})
}) })
}) })
t.resetFilename()
assert.strictEqual(t.tests.length, 1) assert.strictEqual(t.groups.length, 1)
assert.strictEqual(t.tests[0].name, assertPrefix + ' ' + assertPrefix2 + ' ' + assertName) assert.strictEqual(t.groups[0].groups.length, 1)
assert.strictEqual(t.groups[0].groups[0].groups.length, 1)
assert.strictEqual(t.groups[0].groups[0].groups[0].tests[0].name, assertFile + ': ' + assertPrefix + ' ' + assertPrefix2 + ' ' + assertName)
}) })
e.test('Eltro should run test', async function() { e.test('Eltro should run test', async function() {
@ -62,8 +82,29 @@ e.test('Eltro should run test', async function() {
let assertIsTrue = false let assertIsTrue = false
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.test('', function() { t.describe('', function() {
assertIsTrue = true t.test('', function() {
assertIsTrue = true
})
})
await t.run()
assert.strictEqual(t.failedTests.length, 0)
assert.strictEqual(assertIsTrue, true)
})
e.test('Eltro should run tests in nested groups', async function() {
testsWereRun = true
let assertIsTrue = false
const t = CreateT()
t.begin()
t.describe('1', function() {
t.describe('2', function() {
t.describe('3', function() {
t.test('', function() {
assertIsTrue = true
})
})
})
}) })
await t.run() await t.run()
assert.strictEqual(t.failedTests.length, 0) assert.strictEqual(t.failedTests.length, 0)
@ -75,10 +116,12 @@ e.test('Eltro should run promised test', async function() {
let assertIsTrue = false let assertIsTrue = false
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.test('', function() { t.describe('', function() {
return new Promise(function(res) { t.test('', function() {
assertIsTrue = true return new Promise(function(res) {
res() assertIsTrue = true
res()
})
}) })
}) })
await t.run() await t.run()
@ -91,11 +134,13 @@ e.test('Eltro should support callback', async function() {
let assertIsTrue = false let assertIsTrue = false
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.test('', function(cb) { t.describe('', function() {
setTimeout(function() { t.test('', function(cb) {
assertIsTrue = true setTimeout(function() {
cb() assertIsTrue = true
}, 50) cb()
}, 25)
})
}) })
await t.run() await t.run()
assert.strictEqual(t.failedTests.length, 0) assert.strictEqual(t.failedTests.length, 0)
@ -107,8 +152,10 @@ e.test('Eltro should support directly thrown errors', async function() {
const assertError = new Error() const assertError = new Error()
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.test('', function() { t.describe('', function() {
throw assertError t.test('', function() {
throw assertError
})
}) })
await t.run() await t.run()
assert.strictEqual(t.failedTests.length, 1) assert.strictEqual(t.failedTests.length, 1)
@ -120,9 +167,11 @@ e.test('Eltro should support promise rejected errors', async function() {
const assertError = new Error() const assertError = new Error()
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.test('', function() { t.describe('', function() {
return new Promise(function(res, rej) { t.test('', function() {
rej(assertError) return new Promise(function(res, rej) {
rej(assertError)
})
}) })
}) })
await t.run() await t.run()
@ -135,8 +184,10 @@ e.test('Eltro should support callback rejected errors', async function() {
const assertError = new Error() const assertError = new Error()
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.test('', function(cb) { t.describe('', function() {
cb(assertError) t.test('', function(cb) {
cb(assertError)
})
}) })
await t.run() await t.run()
assert.strictEqual(t.failedTests.length, 1) assert.strictEqual(t.failedTests.length, 1)
@ -147,7 +198,9 @@ e.test('Eltro should support timing out tests', async function() {
testsWereRun = true testsWereRun = true
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.test('', function(cb) { }).timeout(50) t.describe('', function() {
t.test('', function(cb) { }).timeout(50)
})
await t.run() await t.run()
assert.strictEqual(t.failedTests.length, 1) assert.strictEqual(t.failedTests.length, 1)
assert.ok(t.failedTests[0].error) assert.ok(t.failedTests[0].error)
@ -158,11 +211,13 @@ e.test('Eltro should support timed out tests on late tests', async function() {
testsWereRun = true testsWereRun = true
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.test('', function(cb) { t.describe('', function() {
setTimeout(function() { t.test('', function(cb) {
cb() setTimeout(function() {
}, 100) cb()
}).timeout(50) }, 100)
}).timeout(50)
})
await t.run() await t.run()
assert.strictEqual(t.failedTests.length, 1) assert.strictEqual(t.failedTests.length, 1)
assert.ok(t.failedTests[0].error) assert.ok(t.failedTests[0].error)
@ -173,9 +228,11 @@ e.test('Eltro should support skipped tests', async function() {
testsWereRun = true testsWereRun = true
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.test('', function() { t.describe('', function() {
throw new Error('Should not be called') t.test('', function() {
}).skip() throw new Error('Should not be called')
}).skip()
})
await t.run() await t.run()
assert.strictEqual(t.failedTests.length, 0) assert.strictEqual(t.failedTests.length, 0)
}) })
@ -185,9 +242,11 @@ e.test('Eltro should support only tests', async function() {
let assertIsTrue = false let assertIsTrue = false
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.test('a', function() { throw new Error('Should not be called') }) t.describe('', function() {
t.test('b', function() { throw new Error('Should not be called') }) t.test('a', function() { throw new Error('Should not be called') })
t.test('c', function() { assertIsTrue = true }).only() t.test('b', function() { throw new Error('Should not be called') })
t.test('c', function() { assertIsTrue = true }).only()
})
await t.run() await t.run()
assert.strictEqual(t.failedTests.length, 0) assert.strictEqual(t.failedTests.length, 0)
assert.strictEqual(assertIsTrue, true) assert.strictEqual(assertIsTrue, true)
@ -197,8 +256,12 @@ e.test('Eltro should support timed out tests in front', async function() {
testsWereRun = true testsWereRun = true
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.timeout(25).test('', function(cb) { setTimeout(cb, 50) })
t.test('', function(cb) { setTimeout(cb, 50) }) t.describe('', function() {
t.timeout(25).test('', function(cb) { setTimeout(cb, 50) })
t.test('', function(cb) { setTimeout(cb, 50) })
})
await t.run() await t.run()
assert.strictEqual(t.failedTests.length, 1) assert.strictEqual(t.failedTests.length, 1)
assert.ok(t.failedTests[0].error) assert.ok(t.failedTests[0].error)
@ -210,8 +273,11 @@ e.test('Eltro should support skipped tests in front of the test', async function
let assertIsTrue = false let assertIsTrue = false
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.skip().test('', function() { throw new Error('Should not be called') })
t.test('', function() { assertIsTrue = true }) t.describe('', function() {
t.skip().test('', function() { throw new Error('Should not be called') })
t.test('', function() { assertIsTrue = true })
})
await t.run() await t.run()
assert.strictEqual(t.failedTests.length, 0) assert.strictEqual(t.failedTests.length, 0)
assert.strictEqual(assertIsTrue, true) assert.strictEqual(assertIsTrue, true)
@ -222,9 +288,13 @@ e.test('Eltro should support only tests in front of the test', async function()
let assertIsTrue = false let assertIsTrue = false
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.test('a', function() { throw new Error('Should not be called') })
t.only().test('b', function() { assertIsTrue = true }) t.describe('', function() {
t.test('c', function() { throw new Error('Should not be called') }) t.test('a', function() { throw new Error('Should not be called') })
t.only().test('b', function() { assertIsTrue = true })
t.test('c', function() { throw new Error('Should not be called') })
})
await t.run() await t.run()
assert.strictEqual(t.failedTests.length, 0) assert.strictEqual(t.failedTests.length, 0)
assert.strictEqual(assertIsTrue, true) assert.strictEqual(assertIsTrue, true)
@ -234,14 +304,18 @@ e.test('Eltro should support timed out describes', async function() {
testsWereRun = true testsWereRun = true
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.timeout(10).describe('', function() {
t.test('', function(cb) { setTimeout(cb, 25) })
t.test('', function(cb) { setTimeout(cb, 25) })
})
t.describe('', function() { t.describe('', function() {
t.timeout(10).describe('', function() {
t.test('', function(cb) { setTimeout(cb, 25) })
t.test('', function(cb) { setTimeout(cb, 25) })
})
t.describe('', function() {
t.test('', function(cb) { setTimeout(cb, 25) })
})
t.test('', function(cb) { setTimeout(cb, 25) }) t.test('', function(cb) { setTimeout(cb, 25) })
}) })
t.test('', function(cb) { setTimeout(cb, 25) })
await t.run() await t.run()
assert.strictEqual(t.failedTests.length, 2) assert.strictEqual(t.failedTests.length, 2)
assert.ok(t.failedTests[0].error) assert.ok(t.failedTests[0].error)
@ -255,15 +329,17 @@ e.test('Eltro should support skipped tests in describe', async function() {
let assertRan = 0 let assertRan = 0
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.skip().describe('', function() {
t.test('', function() { throw new Error('Should not be called') })
t.test('', function() { throw new Error('Should not be called') })
t.test('', function() { throw new Error('Should not be called') })
})
t.describe('', function() { t.describe('', function() {
t.skip().describe('', function() {
t.test('', function() { throw new Error('Should not be called') })
t.test('', function() { throw new Error('Should not be called') })
t.test('', function() { throw new Error('Should not be called') })
})
t.describe('', function() {
t.test('', function() { assertRan++ })
})
t.test('', function() { assertRan++ }) t.test('', function() { assertRan++ })
}) })
t.test('', function() { assertRan++ })
await t.run() await t.run()
assert.strictEqual(t.failedTests.length, 0) assert.strictEqual(t.failedTests.length, 0)
assert.strictEqual(assertRan, 2) assert.strictEqual(assertRan, 2)
@ -274,18 +350,20 @@ e.test('Eltro should have skip at higher importance than only', async function()
let assertRan = 0 let assertRan = 0
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.skip().describe('', function() {
t.only().test('', function() { throw new Error('Should not be called') })
t.only().test('', function() { throw new Error('Should not be called') })
t.only().test('', function() { throw new Error('Should not be called') })
})
t.describe('', function() { t.describe('', function() {
t.skip().describe('', function() {
t.only().test('', function() { throw new Error('Should not be called') })
t.only().test('', function() { throw new Error('Should not be called') })
t.only().test('', function() { throw new Error('Should not be called') })
})
t.describe('', function() {
t.test('', function() { assertRan++ })
})
t.test('', function() { assertRan++ }) t.test('', function() { assertRan++ })
}) })
t.test('', function() { assertRan++ })
await t.run() await t.run()
assert.strictEqual(t.failedTests.length, 0) assert.strictEqual(t.failedTests.length, 0, 'failed tests should be 0 but was ' + t.failedTests.length)
assert.strictEqual(assertRan, 2) assert.strictEqual(assertRan, 2, 'tests run should be two but was ' + assertRan)
}) })
e.test('Eltro should support nested skip in describe commands', async function() { e.test('Eltro should support nested skip in describe commands', async function() {
@ -293,17 +371,19 @@ e.test('Eltro should support nested skip in describe commands', async function()
let assertRan = 0 let assertRan = 0
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.skip().describe('', function() {
t.describe('', function() {
t.only().test('', function() { throw new Error('Should not be called') })
t.only().test('', function() { throw new Error('Should not be called') })
t.only().test('', function() { throw new Error('Should not be called') })
})
})
t.describe('', function() { t.describe('', function() {
t.skip().describe('', function() {
t.describe('', function() {
t.only().test('', function() { throw new Error('Should not be called') })
t.only().test('', function() { throw new Error('Should not be called') })
t.only().test('', function() { throw new Error('Should not be called') })
})
})
t.describe('', function() {
t.test('', function() { assertRan++ })
})
t.test('', function() { assertRan++ }) t.test('', function() { assertRan++ })
}) })
t.test('', function() { assertRan++ })
await t.run() await t.run()
assert.strictEqual(t.failedTests.length, 0) assert.strictEqual(t.failedTests.length, 0)
assert.strictEqual(assertRan, 2) assert.strictEqual(assertRan, 2)
@ -314,14 +394,16 @@ e.test('Eltro should support only tests in front of the test', async function()
let assertRan = 0 let assertRan = 0
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.only().describe('', function() {
t.test('', function() { assertRan++ })
t.test('', function() { assertRan++ })
})
t.describe('', function() { t.describe('', function() {
t.test('a', function() { throw new Error('Should not be called') }) t.only().describe('', function() {
t.test('', function() { assertRan++ })
t.test('', function() { assertRan++ })
})
t.describe('', function() {
t.test('a', function() { throw new Error('Should not be called') })
})
t.test('c', function() { throw new Error('Should not be called') })
}) })
t.test('c', function() { throw new Error('Should not be called') })
await t.run() await t.run()
assert.strictEqual(t.failedTests.length, 0, 'failed tests should be 0 but was ' + t.failedTests.length) assert.strictEqual(t.failedTests.length, 0, 'failed tests should be 0 but was ' + t.failedTests.length)
assert.strictEqual(assertRan, 2) assert.strictEqual(assertRan, 2)
@ -332,16 +414,18 @@ e.test('Eltro should support nexted only tests in front of the test', async func
let assertRan = 0 let assertRan = 0
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.only().describe('', function() {
t.describe('', function() {
t.test('', function() { assertRan++ })
t.test('', function() { assertRan++ })
})
})
t.describe('', function() { t.describe('', function() {
t.test('a', function() { throw new Error('Should not be called') }) t.only().describe('', function() {
t.describe('', function() {
t.test('', function() { assertRan++ })
t.test('', function() { assertRan++ })
})
})
t.describe('', function() {
t.test('a', function() { throw new Error('Should not be called') })
})
t.test('c', function() { throw new Error('Should not be called') })
}) })
t.test('c', function() { throw new Error('Should not be called') })
await t.run() await t.run()
assert.strictEqual(t.failedTests.length, 0, 'failed tests should be 0 but was ' + t.failedTests.length) assert.strictEqual(t.failedTests.length, 0, 'failed tests should be 0 but was ' + t.failedTests.length)
assert.strictEqual(assertRan, 2) assert.strictEqual(assertRan, 2)
@ -351,16 +435,18 @@ e.test('Eltro should support nested timed out describes', async function() {
testsWereRun = true testsWereRun = true
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.timeout(10).describe('', function() { t.describe('', function() {
t.timeout(10).describe('', function() {
t.describe('', function() {
t.test('', function(cb) { setTimeout(cb, 25) })
t.test('', function(cb) { setTimeout(cb, 25) })
})
})
t.describe('', function() { t.describe('', function() {
t.test('', function(cb) { setTimeout(cb, 25) }) t.test('', function(cb) { setTimeout(cb, 25) })
t.test('', function(cb) { setTimeout(cb, 25) })
}) })
})
t.describe('', function() {
t.test('', function(cb) { setTimeout(cb, 25) }) t.test('', function(cb) { setTimeout(cb, 25) })
}) })
t.test('', function(cb) { setTimeout(cb, 25) })
await t.run() await t.run()
assert.strictEqual(t.failedTests.length, 2) assert.strictEqual(t.failedTests.length, 2)
assert.ok(t.failedTests[0].error) assert.ok(t.failedTests[0].error)
@ -373,16 +459,18 @@ e.test('Eltro nested timeout should work as expected', async function() {
testsWereRun = true testsWereRun = true
const t = CreateT() const t = CreateT()
t.begin() t.begin()
t.timeout(50).describe('', function() { t.describe('', function() {
t.timeout(10).describe('', function() { t.timeout(50).describe('', function() {
t.timeout(10).describe('', function() {
t.test('', function(cb) { setTimeout(cb, 25) })
})
t.test('', function(cb) { setTimeout(cb, 25) })
})
t.describe('', function() {
t.test('', function(cb) { setTimeout(cb, 25) }) t.test('', function(cb) { setTimeout(cb, 25) })
}) })
t.test('', function(cb) { setTimeout(cb, 25) }) t.test('', function(cb) { setTimeout(cb, 25) })
}) })
t.describe('', function() {
t.test('', function(cb) { setTimeout(cb, 25) })
})
t.test('', function(cb) { setTimeout(cb, 25) })
await t.run() await t.run()
assert.strictEqual(t.failedTests.length, 1) assert.strictEqual(t.failedTests.length, 1)
assert.ok(t.failedTests[0].error) assert.ok(t.failedTests[0].error)
@ -394,6 +482,7 @@ process.on('exit', function(e) {
try { try {
assert.strictEqual(testsWereRun, true) assert.strictEqual(testsWereRun, true)
} catch(err) { } catch(err) {
console.log('Checking if tests were run at all failed:')
printError(err) printError(err)
process.exit(1) process.exit(1)
} }