91 lines
2.3 KiB
JavaScript
91 lines
2.3 KiB
JavaScript
'use strict'
|
|
|
|
const kNone = Symbol('none')
|
|
const kProtected = Symbol('protected')
|
|
|
|
function testCommon (options) {
|
|
const factory = options.factory
|
|
const test = options.test
|
|
|
|
if (typeof factory !== 'function') {
|
|
throw new TypeError('factory must be a function')
|
|
}
|
|
|
|
if (typeof test !== 'function') {
|
|
throw new TypeError('test must be a function')
|
|
}
|
|
|
|
if (options.legacyRange != null) {
|
|
throw new Error('The legacyRange option has been removed')
|
|
}
|
|
|
|
let supports = kNone
|
|
|
|
return protect(options, {
|
|
test: test,
|
|
factory: factory,
|
|
internals: options.internals || {},
|
|
|
|
// Expose manifest through testCommon to more easily skip tests based on
|
|
// supported features. Use a getter to only create a db once. Implicitly
|
|
// we also test that the manifest doesn't change after the db constructor.
|
|
get supports () {
|
|
if (supports === kNone) this.supports = this.factory().supports
|
|
return supports
|
|
},
|
|
|
|
// Prefer assigning early via manifest-test unless test.only() is used
|
|
// in which case we create the manifest on-demand. Copy it to be safe.
|
|
set supports (value) {
|
|
if (supports === kNone) supports = JSON.parse(JSON.stringify(value))
|
|
}
|
|
})
|
|
}
|
|
|
|
module.exports = testCommon
|
|
|
|
// To help migrating from abstract-leveldown.
|
|
// Throw if test suite options are used instead of db.supports
|
|
function protect (options, testCommon) {
|
|
const legacyOptions = [
|
|
['createIfMissing', true],
|
|
['errorIfExists', true],
|
|
['snapshots', true],
|
|
['seek', true],
|
|
['encodings', true],
|
|
['deferredOpen', true],
|
|
['streams', true],
|
|
['clear', true],
|
|
['getMany', true],
|
|
['bufferKeys', false],
|
|
['serialize', false],
|
|
['idempotentOpen', false],
|
|
['passiveOpen', false],
|
|
['openCallback', false]
|
|
]
|
|
|
|
Object.defineProperty(testCommon, kProtected, {
|
|
value: true
|
|
})
|
|
|
|
for (const [k, exists] of legacyOptions) {
|
|
const msg = exists ? 'has moved to db.supports' : 'has been removed'
|
|
|
|
// Options may be a testCommon instance
|
|
if (!options[kProtected] && k in options) {
|
|
throw new Error(`The test suite option '${k}' ${msg}`)
|
|
}
|
|
|
|
Object.defineProperty(testCommon, k, {
|
|
get () {
|
|
throw new Error(`The test suite option '${k}' ${msg}`)
|
|
},
|
|
set () {
|
|
throw new Error(`The test suite option '${k}' ${msg}`)
|
|
}
|
|
})
|
|
}
|
|
|
|
return testCommon
|
|
}
|