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
 | |
| }
 |