import { expect } from "chai"; import { Rectangle } from "@/lib/rects/rectangle"; import { Vector2D } from "@/lib/rects/vector2d"; describe("Rectangle Tests", () => { const v1 = new Vector2D(1, 2); const v2 = new Vector2D(4, 6); const r1 = new Rectangle(v1, v2); const r2 = new Rectangle(v2, v1); function check_rectangle( r: Rectangle, left: number, top: number, width: number, height: number, ) { expect(r.left).to.equal(left); expect(r.top).to.equal(top); expect(r.width).to.equal(width); expect(r.height).to.equal(height); expect(r.area).to.equal(width * height); expect(r.middle.x).to.equal(left + 0.5 * width); expect(r.middle.y).to.equal(top + 0.5 * height); } it("should create a default rectangle", () => { check_rectangle(new Rectangle(), 0, 0, 0, 0); }); it("should create a rectangle", () => { check_rectangle(r1, 1, 2, 3, 4); }); it("should create the same rectangle backwards", () => { check_rectangle(r2, 1, 2, 3, 4); }); it("should compare rectangles", () => { expect(r1.equals(r2)).to.be.true; expect(r1.equals(new Rectangle())).to.be.false; }); it("should create the same rectangle transposed", () => { const v1t = new Vector2D(v1.x, v2.y); const v2t = new Vector2D(v2.x, v1.y); expect(r1.equals(new Rectangle(v1t, v2t))).to.be.true; }); it("should contain itself", () => { expect(r1.contains(v1)).to.be.true; expect(r1.contains(v2)).to.be.true; expect(r1.contains(r1.origin)).to.be.true; expect(r1.contains(r1.corner)).to.be.true; expect(r1.contains(r1.middle)).to.be.true; }); it("should not contain certain points", () => { expect(r1.contains(new Vector2D(0, 0))).to.be.false; expect(r1.contains(new Vector2D(100, 100))).to.be.false; }); it("should update a rectangle", () => { const v = new Vector2D(1, 1); check_rectangle(r1.update(v1.plus(v), undefined), 2, 3, 2, 3); check_rectangle(r1.update(v1.minus(v), undefined), 0, 1, 4, 5); check_rectangle(r1.update(undefined, v2.plus(v)), 1, 2, 4, 5); check_rectangle(r1.update(undefined, v2.minus(v)), 1, 2, 2, 3); check_rectangle(r1.update(v1.plus(v), v2.plus(v)), 2, 3, 3, 4); check_rectangle(r1.update(v1.minus(v), v2.minus(v)), 0, 1, 3, 4); check_rectangle(r1.update(v1.minus(v), v2.plus(v)), 0, 1, 5, 6); check_rectangle(r1.update(v1.plus(v), v2.minus(v)), 2, 3, 1, 2); }); it("should move a rectangle", () => { const v = new Vector2D(1, 1); check_rectangle(r1.move(v), 2, 3, 3, 4); }); });