import { describe, expect, it } from 'vitest' import fc from 'fast-check' import { KeyRange } from '../../src/utils/key-range.js' import { Keys } from '../../src/utils/keys.js' describe('KeyRange', () => { it('contains a key and its subtree, not lookalikes', () => { const range = new KeyRange('ab') expect(['ab', 'ab/c', 'ab/c/d'].every((k) => range.contains(k))).toBe(true) expect(['a', 'abc', 'ab0', 'ab~2D1', 'b'].some((k) => range.contains(k))).toBe(false) expect(new KeyRange('').contains('anything')).toBe(true) }) it('agrees with its scan bounds for escaped keys (property)', () => { const path = fc.array(fc.string({ unit: fc.constantFrom('a', 'b', '-', '/', '~', '0', '.'), minLength: 1, maxLength: 3 }), { minLength: 1, maxLength: 3 }) fc.assert( fc.property(path, path, (p, q) => { const range = new KeyRange(Keys.join(p)) const key = Keys.join(q) expect(range.contains(key)).toBe(key >= range.gte! && key < range.lt!) }), ) }) it('clamps and checks scan ranges', () => { const range = new KeyRange('ab') expect(range.clamp({ limit: 5 })).toEqual({ limit: 5, gte: 'ab', lt: 'ab0' }) expect(range.clamp({ gte: 'ab/x', lt: 'zz' })).toEqual({ gte: 'ab/x', lt: 'ab0' }) expect(range.clamp({ gte: 'b' })).toBeUndefined() expect(range.covers('ab/', 'ab0')).toBe(true) expect(range.covers('a', 'ab0')).toBe(false) expect(range.covers(undefined, 'ab0')).toBe(false) expect(new KeyRange('').covers(undefined, undefined)).toBe(true) }) })