This commit is contained in:
@@ -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([]);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user