seq-ranges.spec.ts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import { describe, expect, it } from 'vitest'
  2. import { decodeSeqRanges, encodeSeqRanges, SessionSeq } from '@deepseek-ai/dsh-session'
  3. const seqs = (values: readonly number[]) => values.map(SessionSeq)
  4. describe('sourceEventSeqs ranges', () => {
  5. it.each([
  6. [],
  7. [5],
  8. [10, 11, 12, 13, 14],
  9. [16, 17, 100, 200, 201, 202, 203],
  10. [3, 2],
  11. [Number.MAX_SAFE_INTEGER - 1, 0, Number.MAX_SAFE_INTEGER - 2],
  12. ].map(values => [values]))('round-trips %j', (values) => {
  13. expect(decodeSeqRanges(encodeSeqRanges(seqs(values)))).toEqual(values)
  14. })
  15. it('encodes only profitable increasing runs', () => {
  16. expect(encodeSeqRanges(seqs([1, 3, 4, 5, 7]))).toEqual([1, [3, 5], 7])
  17. expect(encodeSeqRanges(seqs([1, 3, 4, 7]))).toEqual([1, 3, 4, 7])
  18. expect(encodeSeqRanges(seqs([3, 2]))).toEqual([3, 2])
  19. })
  20. it('does not impose a persistence-only provenance length limit', () => {
  21. const values = Array.from({ length: 1_000_001 }, (_, index) => SessionSeq(index))
  22. expect(encodeSeqRanges(values)).toEqual([[0, 1_000_000]])
  23. })
  24. it('rejects malformed or impossible expansions', () => {
  25. expect(() => decodeSeqRanges('nope')).toThrow(/must be an array/)
  26. expect(() => decodeSeqRanges([-1])).toThrow(/non-negative safe integers/)
  27. expect(() => decodeSeqRanges([[1]])).toThrow(/\[start, end\] pairs/)
  28. expect(() => decodeSeqRanges([[4, 2]])).toThrow(/start <= end/)
  29. expect(() => decodeSeqRanges([[2, 5], [4, 7]])).toThrow(/strictly increasing/)
  30. expect(() => decodeSeqRanges([0], 0)).toThrow(/exceeds its event sequence/)
  31. expect(() => decodeSeqRanges([[0, 10]], 10)).toThrow(/exceeds its event sequence/)
  32. })
  33. })