bemuse/src/game/loaders/samples-loader.spec.js
import assert from 'assert'
import SamplesLoader from './samples-loader'
describe('SamplesLoader', function () {
let assets
let master
let loader
let keysoundCache
beforeEach(function () {
assets = { file: sinon.stub() }
master = { decode: sinon.stub(), sample: sinon.stub() }
keysoundCache = { isCached: () => false, cache: sinon.spy(() => {}) }
loader = new SamplesLoader(assets, master, { keysoundCache })
})
describe('#loadFiles', function () {
it('should not include undecodable audio', function () {
assets.file.returns(Promise.reject(new Error('cannot decode')))
assets.file.withArgs('a.wav').returns(
Promise.resolve({
read: () => Promise.resolve('ok1'),
})
)
master.decode.withArgs('ok1').returns(Promise.reject(new Error('..')))
return expect(loader.loadFiles(['a.wav'])).to.eventually.deep.eq({})
})
it('should cache', function () {
assets.file.returns(Promise.reject(new Error('invalid filename')))
assets.file.withArgs('a.wav').returns(
Promise.resolve({
read: () => Promise.resolve('ok1'),
})
)
master.decode.withArgs('ok1').returns(Promise.resolve('ok2'))
master.sample.withArgs('ok2').returns(Promise.resolve('ok3'))
return loader.loadFiles(['a.wav']).then(() => {
assert(keysoundCache.cache.calledOnce)
assert(keysoundCache.cache.calledWith('a.wav', 'ok2'))
})
})
it('should use cache', function () {
assets.file.returns(Promise.reject(new Error('unexpected call')))
keysoundCache.isCached = (name) => name === 'name.wav'
keysoundCache.get = (name) => {
if (name === 'name.wav') return 'buffer'
throw new Error('expected name.wav')
}
master.sample.withArgs('buffer').returns(Promise.resolve('sample'))
return expect(loader.loadFiles(['name.wav'])).to.eventually.deep.eq({
'name.wav': 'sample',
})
})
it('should try mp3', function () {
assets.file.returns(Promise.reject(new Error('invalid filename')))
assets.file.withArgs('a.mp3').returns(
Promise.resolve({
read: () => Promise.resolve('ok1'),
})
)
master.decode.withArgs('ok1').returns(Promise.resolve('ok2'))
master.sample.withArgs('ok2').returns(Promise.resolve('ok3'))
return expect(loader.loadFiles(['a.wav'])).to.eventually.deep.eq({
'a.wav': 'ok3',
})
})
it('should not include failed matches', function () {
assets.file.returns(Promise.reject(new Error('i give up')))
return expect(loader.loadFiles(['a.wav'])).to.eventually.deep.eq({})
})
})
})