tilekit / src /layout.test.ts
osolmaz's picture
osolmaz HF Staff
feat: add size variation control
3a2fcd3 verified
Raw
History Blame Contribute Delete
2.85 kB
import { describe, expect, it } from "vitest";
import { generateLayout, PLACEMENT_STRIDE } from "./layout";
const options = {
aspect: 16 / 9,
count: 88,
logoScale: 1,
sizeVariation: 1,
spacing: 1,
rotation: 52,
seed: 84237,
};
describe("generateLayout", () => {
it("is deterministic", () => {
expect(generateLayout(options)).toEqual(generateLayout(options));
});
it("returns finite packed placements", () => {
const layout = generateLayout(options);
expect(layout).toHaveLength(options.count * PLACEMENT_STRIDE);
expect([...layout].every(Number.isFinite)).toBe(true);
});
it("responds to the seed", () => {
expect(generateLayout(options)).not.toEqual(generateLayout({ ...options, seed: 84238 }));
});
it("spreads placements across the canvas", () => {
const layout = generateLayout(options);
const xs: number[] = [];
const ys: number[] = [];
for (let offset = 0; offset < layout.length; offset += PLACEMENT_STRIDE) {
xs.push(layout[offset] ?? 0);
ys.push(layout[offset + 1] ?? 0);
}
expect(Math.max(...xs) - Math.min(...xs)).toBeGreaterThan(1.5);
expect(Math.max(...ys) - Math.min(...ys)).toBeGreaterThan(0.85);
});
it("supports very dense layouts", () => {
const layout = generateLayout({ ...options, count: 512, logoScale: 0.5 });
expect(layout).toHaveLength(512 * PLACEMENT_STRIDE);
expect([...layout].every(Number.isFinite)).toBe(true);
});
it("controls size variation continuously", () => {
const uniform = generateLayout({ ...options, sizeVariation: 0 });
const varied = generateLayout({ ...options, sizeVariation: 1 });
const exaggerated = generateLayout({ ...options, sizeVariation: 1.5 });
const widths = (layout: Float32Array): number[] => {
const values: number[] = [];
for (let offset = 2; offset < layout.length; offset += PLACEMENT_STRIDE) values.push(layout[offset] ?? 0);
return values;
};
const range = (values: number[]): number => Math.max(...values) - Math.min(...values);
expect(range(widths(uniform))).toBeLessThan(0.000001);
expect(range(widths(varied))).toBeGreaterThan(0.15);
expect(range(widths(exaggerated))).toBeGreaterThan(range(widths(varied)));
});
it("changes spacing continuously and visibly", () => {
const compact = generateLayout({ ...options, spacing: 0.5 });
const neutral = generateLayout({ ...options, spacing: 1 });
const airy = generateLayout({ ...options, spacing: 1.5 });
expect(compact[2]).toBeGreaterThan(neutral[2] ?? 0);
expect(airy[2]).toBeLessThan(neutral[2] ?? 0);
const adjacent = generateLayout({ ...options, spacing: 1.01 });
expect(Math.abs((adjacent[2] ?? 0) - (neutral[2] ?? 0))).toBeLessThan(0.001);
expect(Math.abs((adjacent[0] ?? 0) - (neutral[0] ?? 0))).toBeLessThan(0.001);
});
});