import { describe, expect, it } from "vitest"; import { computeClassicLogoPlacement } from "./logo"; const BOX = { w: 170, h: 54 }; const base = { box: BOX, availableWidth: 299, minTextWidth: 160 }; describe("computeClassicLogoPlacement", () => { it("the Arun P trimmed 4.6:1 logo is width-limited and stacks above the text", () => { const p = computeClassicLogoPlacement({ ...base, aspect: 4.6 }); expect(p.w).toBeCloseTo(170, 6); expect(p.h).toBeCloseTo(170 / 4.6, 6); expect(p.stacked).toBe(true); }); it("an untrimmed 3:1 logo is height-limited (54 pt) and still stacks", () => { const p = computeClassicLogoPlacement({ ...base, aspect: 3 }); expect(p.h).toBe(54); expect(p.w).toBeCloseTo(162, 6); expect(p.stacked).toBe(true); }); it("a square logo is 54 x 54 and sits beside the text", () => { const p = computeClassicLogoPlacement({ ...base, aspect: 1 }); expect(p).toEqual({ w: 54, h: 54, stacked: false }); }); it("stacks exactly when the text beside the logo would drop under the minimum", () => { // 299 - 54 - 14 = 231 beside a square; a 2:1 logo (108 wide) leaves 177; a 2.5:1 one (135) leaves 150. expect(computeClassicLogoPlacement({ ...base, aspect: 2 }).stacked).toBe(false); expect(computeClassicLogoPlacement({ ...base, aspect: 2.5 }).stacked).toBe(true); // The boundary: leaves exactly 160. const w = 299 - 14 - 160; expect(computeClassicLogoPlacement({ ...base, aspect: w / 54 }).stacked).toBe(false); expect(computeClassicLogoPlacement({ ...base, aspect: (w + 0.01) / 54 }).stacked).toBe(true); }); it("gives the logo more room on a wider column (Letter)", () => { const a4 = computeClassicLogoPlacement({ ...base, aspect: 2.4, availableWidth: 299.28 }); const letter = computeClassicLogoPlacement({ ...base, aspect: 2.4, availableWidth: 316 }); expect(a4.stacked).toBe(true); expect(letter.stacked).toBe(false); }); it("never exceeds the box, whatever the aspect", () => { for (const aspect of [0.2, 0.5, 1, 1.5, 3, 4.6, 10, 40]) { const p = computeClassicLogoPlacement({ ...base, aspect }); expect(p.w).toBeLessThanOrEqual(170 + 1e-9); expect(p.h).toBeLessThanOrEqual(54 + 1e-9); expect(p.w / p.h).toBeCloseTo(aspect, 6); } }); it("falls back to the box aspect for a bad aspect", () => { const p = computeClassicLogoPlacement({ ...base, aspect: Number.NaN }); expect(p.w).toBeCloseTo(170, 6); expect(p.h).toBeCloseTo(54, 6); }); });