1 | import Tile from './tile';
|
2 | import TileCache from './tile_cache';
|
3 | import {OverscaledTileID} from './tile_id';
|
4 |
|
5 | const idA = new OverscaledTileID(10, 0, 10, 0, 1);
|
6 | const idB = new OverscaledTileID(10, 0, 10, 0, 2);
|
7 | const idC = new OverscaledTileID(10, 0, 10, 0, 3);
|
8 | const idD = new OverscaledTileID(10, 0, 10, 0, 4);
|
9 | const tileA = {tileID: idA} as Tile;
|
10 | const tileA2 = {tileID: idA} as Tile;
|
11 | const tileB = {tileID: idB} as Tile;
|
12 | const tileC = {tileID: idC} as Tile;
|
13 | const tileD = {tileID: idD} as Tile;
|
14 |
|
15 | function keysExpected(cache, ids) {
|
16 | expect(cache.order).toEqual(ids.map((id) => id.key));
|
17 | }
|
18 | describe('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 |
|
69 | cache.add(idB, null);
|
70 |
|
71 | cache.add(idA, tileA);
|
72 | cache.add(idA, tileA2, 0);
|
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 | });
|