UNPKG

@dominicstop/utils

Version:

Yet another event emitter written in typescript.

191 lines (190 loc) 7.61 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const geometry_1 = require("../geometry"); describe('Rect', () => { describe('constructor', () => { it('should construct from origin and size', () => { const rect = new geometry_1.Rect({ mode: 'originAndSize', origin: { x: 10, y: 20 }, size: { width: 100, height: 50 }, }); expect(rect.origin.x).toBeCloseTo(10); expect(rect.origin.y).toBeCloseTo(20); expect(rect.width).toBeCloseTo(100); expect(rect.height).toBeCloseTo(50); }); it('should construct from corners', () => { const rect = new geometry_1.Rect({ mode: 'corners', minX: 10, minY: 20, maxX: 110, maxY: 70, }); expect(rect.origin.x).toBeCloseTo(10); expect(rect.origin.y).toBeCloseTo(20); expect(rect.width).toBeCloseTo(100); expect(rect.height).toBeCloseTo(50); }); }); describe('computed properties', () => { const rect = new geometry_1.Rect({ mode: 'originAndSize', origin: { x: 10, y: 20 }, size: { width: 100, height: 60 }, }); it('should return correct corner values', () => { expect(rect.minMaxDimensions).toEqual({ minX: 10, minY: 20, maxX: 110, maxY: 80, }); }); it('should compute center point correctly', () => { const center = rect.center; expect(center.x).toBeCloseTo(60); // 10 + 100/2 expect(center.y).toBeCloseTo(50); // 20 + 60/2 }); it('should compute midpoints', () => { expect(rect.topMidPoint).toEqual(new geometry_1.Point({ x: 60, y: 20 })); expect(rect.bottomMidPoint).toEqual(new geometry_1.Point({ x: 60, y: 80 })); expect(rect.leftMidPoint).toEqual(new geometry_1.Point({ x: 10, y: 50 })); expect(rect.rightMidPoint).toEqual(new geometry_1.Point({ x: 110, y: 50 })); }); it('should compute corners correctly', () => { expect(rect.topLeftPoint).toEqual(new geometry_1.Point({ x: 10, y: 20 })); expect(rect.topRightPoint).toEqual(new geometry_1.Point({ x: 110, y: 20 })); expect(rect.bottomLeftPoint).toEqual(new geometry_1.Point({ x: 10, y: 80 })); expect(rect.bottomRightPoint).toEqual(new geometry_1.Point({ x: 110, y: 80 })); }); }); describe('isNaN', () => { it('should detect NaN in origin', () => { const rect = new geometry_1.Rect({ mode: 'originAndSize', origin: { x: NaN, y: 20 }, size: { width: 100, height: 50 }, }); expect(rect.isNaN).toBe(true); }); it('should detect NaN in size', () => { const rect = new geometry_1.Rect({ mode: 'originAndSize', origin: { x: 10, y: 20 }, size: { width: NaN, height: 50 }, }); expect(rect.isNaN).toBe(true); }); it('should not be NaN if all values are valid', () => { const rect = new geometry_1.Rect({ mode: 'originAndSize', origin: { x: 10, y: 20 }, size: { width: 100, height: 50 }, }); expect(rect.isNaN).toBe(false); }); }); describe('adjust points', () => { let rect; const rectOrigin = { x: 10, y: 20 }; const rectSize = { width: 100, height: 50 }; beforeEach(() => { rect = new geometry_1.Rect({ mode: 'originAndSize', origin: rectOrigin, size: rectSize, }); }); it('should adjust top left corner', () => { rect.minX = 0; rect.minY = 0; expect(rect.minX).toBeCloseTo(0); expect(rect.minY).toBeCloseTo(0); expect(rect.maxX).toBeCloseTo(rectSize.width); expect(rect.maxY).toBeCloseTo(rectSize.height); }); it('should adjust center corner', () => { rect.midX = 100; rect.midY = 100; expect(rect.center.x).toBeCloseTo(100); expect(rect.center.y).toBeCloseTo(100); expect(rect.width).toBeCloseTo(rectSize.width); expect(rect.height).toBeCloseTo(rectSize.height); }); it('should adjust bottom right corner', () => { rect.maxX = 150; rect.maxY = 90; expect(rect.maxX).toBeCloseTo(150); expect(rect.maxY).toBeCloseTo(90); expect(rect.width).toBeCloseTo(rectSize.width); expect(rect.height).toBeCloseTo(rectSize.height); }); it('should adjust top right corner', () => { rect.maxX = 200; rect.minY = 100; expect(rect.maxX).toBeCloseTo(200); expect(rect.minY).toBeCloseTo(100); expect(rect.width).toBeCloseTo(rectSize.width); expect(rect.height).toBeCloseTo(rectSize.height); }); it('should adjust bottom left corner', () => { rect.minX = 0; rect.maxY = 200; expect(rect.minX).toBeCloseTo(0); expect(rect.maxY).toBeCloseTo(200); expect(rect.width).toBeCloseTo(rectSize.width); expect(rect.height).toBeCloseTo(rectSize.height); }); }); describe('setPointCenter', () => { it('should move origin to center new point', () => { const rect = new geometry_1.Rect({ mode: 'originAndSize', origin: { x: 0, y: 0 }, size: { width: 100, height: 50 }, }); rect.setPointCenter(new geometry_1.Point({ x: 50, y: 50 })); expect(rect.origin.x).toBeCloseTo(0); // 50 - 100/2 expect(rect.origin.y).toBeCloseTo(25); // 50 - 50/2 }); }); describe('applyScaleByFactor', () => { it('should scale relative to origin', () => { const rect = new geometry_1.Rect({ mode: 'originAndSize', origin: { x: 0, y: 0 }, size: { width: 100, height: 50 }, }); rect.applyUniformScaleByFactor({ anchorReference: { mode: 'relativeToOrigin', }, percentAmount: 2 }); expect(rect.width).toBeCloseTo(200); expect(rect.height).toBeCloseTo(100); expect(rect.origin.x).toBeCloseTo(0); expect(rect.origin.y).toBeCloseTo(0); }); it('should scale relative to center', () => { const rect = new geometry_1.Rect({ mode: 'originAndSize', origin: { x: 0, y: 0 }, size: { width: 100, height: 100 }, }); const oldCenter = rect.center.clone(); rect.applyUniformScaleByFactor({ anchorReference: { mode: 'relativeToCenter', }, percentAmount: 3 }); expect(rect.width).toBeCloseTo(300); expect(rect.height).toBeCloseTo(300); expect(rect.center.x).toBeCloseTo(oldCenter.x); expect(rect.center.y).toBeCloseTo(oldCenter.y); }); }); });