Files

38 lines
1.3 KiB
TypeScript

import { expect, test } from "vitest";
import { type AABB, vec } from "./given.ts";
import { moveAndSlide } from "./moveAndSlide.ts";
const player: AABB = { x: 0, y: 0, w: 2, h: 2 };
test("no walls -> full move", () => {
const p = moveAndSlide(player, vec(10, 5), []);
expect(p.x).toBeCloseTo(10);
expect(p.y).toBeCloseTo(5);
});
test("head-on into the NEAREST of two walls -> stops there", () => {
const walls: AABB[] = [
{ x: 5, y: 0, w: 2, h: 2 }, // nearer
{ x: 8, y: 0, w: 2, h: 2 }, // farther
];
const p = moveAndSlide(player, vec(10, 0), walls);
expect(p.x).toBeCloseTo(3); // right edge (2) meets wall left edge (5)
expect(p.y).toBeCloseTo(0);
});
test("diagonal into a vertical wall -> slides down it", () => {
// x is blocked at 3, but the downward motion keeps going for the whole frame
const walls: AABB[] = [{ x: 5, y: -10, w: 2, h: 40 }];
const p = moveAndSlide(player, vec(10, 10), walls);
expect(p.x).toBeCloseTo(3);
expect(p.y).toBeCloseTo(10);
});
test("diagonal onto a floor -> slides along it", () => {
// falls until its bottom meets the floor top (y=8 -> corner y=6), keeps moving in x
const walls: AABB[] = [{ x: 0, y: 8, w: 20, h: 2 }];
const p = moveAndSlide(player, vec(5, 10), walls);
expect(p.x).toBeCloseTo(5);
expect(p.y).toBeCloseTo(6);
});