Skip to content

Commit 8ddf15e

Browse files
committed
Added tests and fixed bug
1 parent ad106ae commit 8ddf15e

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed

src/vs/base/common/map.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -703,7 +703,7 @@ export class MRUCache<K, V> extends Cache<K, V> {
703703
}
704704

705705
override set(key: K, value: V): this {
706-
if (!this.has(key)) {
706+
if (this._limit <= this.size && !this.has(key)) {
707707
this.trim(Math.round(this._limit * this._ratio) - 1);
708708
}
709709

src/vs/base/test/common/map.test.ts

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import * as assert from 'assert';
7-
import { BidirectionalMap, LinkedMap, LRUCache, mapsStrictEqualIgnoreOrder, ResourceMap, SetMap, Touch } from 'vs/base/common/map';
7+
import { BidirectionalMap, LinkedMap, LRUCache, mapsStrictEqualIgnoreOrder, MRUCache, ResourceMap, SetMap, Touch } from 'vs/base/common/map';
88
import { extUriIgnorePathCase } from 'vs/base/common/resources';
99
import { URI } from 'vs/base/common/uri';
1010
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
@@ -259,6 +259,53 @@ suite('Map', () => {
259259
assert.deepStrictEqual([...cache.values()], values);
260260
});
261261

262+
test('LinkedMap - MRU Cache simple', () => {
263+
const cache = new MRUCache<number, number>(5);
264+
265+
[1, 2, 3, 4, 5].forEach(value => cache.set(value, value));
266+
assert.strictEqual(cache.size, 5);
267+
cache.set(6, 6);
268+
assert.strictEqual(cache.size, 5);
269+
assert.deepStrictEqual([...cache.keys()], [1, 2, 3, 4, 6]);
270+
cache.set(7, 7);
271+
assert.strictEqual(cache.size, 5);
272+
assert.deepStrictEqual([...cache.keys()], [1, 2, 3, 4, 7]);
273+
const values: number[] = [];
274+
[1, 2, 3, 4, 7].forEach(key => values.push(cache.get(key)!));
275+
assert.deepStrictEqual(values, [1, 2, 3, 4, 7]);
276+
});
277+
278+
test('LinkedMap - MRU Cache get', () => {
279+
const cache = new MRUCache<number, number>(5);
280+
281+
[1, 2, 3, 4, 5].forEach(value => cache.set(value, value));
282+
assert.strictEqual(cache.size, 5);
283+
assert.deepStrictEqual([...cache.keys()], [1, 2, 3, 4, 5]);
284+
cache.get(3);
285+
assert.deepStrictEqual([...cache.keys()], [1, 2, 4, 5, 3]);
286+
cache.peek(4);
287+
assert.deepStrictEqual([...cache.keys()], [1, 2, 4, 5, 3]);
288+
const values: number[] = [];
289+
[1, 2, 3, 4, 5].forEach(key => values.push(cache.get(key)!));
290+
assert.deepStrictEqual(values, [1, 2, 3, 4, 5]);
291+
});
292+
293+
test('LinkedMap - MRU Cache limit with ratio', () => {
294+
const cache = new MRUCache<number, number>(10, 0.5);
295+
296+
for (let i = 1; i <= 10; i++) {
297+
cache.set(i, i);
298+
}
299+
assert.strictEqual(cache.size, 10);
300+
cache.set(11, 11);
301+
assert.strictEqual(cache.size, 5);
302+
assert.deepStrictEqual([...cache.keys()], [1, 2, 3, 4, 11]);
303+
const values: number[] = [];
304+
[...cache.keys()].forEach(key => values.push(cache.get(key)!));
305+
assert.deepStrictEqual(values, [1, 2, 3, 4, 11]);
306+
assert.deepStrictEqual([...cache.values()], values);
307+
});
308+
262309
test('LinkedMap - toJSON / fromJSON', () => {
263310
let map = new LinkedMap<string, string>();
264311
map.set('ak', 'av');

0 commit comments

Comments
 (0)