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