chore: 版本 0.1.0 更新 toTree 支持嵌套分组与同逻辑合并
Node.js Build / build (push) Successful in 10s

This commit is contained in:
2026-08-07 10:28:46 +08:00
parent e5077aeefa
commit be6bfae4ac
2 changed files with 129 additions and 8 deletions
+67
View File
@@ -119,6 +119,73 @@ describe('toTree', () => {
logic: 'OR',
children: expect.any(Array),
});
expect(tree[0].children).toHaveLength(2);
});
it('merges adjacent same-logic leaves into one node', () => {
const flat = [
{ field: 'a', query: 'EQ', op: '=', value: '1' },
{ field: 'b', query: 'EQ', op: '=', value: '2', logic: 'AND' },
{ field: 'c', query: 'EQ', op: '=', value: '3', logic: 'AND' },
];
const tree = toTree(flat);
expect(tree).toHaveLength(1);
expect(tree[0].logic).toBe('AND');
expect(tree[0].children).toHaveLength(3);
});
it('left-associates mixed logic: A AND B OR C -> (A AND B) OR C', () => {
const flat = [
{ field: 'a', query: 'EQ', op: '=', value: '1' },
{ field: 'b', query: 'EQ', op: '=', value: '2', logic: 'AND' },
{ field: 'c', query: 'EQ', op: '=', value: '3', logic: 'OR' },
];
const tree = toTree(flat);
expect(tree).toHaveLength(1);
expect(tree[0].logic).toBe('OR');
expect(tree[0].children).toHaveLength(2);
expect(tree[0].children[0].logic).toBe('AND');
expect(tree[0].children[0].children).toHaveLength(2);
});
it('supports explicit nested group via children key', () => {
const flat = [
{ field: 'a', query: 'EQ', op: '=', value: '1' },
{
logic: 'OR',
children: [
{ field: 'b', query: 'EQ', op: '=', value: '2' },
{ field: 'c', query: 'EQ', op: '=', value: '3', logic: 'AND' },
],
},
];
const tree = toTree(flat);
// a OR (b AND c)
expect(tree[0].logic).toBe('OR');
expect(tree[0].children).toHaveLength(2);
const inner = tree[0].children[1].children;
expect(inner).toHaveLength(1);
expect(inner[0].logic).toBe('AND');
expect(inner[0].children).toHaveLength(2);
});
it('supports group key shorthand', () => {
const flat = [
{ field: 'a', query: 'EQ', op: '=', value: '1' },
{
logic: 'OR',
group: [{ field: 'b', query: 'EQ', op: '=', value: '2' }],
},
];
const tree = toTree(flat);
expect(tree[0].logic).toBe('OR');
expect(tree[0].children).toHaveLength(2);
expect(tree[0].children[1].children).toHaveLength(1);
});
it('returns empty array for empty input', () => {
expect(toTree([])).toEqual([]);
expect(toTree(null)).toEqual([]);
});
});