UNPKG

3.99 kBPlain TextView Raw
1import Tile from './tile';
2import TileCache from './tile_cache';
3import {OverscaledTileID} from './tile_id';
4
5const idA = new OverscaledTileID(10, 0, 10, 0, 1);
6const idB = new OverscaledTileID(10, 0, 10, 0, 2);
7const idC = new OverscaledTileID(10, 0, 10, 0, 3);
8const idD = new OverscaledTileID(10, 0, 10, 0, 4);
9const tileA = {tileID: idA} as Tile;
10const tileA2 = {tileID: idA} as Tile;
11const tileB = {tileID: idB} as Tile;
12const tileC = {tileID: idC} as Tile;
13const tileD = {tileID: idD} as Tile;
14
15function keysExpected(cache, ids) {
16 expect(cache.order).toEqual(ids.map((id) => id.key));
17}
18describe('TileCache', () => {
19 test('complex flow', () => {
20 const cache = new TileCache(10, (removed) => {
21 expect(removed).toBe('dc');
22 });
23 expect(cache.getAndRemove(idC)).toBeNull();
24 expect(cache.add(idA, tileA)).toBe(cache);
25 keysExpected(cache, [idA]);
26 expect(cache.has(idA)).toBe(true);
27 expect(cache.getAndRemove(idA)).toBe(tileA);
28 expect(cache.getAndRemove(idA)).toBeNull();
29 expect(cache.has(idA)).toBe(false);
30 keysExpected(cache, []);
31 });
32
33 test('get without removing', done => {
34 const cache = new TileCache(10, () => {
35 done('test "get without removing" failed');
36 });
37 expect(cache.add(idA, tileA)).toBe(cache);
38 expect(cache.get(idA)).toBe(tileA);
39 keysExpected(cache, [idA]);
40 expect(cache.get(idA)).toBe(tileA);
41 done();
42 });
43
44 test('duplicate add', done => {
45 const cache = new TileCache(10, () => {
46 done('test "duplicate add" failed');
47 });
48
49 cache.add(idA, tileA);
50 cache.add(idA, tileA2);
51
52 keysExpected(cache, [idA, idA]);
53 expect(cache.has(idA)).toBeTruthy();
54 expect(cache.getAndRemove(idA)).toBe(tileA);
55 expect(cache.has(idA)).toBeTruthy();
56 expect(cache.getAndRemove(idA)).toBe(tileA2);
57 done();
58 });
59
60 test('expiry', () => {
61 const cache = new TileCache(10, (removed) => {
62 expect(cache.has(idB)).toBeTruthy();
63 expect(removed).toBe(tileA2);
64 });
65
66 cache.add(idB, tileB, 0);
67 cache.getAndRemove(idB);
68 // removing clears the expiry timeout
69 cache.add(idB, null);
70
71 cache.add(idA, tileA);
72 cache.add(idA, tileA2, 0); // expires immediately and `onRemove` is called.
73 });
74
75 test('remove', () => {
76 const cache = new TileCache(10, () => {});
77
78 cache.add(idA, tileA);
79 cache.add(idB, tileB);
80 cache.add(idC, tileC);
81
82 keysExpected(cache, [idA, idB, idC]);
83 expect(cache.has(idB)).toBeTruthy();
84
85 cache.remove(idB);
86
87 keysExpected(cache, [idA, idC]);
88 expect(cache.has(idB)).toBeFalsy();
89
90 expect(cache.remove(idB)).toBeTruthy();
91
92 });
93
94 test('overflow', () => {
95 const cache = new TileCache(1, (removed) => {
96 expect(removed).toBe(tileA);
97 });
98 cache.add(idA, tileA);
99 cache.add(idB, tileB);
100
101 expect(cache.has(idB)).toBeTruthy();
102 expect(cache.has(idA)).toBeFalsy();
103 });
104
105 test('.reset', () => {
106 let called;
107 const cache = new TileCache(10, (removed) => {
108 expect(removed).toBe(tileA);
109 called = true;
110 });
111 cache.add(idA, tileA);
112 expect(cache.reset()).toBe(cache);
113 expect(cache.has(idA)).toBe(false);
114 expect(called).toBeTruthy();
115 });
116
117 test('.setMaxSize', () => {
118 let numRemoved = 0;
119 const cache = new TileCache(10, () => {
120 numRemoved++;
121 });
122 cache.add(idA, tileA);
123 cache.add(idB, tileB);
124 cache.add(idC, tileC);
125 expect(numRemoved).toBe(0);
126 cache.setMaxSize(15);
127 expect(numRemoved).toBe(0);
128 cache.setMaxSize(1);
129 expect(numRemoved).toBe(2);
130 cache.add(idD, tileD);
131 expect(numRemoved).toBe(3);
132 });
133});