/**
 * filter 数值比较算子 — lt/lte/gt/gte
 *
 * 动机:让"业务口径 WHERE"(如退费正负切分 receivable_this < 0)能在 PAC transforms 做,
 * 宿主只需导原表。非数值/空值一律不通过(空金额不算负数)。
 *
 * 跑:pnpm --filter @pac/service test -- filter-numeric
 */
import { runFilter } from '../src/modules/sync/transforms/operators/filter.op';
import type { FilterOp } from '../src/modules/sync/transforms/transforms.schema';

const rows = [
  { m: '-30.00' },
  { m: '0' },
  { m: '5' },
  { m: '' }, // 空
  { m: 'abc' }, // 非数值
  { m: null as unknown as string },
];

function filt(where: FilterOp['where']) {
  const op = { kind: 'filter', input: 'x', output: 'y', where } as FilterOp;
  return runFilter(op, rows).rows.map((r) => r.m);
}

describe('filter 数值算子', () => {
  it('lt:< 0 只保留负数,空/非数值不通过', () => {
    expect(filt({ m: { lt: 0 } })).toEqual(['-30.00']);
  });

  it('gte:>= 0 保留 0 和正数', () => {
    expect(filt({ m: { gte: 0 } })).toEqual(['0', '5']);
  });

  it('gt:> 0 只保留正数', () => {
    expect(filt({ m: { gt: 0 } })).toEqual(['5']);
  });

  it('lte:<= 0 保留 0 和负数', () => {
    expect(filt({ m: { lte: 0 } })).toEqual(['-30.00', '0']);
  });

  it('空值 / 非数值 / null 一律不通过数值比较', () => {
    // 用一个恒真下界也不会把空/非数值放进来
    expect(filt({ m: { gte: -1e9 } })).toEqual(['-30.00', '0', '5']);
  });
});
