test(stammbaum): tidyTree centres a parent over its two children (#724)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -10,6 +10,14 @@ function leaf(id: string, width = W): TidyNode {
|
|||||||
return { id, width, children: [] };
|
return { id, width, children: [] };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function node(id: string, children: TidyNode[], width = W): TidyNode {
|
||||||
|
return { id, width, children };
|
||||||
|
}
|
||||||
|
|
||||||
|
function center(x: Map<string, number>, n: TidyNode): number {
|
||||||
|
return x.get(n.id)! + n.width / 2;
|
||||||
|
}
|
||||||
|
|
||||||
describe('tidyTree — leaf base case', () => {
|
describe('tidyTree — leaf base case', () => {
|
||||||
it('a single leaf lays out at x = 0', () => {
|
it('a single leaf lays out at x = 0', () => {
|
||||||
const a = leaf('a');
|
const a = leaf('a');
|
||||||
@@ -17,3 +25,23 @@ describe('tidyTree — leaf base case', () => {
|
|||||||
expect(x.get('a')).toBe(0);
|
expect(x.get('a')).toBe(0);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('tidyTree — ancestor centring', () => {
|
||||||
|
it('a parent is centred over the span of its two children', () => {
|
||||||
|
const c1 = leaf('c1');
|
||||||
|
const c2 = leaf('c2');
|
||||||
|
const p = node('p', [c1, c2]);
|
||||||
|
const x = layoutForest([p], GAP);
|
||||||
|
|
||||||
|
const pc = center(x, p);
|
||||||
|
const lo = center(x, c1);
|
||||||
|
const hi = center(x, c2);
|
||||||
|
// Parent sits exactly at the midpoint of its children's centres …
|
||||||
|
expect(pc).toBe((lo + hi) / 2);
|
||||||
|
// … which is within their span (the named-bug guard generalises this).
|
||||||
|
expect(pc).toBeGreaterThanOrEqual(Math.min(lo, hi));
|
||||||
|
expect(pc).toBeLessThanOrEqual(Math.max(lo, hi));
|
||||||
|
// Children do not overlap.
|
||||||
|
expect(Math.abs(x.get('c2')! - x.get('c1')!)).toBeGreaterThanOrEqual(W + GAP);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user