import {buildEvent} from './test-helpers.ts' import { MessageQueue, insertEventIntoAscendingList, insertEventIntoDescendingList, } from './utils.ts' import type {Event} from './event.ts' describe('inserting into a desc sorted list of events', () => { test('insert into an empty list', async () => { const list0: Event[] = [] expect( insertEventIntoDescendingList(list0, buildEvent({id: 'abc', created_at: 10})) ).toHaveLength(1) }) test('insert in the beginning of a list', async () => { const list0 = [buildEvent({created_at: 20}), buildEvent({created_at: 10})] const list1 = insertEventIntoDescendingList(list0, buildEvent({ id: 'abc', created_at: 30 })) expect(list1).toHaveLength(3) expect(list1[0].id).toBe('abc') }) test('insert in the beginning of a list with same created_at', async () => { const list0 = [ buildEvent({created_at: 30}), buildEvent({created_at: 20}), buildEvent({created_at: 10}), ] const list1 = insertEventIntoDescendingList(list0, buildEvent({ id: 'abc', created_at: 30 })) expect(list1).toHaveLength(4) expect(list1[0].id).toBe('abc') }) test('insert in the middle of a list', async () => { const list0 = [ buildEvent({created_at: 30}), buildEvent({created_at: 20}), buildEvent({created_at: 10}), buildEvent({created_at: 1}), ] const list1 = insertEventIntoDescendingList(list0, buildEvent({ id: 'abc', created_at: 15 })) expect(list1).toHaveLength(5) expect(list1[2].id).toBe('abc') }) test('insert in the end of a list', async () => { const list0 = [ buildEvent({created_at: 20}), buildEvent({created_at: 20}), buildEvent({created_at: 20}), buildEvent({created_at: 20}), buildEvent({created_at: 10}), ] const list1 = insertEventIntoDescendingList(list0, buildEvent({ id: 'abc', created_at: 5 })) expect(list1).toHaveLength(6) expect(list1.slice(-1)[0].id).toBe('abc') }) test('insert in the last-to-end of a list with same created_at', async () => { const list0: Event[] = [ buildEvent({created_at: 20}), buildEvent({created_at: 20}), buildEvent({created_at: 20}), buildEvent({created_at: 20}), buildEvent({created_at: 10}), ] const list1 = insertEventIntoDescendingList(list0, buildEvent({ id: 'abc', created_at: 10 })) expect(list1).toHaveLength(6) expect(list1.slice(-2)[0].id).toBe('abc') }) test('do not insert duplicates', async () => { const list0 = [ buildEvent({created_at: 20}), buildEvent({created_at: 20}), buildEvent({created_at: 10, id: 'abc'}), ] const list1 = insertEventIntoDescendingList(list0, buildEvent({ id: 'abc', created_at: 10 })) expect(list1).toHaveLength(3) }) }) describe('inserting into a asc sorted list of events', () => { test('insert into an empty list', async () => { const list0: Event[] = [] expect( insertEventIntoAscendingList(list0, buildEvent({id: 'abc', created_at: 10})) ).toHaveLength(1) }) test('insert in the beginning of a list', async () => { const list0 = [buildEvent({created_at: 10}), buildEvent({created_at: 20})] const list1 = insertEventIntoAscendingList(list0, buildEvent({ id: 'abc', created_at: 1 })) expect(list1).toHaveLength(3) expect(list1[0].id).toBe('abc') }) test('insert in the beginning of a list with same created_at', async () => { const list0 = [ buildEvent({created_at: 10}), buildEvent({created_at: 20}), buildEvent({created_at: 30}), ] const list1 = insertEventIntoAscendingList(list0, buildEvent({ id: 'abc', created_at: 10 })) expect(list1).toHaveLength(4) expect(list1[0].id).toBe('abc') }) test('insert in the middle of a list', async () => { const list0 = [ buildEvent({created_at: 10}), buildEvent({created_at: 20}), buildEvent({created_at: 30}), buildEvent({created_at: 40}), ] const list1 = insertEventIntoAscendingList(list0, buildEvent({ id: 'abc', created_at: 25 })) expect(list1).toHaveLength(5) expect(list1[2].id).toBe('abc') }) test('insert in the end of a list', async () => { const list0 = [ buildEvent({created_at: 20}), buildEvent({created_at: 20}), buildEvent({created_at: 20}), buildEvent({created_at: 20}), buildEvent({created_at: 40}), ] const list1 = insertEventIntoAscendingList(list0, buildEvent({ id: 'abc', created_at: 50 })) expect(list1).toHaveLength(6) expect(list1.slice(-1)[0].id).toBe('abc') }) test('insert in the last-to-end of a list with same created_at', async () => { const list0 = [ buildEvent({created_at: 20}), buildEvent({created_at: 20}), buildEvent({created_at: 20}), buildEvent({created_at: 20}), buildEvent({created_at: 30}), ] const list1 = insertEventIntoAscendingList(list0, buildEvent({ id: 'abc', created_at: 30 })) expect(list1).toHaveLength(6) expect(list1.slice(-2)[0].id).toBe('abc') }) test('do not insert duplicates', async () => { const list0 = [ buildEvent({created_at: 20}), buildEvent({created_at: 20}), buildEvent({created_at: 30, id: 'abc'}), ] const list1 = insertEventIntoAscendingList(list0, buildEvent({ id: 'abc', created_at: 30 })) expect(list1).toHaveLength(3) }) }) describe('enque a message into MessageQueue', () => { test('enque into an empty queue', () => { const queue = new MessageQueue() queue.enqueue('node1') expect(queue.first!.value).toBe('node1') }) test('enque into a non-empty queue', () => { const queue = new MessageQueue() queue.enqueue('node1') queue.enqueue('node3') queue.enqueue('node2') expect(queue.first!.value).toBe('node1') expect(queue.last!.value).toBe('node2') expect(queue.size).toBe(3) }) test('dequeue from an empty queue', () => { const queue = new MessageQueue() const item1 = queue.dequeue() expect(item1).toBe(null) expect(queue.size).toBe(0) }) test('dequeue from a non-empty queue', () => { const queue = new MessageQueue() queue.enqueue('node1') queue.enqueue('node3') queue.enqueue('node2') const item1 = queue.dequeue() expect(item1).toBe('node1') const item2 = queue.dequeue() expect(item2).toBe('node3') }) test('dequeue more than in queue', () => { const queue = new MessageQueue() queue.enqueue('node1') queue.enqueue('node3') const item1 = queue.dequeue() expect(item1).toBe('node1') const item2 = queue.dequeue() expect(item2).toBe('node3') expect(queue.size).toBe(0) const item3 = queue.dequeue() expect(item3).toBe(null) }) })