orbitdb/test/oplog/sorting.test.js
Hayden Young 0347f3a7c2
test: Test cases for lamport clock and oplog sorting. (#28)
* test: Test cases for lamport clock and oplog sorting.

* fix: Linting.
2023-03-06 04:45:15 +08:00

186 lines
5.6 KiB
JavaScript

import { strictEqual, deepStrictEqual } from 'assert'
import Clock from '../../src/oplog/lamport-clock.js'
import Sorting from '../../src/oplog/sorting.js'
describe('Sorting', () => {
describe('NoZeroes', () => {
it('passed function cannot return 0', () => {
let err
const func = (a, b) => { return 0 }
const sortFn = Sorting.NoZeroes(func)
const expected = 'Error: Your log\'s tiebreaker function, func, has returned zero and therefore cannot be'
const record1 = 1
const record2 = 2
try {
sortFn(record1, record2)
} catch (e) {
err = e.toString()
}
strictEqual(err, expected)
})
})
describe('SortByClockId', () => {
let fallbackFn
before(() => {
fallbackFn = (a, b) => a
})
it('returns -1 when first clock\'s id is less than second clock\'s', () => {
const expected = -1
const record1 = { clock: new Clock('A') }
const record2 = { clock: new Clock('B') }
strictEqual(Sorting.SortByClockId(record1, record2, fallbackFn), expected)
})
it('returns 1 when first clock\'s id is greater than second clock\'s', () => {
const expected = 1
const record1 = { clock: new Clock('B') }
const record2 = { clock: new Clock('A') }
strictEqual(Sorting.SortByClockId(record1, record2, fallbackFn), expected)
})
it('returns the clock when clocks have the same id', () => {
const expected = { clock: new Clock('A') }
const record1 = { clock: new Clock('A') }
const record2 = { clock: new Clock('A') }
deepStrictEqual(Sorting.SortByClockId(record1, record2, fallbackFn), expected)
})
})
describe('SortByClocks', () => {
let fallbackFn
before(() => {
fallbackFn = (a, b) => a
})
it('returns -1 when a\'s time is less than b\'s', () => {
const expected = -1
const record1 = { clock: new Clock('A', 1) }
const record2 = { clock: new Clock('B', 2) }
strictEqual(Sorting.SortByClocks(record1, record2, fallbackFn), expected)
})
it('returns 1 when a\'s time is greater than b\'s', () => {
const expected = 1
const record1 = { clock: new Clock('A', 2) }
const record2 = { clock: new Clock('B', 1) }
strictEqual(Sorting.SortByClocks(record1, record2, fallbackFn), expected)
})
it('returns -1 when a\'s time is equal to b\'s', () => {
const expected = -1
const record1 = { clock: new Clock('A', 1) }
const record2 = { clock: new Clock('B', 1) }
strictEqual(Sorting.SortByClocks(record1, record2, fallbackFn), expected)
})
})
describe('Last write wins', () => {
it('returns -1 when a\'s time is less than b\'s', () => {
const expected = -1
const record1 = { clock: new Clock('A', 1) }
const record2 = { clock: new Clock('B', 2) }
strictEqual(Sorting.LastWriteWins(record1, record2), expected)
})
it('returns 1 when a\'s time is greater than b\'s', () => {
const expected = 1
const record1 = { clock: new Clock('A', 2) }
const record2 = { clock: new Clock('B', 1) }
strictEqual(Sorting.LastWriteWins(record1, record2), expected)
})
it('returns -1 when a\'s time is equal to b\'s', () => {
const expected = -1
const record1 = { clock: new Clock('A', 1) }
const record2 = { clock: new Clock('B', 1) }
strictEqual(Sorting.LastWriteWins(record1, record2), expected)
})
it('returns the clock when a and b are the same', () => {
const expected = { clock: new Clock('A') }
const record1 = { clock: new Clock('A') }
const record2 = { clock: new Clock('A') }
deepStrictEqual(Sorting.LastWriteWins(record1, record2), expected)
})
})
describe('Sorting records', () => {
it('sorts by clock time', () => {
const expected = [
{ clock: new Clock('A', 1) },
{ clock: new Clock('B', 2) },
{ clock: new Clock('C', 3) },
{ clock: new Clock('D', 4) }
]
const records = [
{ clock: new Clock('C', 3) },
{ clock: new Clock('A', 1) },
{ clock: new Clock('D', 4) },
{ clock: new Clock('B', 2) }
]
deepStrictEqual(records.sort(Sorting.LastWriteWins), expected)
})
it('sorts by clock time when id is the same', () => {
const expected = [
{ clock: new Clock('A', 1) },
{ clock: new Clock('A', 2) },
{ clock: new Clock('A', 3) },
{ clock: new Clock('A', 4) }
]
const records = [
{ clock: new Clock('A', 3) },
{ clock: new Clock('A', 1) },
{ clock: new Clock('A', 4) },
{ clock: new Clock('A', 2) }
]
deepStrictEqual(records.sort(Sorting.LastWriteWins), expected)
})
it('sorts by clock id', () => {
const expected = [
{ clock: new Clock('A') },
{ clock: new Clock('B') },
{ clock: new Clock('C') },
{ clock: new Clock('D') }
]
const records = [
{ clock: new Clock('C') },
{ clock: new Clock('A') },
{ clock: new Clock('D') },
{ clock: new Clock('B') }
]
deepStrictEqual(records.sort(Sorting.LastWriteWins), expected)
})
it('sorts the same clock', () => {
const expected = [
{ clock: new Clock('A') },
{ clock: new Clock('A') },
{ clock: new Clock('B') },
{ clock: new Clock('B') }
]
const records = [
{ clock: new Clock('B') },
{ clock: new Clock('A') },
{ clock: new Clock('B') },
{ clock: new Clock('A') }
]
deepStrictEqual(records.sort(Sorting.LastWriteWins), expected)
})
})
})