Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/test/browser/gpu/objectCollectionBuffer.test.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { deepStrictEqual, strictEqual } from 'assert';
7
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';
8
import { createObjectCollectionBuffer, type IObjectCollectionBuffer } from '../../../browser/gpu/objectCollectionBuffer.js';
9
10
suite('ObjectCollectionBuffer', () => {
11
const store = ensureNoDisposablesAreLeakedInTestSuite();
12
13
function assertUsedData(buffer: IObjectCollectionBuffer<any>, expected: number[]) {
14
deepStrictEqual(Array.from(buffer.view.subarray(0, buffer.viewUsedSize)), expected);
15
}
16
17
test('createEntry', () => {
18
const buffer = store.add(createObjectCollectionBuffer([
19
{ name: 'a' },
20
{ name: 'b' },
21
] as const, 5));
22
assertUsedData(buffer, []);
23
24
store.add(buffer.createEntry({ a: 1, b: 2 }));
25
store.add(buffer.createEntry({ a: 3, b: 4 }));
26
store.add(buffer.createEntry({ a: 5, b: 6 }));
27
store.add(buffer.createEntry({ a: 7, b: 8 }));
28
store.add(buffer.createEntry({ a: 9, b: 10 }));
29
assertUsedData(buffer, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
30
});
31
32
test('createEntry beyond capacity', () => {
33
const buffer = store.add(createObjectCollectionBuffer([
34
{ name: 'a' },
35
{ name: 'b' },
36
] as const, 1));
37
store.add(buffer.createEntry({ a: 1, b: 2 }));
38
strictEqual(buffer.entryCount, 1);
39
strictEqual(buffer.buffer.byteLength, 8);
40
buffer.createEntry({ a: 3, b: 4 });
41
strictEqual(buffer.entryCount, 2);
42
strictEqual(buffer.buffer.byteLength, 16);
43
});
44
45
test('dispose entry', () => {
46
const buffer = store.add(createObjectCollectionBuffer([
47
{ name: 'a' },
48
{ name: 'b' },
49
] as const, 5));
50
store.add(buffer.createEntry({ a: 1, b: 2 }));
51
const entry1 = buffer.createEntry({ a: 3, b: 4 });
52
store.add(buffer.createEntry({ a: 5, b: 6 }));
53
const entry2 = buffer.createEntry({ a: 7, b: 8 });
54
store.add(buffer.createEntry({ a: 9, b: 10 }));
55
entry1.dispose();
56
entry2.dispose();
57
// Data from disposed entries is stale and doesn't need to be validated
58
assertUsedData(buffer, [1, 2, 5, 6, 9, 10]);
59
});
60
61
test('entryCount, viewUsedSize, bufferUsedSize', () => {
62
const buffer = store.add(createObjectCollectionBuffer([
63
{ name: 'foo' },
64
{ name: 'bar' },
65
] as const, 5));
66
strictEqual(buffer.entryCount, 0);
67
strictEqual(buffer.bufferUsedSize, 0);
68
strictEqual(buffer.viewUsedSize, 0);
69
buffer.createEntry({ foo: 1, bar: 2 });
70
strictEqual(buffer.entryCount, 1);
71
strictEqual(buffer.viewUsedSize, 2);
72
strictEqual(buffer.bufferUsedSize, 8);
73
const entry = buffer.createEntry({ foo: 3, bar: 4 });
74
strictEqual(buffer.entryCount, 2);
75
strictEqual(buffer.viewUsedSize, 4);
76
strictEqual(buffer.bufferUsedSize, 16);
77
entry.dispose();
78
strictEqual(buffer.entryCount, 1);
79
strictEqual(buffer.viewUsedSize, 2);
80
strictEqual(buffer.bufferUsedSize, 8);
81
});
82
83
test('entry.get', () => {
84
const buffer = store.add(createObjectCollectionBuffer([
85
{ name: 'foo' },
86
{ name: 'bar' },
87
] as const, 5));
88
const entry = store.add(buffer.createEntry({ foo: 1, bar: 2 }));
89
strictEqual(entry.get('foo'), 1);
90
strictEqual(entry.get('bar'), 2);
91
});
92
93
test('entry.set', () => {
94
const buffer = store.add(createObjectCollectionBuffer([
95
{ name: 'foo' },
96
{ name: 'bar' },
97
] as const, 5));
98
const entry = store.add(buffer.createEntry({ foo: 1, bar: 2 }));
99
let changeCount = 0;
100
store.add(buffer.onDidChange(() => changeCount++));
101
entry.set('foo', 3);
102
strictEqual(changeCount, 1);
103
strictEqual(entry.get('foo'), 3);
104
entry.set('bar', 4);
105
strictEqual(changeCount, 2);
106
strictEqual(entry.get('bar'), 4);
107
});
108
});
109
110