mapcap
Version:
Apply a size limit to a Map class or instance
54 lines (42 loc) • 1.34 kB
JavaScript
const tap = require('tap')
const mapcap = require('./')
const cap = 5
tap.test('instance', t => {
validate(t, mapcap(new Map(), cap))
})
tap.test('instance - least recently used', t => {
validate(t, mapcap(new Map(), cap, true), true)
})
tap.test('class', t => {
const CappedMap = mapcap(Map, cap)
validate(t, new CappedMap())
})
tap.test('class - least recently used', t => {
const CappedMap = mapcap(Map, cap, true)
validate(t, new CappedMap(), true)
})
function validate (t, instance, lru) {
t.ok(instance instanceof Map, 'is an instance of Map')
t.equal(instance.size, 0, 'is empty')
// Verify the size is capped
for (let i = 0; i < cap; i++) {
instance.set(`key #${i}`, 'data')
t.equal(instance.size, i + 1, `has size of ${i + 1}`)
}
// Walk the map backwards to re-order least-recently-used state
if (lru) {
for (let i = cap; i; i--) {
instance.get(`key #${i}`)
}
}
instance.set('should rotate old key out', 'data')
t.equal(instance.size, cap, `still has only ${cap} items`)
if (lru) {
t.notOk(instance.has(`key #${cap}`), 'does not have last item')
t.ok(instance.has(`key #${cap - 1}`), 'has second last item')
} else {
t.notOk(instance.has('key #0'), 'does not have first item')
t.ok(instance.has('key #1'), 'has second item')
}
t.end()
}