test.web/domain/converters/learning.route.converter.test.ts

test.web/domain/converters/learning.route.converter.test.ts is a file in Codebase Testing. 47 lines of code and 0 definitions.

import { describe, expect, it } from "vitest";
import { orthogonal, tracePoints } from "@banes-lab/web/domain/converters/learning.fragment.converter.ts";
import { LEARNING } from "@banes-lab/web/core/generated/learning.generated.ts";
import type { LearningPoint } from "@banes-lab/web/types/learning.types.ts";
import { gridFor } from "@banes-lab/web/domain/converters/learning.grid.converter.ts";
import { layoutLearning } from "@banes-lab/web/domain/converters/learning.converter.ts";
import { unfold } from "@banes-lab/web/domain/converters/learning.route.converter.ts";

const turnsBack = function turnsBack(before: LearningPoint, here: LearningPoint, after: LearningPoint): boolean {
    const level = before.y === here.y && here.y === after.y;
    const upright = before.x === here.x && here.x === after.x;
    const along = (here.x - before.x) * (after.x - here.x) + (here.y - before.y) * (after.y - here.y);
    return (level || upright) && along < 0;
};

describe("unfold", () => {
    it("leaves the home page's rail with no turn back over its own line", () => {
        const model = layoutLearning(LEARNING);
        const grid = gridFor(model);
        const stops = model.blocks.flatMap((block) => block.stops.map((stop) => ({ block, cx: stop.cx, cy: stop.cy })));
        const rail = unfold(orthogonal(grid, tracePoints(grid, stops)), stops);
        const back = rail.slice(1, -1).filter((here, index) => {
            const before = rail[index];
            const after = rail[index + 2];
            return before !== undefined && after !== undefined && turnsBack(before, here, after);
        });
        expect(back).toStrictEqual([]);
    });

    it("cuts a spur past a turn and keeps a stop the rail turns at", () => {
        const stops = [{ cx: 40, cy: 40 }];
        const spurred = [
            { x: 0, y: 0 },
            { x: 30, y: 0 },
            { x: 24, y: 0 },
            { x: 24, y: 50 },
        ];
        expect(unfold(spurred, stops)).toStrictEqual([
            { x: 0, y: 0 },
            { x: 24, y: 0 },
            { x: 24, y: 50 },
        ]);
        const atStop = [
            { x: 0, y: 40 },
            { x: 40, y: 40 },
            { x: 30, y: 40 },
        ];
        expect(unfold(atStop, stops)).toStrictEqual(atStop);
    });
});