Path: blob/main/src/vs/base/test/common/history.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*--------------------------------------------------------------------------------------------*/4import assert from 'assert';5import { HistoryNavigator, HistoryNavigator2 } from '../../common/history.js';6import { ensureNoDisposablesAreLeakedInTestSuite } from './utils.js';78suite('History Navigator', () => {910ensureNoDisposablesAreLeakedInTestSuite();1112test('create reduces the input to limit', () => {13const testObject = new HistoryNavigator(new Set(['1', '2', '3', '4']), 2);1415assert.deepStrictEqual(['3', '4'], toArray(testObject));16});1718test('create sets the position after last', () => {19const testObject = new HistoryNavigator(new Set(['1', '2', '3', '4']), 100);2021assert.strictEqual(testObject.current(), null);22assert.strictEqual(testObject.isNowhere(), true);23assert.strictEqual(testObject.isFirst(), false);24assert.strictEqual(testObject.isLast(), false);25assert.strictEqual(testObject.next(), null);26assert.strictEqual(testObject.previous(), '4');27assert.strictEqual(testObject.isNowhere(), false);28assert.strictEqual(testObject.isFirst(), false);29assert.strictEqual(testObject.isLast(), true);30});3132test('last returns last element', () => {33const testObject = new HistoryNavigator(new Set(['1', '2', '3', '4']), 100);3435assert.strictEqual(testObject.first(), '1');36assert.strictEqual(testObject.last(), '4');37assert.strictEqual(testObject.isFirst(), false);38assert.strictEqual(testObject.isLast(), true);39});4041test('first returns first element', () => {42const testObject = new HistoryNavigator(new Set(['1', '2', '3', '4']), 3);4344assert.strictEqual('2', testObject.first());45assert.strictEqual(testObject.isFirst(), true);46assert.strictEqual(testObject.isLast(), false);47});4849test('next returns next element', () => {50const testObject = new HistoryNavigator(new Set(['1', '2', '3', '4']), 3);5152testObject.first();5354assert.strictEqual(testObject.next(), '3');55assert.strictEqual(testObject.next(), '4');56assert.strictEqual(testObject.next(), null);57});5859test('previous returns previous element', () => {60const testObject = new HistoryNavigator(new Set(['1', '2', '3', '4']), 3);6162assert.strictEqual(testObject.previous(), '4');63assert.strictEqual(testObject.previous(), '3');64assert.strictEqual(testObject.previous(), '2');65assert.strictEqual(testObject.previous(), null);66});6768test('next on last element returns null and remains on last', () => {69const testObject = new HistoryNavigator(new Set(['1', '2', '3', '4']), 3);7071testObject.first();72testObject.last();7374assert.strictEqual(testObject.isLast(), true);75assert.strictEqual(testObject.current(), '4');76assert.strictEqual(testObject.next(), null);77assert.strictEqual(testObject.isLast(), false); // Stepping past the last element, is no longer "last"78});7980test('previous on first element returns null and remains on first', () => {81const testObject = new HistoryNavigator(new Set(['1', '2', '3', '4']), 3);8283testObject.first();8485assert.strictEqual(testObject.isFirst(), true);86assert.strictEqual(testObject.current(), '2');87assert.strictEqual(testObject.previous(), null);88assert.strictEqual(testObject.isFirst(), true);89});9091test('add reduces the input to limit', () => {92const testObject = new HistoryNavigator(new Set(['1', '2', '3', '4']), 2);9394testObject.add('5');9596assert.deepStrictEqual(toArray(testObject), ['4', '5']);97});9899test('adding existing element changes the position', () => {100const testObject = new HistoryNavigator(new Set(['1', '2', '3', '4']), 5);101102testObject.add('2');103104assert.deepStrictEqual(toArray(testObject), ['1', '3', '4', '2']);105});106107test('add resets the navigator to last', () => {108const testObject = new HistoryNavigator(new Set(['1', '2', '3', '4']), 3);109110testObject.first();111testObject.add('5');112113assert.strictEqual(testObject.previous(), '5');114assert.strictEqual(testObject.isLast(), true);115assert.strictEqual(testObject.next(), null);116assert.strictEqual(testObject.isLast(), false);117});118119test('adding an existing item changes the order', () => {120const testObject = new HistoryNavigator(new Set(['1', '2', '3']));121122testObject.add('1');123124assert.deepStrictEqual(['2', '3', '1'], toArray(testObject));125});126127test('previous returns null if the current position is the first one', () => {128const testObject = new HistoryNavigator(new Set(['1', '2', '3']));129130testObject.first();131132assert.deepStrictEqual(testObject.previous(), null);133assert.strictEqual(testObject.isFirst(), true);134});135136test('previous returns object if the current position is not the first one', () => {137const testObject = new HistoryNavigator(new Set(['1', '2', '3']));138139testObject.first();140testObject.next();141142assert.deepStrictEqual(testObject.previous(), '1');143});144145test('next returns null if the current position is the last one', () => {146const testObject = new HistoryNavigator(new Set(['1', '2', '3']));147148testObject.last();149150assert.strictEqual(testObject.isLast(), true);151assert.deepStrictEqual(testObject.next(), null);152assert.strictEqual(testObject.isLast(), false);153});154155test('next returns object if the current position is not the last one', () => {156const testObject = new HistoryNavigator(new Set(['1', '2', '3']));157158testObject.last();159testObject.previous();160161assert.deepStrictEqual(testObject.next(), '3');162});163164test('clear', () => {165const testObject = new HistoryNavigator(new Set(['a', 'b', 'c']));166assert.strictEqual(testObject.previous(), 'c');167testObject.clear();168assert.strictEqual(testObject.current(), null);169assert.strictEqual(testObject.isNowhere(), true);170});171172function toArray(historyNavigator: HistoryNavigator<string>): Array<string | null> {173const result: Array<string | null> = [];174historyNavigator.first();175if (historyNavigator.current()) {176do {177result.push(historyNavigator.current()!);178} while (historyNavigator.next());179}180return result;181}182});183184suite('History Navigator 2', () => {185186ensureNoDisposablesAreLeakedInTestSuite();187188test('constructor', () => {189const testObject = new HistoryNavigator2(['1', '2', '3', '4']);190191assert.strictEqual(testObject.current(), '4');192assert.strictEqual(testObject.isAtEnd(), true);193});194195test('constructor - initial history is not empty', () => {196assert.throws(() => new HistoryNavigator2([]));197});198199test('constructor - capacity limit', () => {200const testObject = new HistoryNavigator2(['1', '2', '3', '4'], 3);201202assert.strictEqual(testObject.current(), '4');203assert.strictEqual(testObject.isAtEnd(), true);204assert.strictEqual(testObject.has('1'), false);205});206207test('constructor - duplicate values', () => {208const testObject = new HistoryNavigator2(['1', '2', '3', '4', '3', '2', '1']);209210assert.strictEqual(testObject.current(), '1');211assert.strictEqual(testObject.isAtEnd(), true);212});213214test('navigation', () => {215const testObject = new HistoryNavigator2(['1', '2', '3', '4']);216217assert.strictEqual(testObject.current(), '4');218assert.strictEqual(testObject.isAtEnd(), true);219220assert.strictEqual(testObject.next(), '4');221assert.strictEqual(testObject.previous(), '3');222assert.strictEqual(testObject.previous(), '2');223assert.strictEqual(testObject.previous(), '1');224assert.strictEqual(testObject.previous(), '1');225226assert.strictEqual(testObject.current(), '1');227assert.strictEqual(testObject.next(), '2');228assert.strictEqual(testObject.resetCursor(), '4');229});230231test('add', () => {232const testObject = new HistoryNavigator2(['1', '2', '3', '4']);233testObject.add('5');234235assert.strictEqual(testObject.current(), '5');236assert.strictEqual(testObject.isAtEnd(), true);237});238239test('add - existing value', () => {240const testObject = new HistoryNavigator2(['1', '2', '3', '4']);241testObject.add('2');242243assert.strictEqual(testObject.current(), '2');244assert.strictEqual(testObject.isAtEnd(), true);245246assert.strictEqual(testObject.previous(), '4');247assert.strictEqual(testObject.previous(), '3');248assert.strictEqual(testObject.previous(), '1');249});250251test('replaceLast', () => {252const testObject = new HistoryNavigator2(['1', '2', '3', '4']);253testObject.replaceLast('5');254255assert.strictEqual(testObject.current(), '5');256assert.strictEqual(testObject.isAtEnd(), true);257assert.strictEqual(testObject.has('4'), false);258259assert.strictEqual(testObject.previous(), '3');260assert.strictEqual(testObject.previous(), '2');261assert.strictEqual(testObject.previous(), '1');262});263264test('replaceLast - existing value', () => {265const testObject = new HistoryNavigator2(['1', '2', '3', '4']);266testObject.replaceLast('2');267268assert.strictEqual(testObject.current(), '2');269assert.strictEqual(testObject.isAtEnd(), true);270assert.strictEqual(testObject.has('4'), false);271272assert.strictEqual(testObject.previous(), '3');273assert.strictEqual(testObject.previous(), '1');274});275276test('prepend', () => {277const testObject = new HistoryNavigator2(['1', '2', '3', '4']);278assert.strictEqual(testObject.current(), '4');279assert.ok(testObject.isAtEnd());280assert.deepStrictEqual(Array.from(testObject), ['1', '2', '3', '4']);281282testObject.prepend('0');283assert.strictEqual(testObject.current(), '4');284assert.ok(testObject.isAtEnd());285assert.deepStrictEqual(Array.from(testObject), ['0', '1', '2', '3', '4']);286287testObject.prepend('2');288assert.strictEqual(testObject.current(), '4');289assert.ok(testObject.isAtEnd());290assert.deepStrictEqual(Array.from(testObject), ['0', '1', '2', '3', '4']);291});292293});294295296