@electric-sql/d2mini
Version:
D2Mini is a minimal implementation of Differential Dataflow for performing in-memory incremental view maintenance.
60 lines (47 loc) • 1.86 kB
text/typescript
import { describe, expect, beforeEach, test } from 'vitest'
import { DifferenceStreamReader, DifferenceStreamWriter } from '../src/graph.js'
import { MultiSet } from '../src/multiset.js'
describe('DifferenceStreamReader and DifferenceStreamWriter', () => {
let writer: DifferenceStreamWriter<number>
let reader: DifferenceStreamReader<number>
beforeEach(() => {
writer = new DifferenceStreamWriter<number>()
reader = writer.newReader()
})
test('isEmpty returns true for empty queue', () => {
expect(reader.isEmpty()).toBe(true)
})
test('isEmpty returns false when queue has messages', () => {
writer.sendData(new MultiSet())
expect(reader.isEmpty()).toBe(false)
})
test('drain returns all messages', () => {
writer.sendData(new MultiSet([[1, 1]]))
writer.sendData(new MultiSet([[2, 1]]))
const messages = reader.drain()
expect(messages).toHaveLength(2)
expect(messages[0]).toBeInstanceOf(MultiSet)
expect(messages[1]).toBeInstanceOf(MultiSet)
expect(reader.isEmpty()).toBe(true)
})
test('multiple readers receive the same data', () => {
const reader2 = writer.newReader()
writer.sendData(new MultiSet([[1, 1]]))
writer.sendData(new MultiSet([[2, 1]]))
const messages1 = reader.drain()
const messages2 = reader2.drain()
expect(messages1).toHaveLength(2)
expect(messages2).toHaveLength(2)
expect(messages1[0].getInner()).toEqual([[1, 1]])
expect(messages2[0].getInner()).toEqual([[1, 1]])
expect(messages1[1].getInner()).toEqual([[2, 1]])
expect(messages2[1].getInner()).toEqual([[2, 1]])
})
test('drain empties the queue', () => {
writer.sendData(new MultiSet([[1, 1]]))
writer.sendData(new MultiSet([[2, 1]]))
expect(reader.isEmpty()).toBe(false)
reader.drain()
expect(reader.isEmpty()).toBe(true)
})
})