import * as assert from 'assert'; import { resolveSqlFluffRange } from '../src/adapters/sqlfluff'; suite('SqlFluff Range Tests', () => { function assertValid([sl, sp, el, ep]: [number, number, number, number]): void { assert.ok(Number.isFinite(sl), 'startLine must be finite'); assert.ok(Number.isFinite(sp), 'startPos must be finite'); assert.ok(Number.isFinite(el), 'endLine must be finite'); assert.ok(Number.isFinite(ep), 'endPos must be finite'); assert.ok(sl >= 0, 'startLine must be >= 0'); assert.ok(sp >= 0, 'startPos must be >= 0'); assert.ok(el >= sl, 'endLine must be >= startLine'); } test('full positions convert to zero-based range', () => { const r = resolveSqlFluffRange({ start_line_no: 2, start_line_pos: 4, end_line_no: 2, end_line_pos: 9, code: 'JJ01', description: 'x', }); assert.deepStrictEqual(r, [1, 3, 1, 8]); assertValid(r); }); test('missing end positions fall back to start (comment JJ01 case)', () => { const r = resolveSqlFluffRange({ start_line_no: 2, start_line_pos: 1, code: 'JJ01', description: 'x', }); assert.deepStrictEqual(r, [1, 0, 1, 0]); assertValid(r); }); test('legacy line_no/line_pos keys are honored', () => { const r = resolveSqlFluffRange({ line_no: 3, line_pos: 5, code: 'LT12', description: 'x', }); assert.deepStrictEqual(r, [2, 4, 2, 4]); assertValid(r); }); test('null positions fall back to defaults', () => { const r = resolveSqlFluffRange({ start_line_no: null, start_line_pos: null, end_line_no: null, end_line_pos: null, code: 'TMP', description: 'x', }); assert.deepStrictEqual(r, [0, 0, 0, 0]); assertValid(r); }); test('zero positions are clamped to valid values', () => { const r = resolveSqlFluffRange({ start_line_no: 1, start_line_pos: 0, end_line_no: 1, end_line_pos: 0, code: 'TMP', description: 'x', }); assert.deepStrictEqual(r, [0, 0, 0, 0]); assertValid(r); }); test('missing all positions produce a safe zero range', () => { const r = resolveSqlFluffRange({ code: 'PRS', description: 'x' }); assert.deepStrictEqual(r, [0, 0, 0, 0]); assertValid(r); }); });