mirror of
https://github.com/nbd-wtf/nostr-tools.git
synced 2025-12-08 16:28:49 +00:00
240 lines
6.8 KiB
TypeScript
240 lines
6.8 KiB
TypeScript
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)
|
|
})
|
|
})
|