diff --git a/src/utils/clampNumber.test.ts b/src/utils/clampNumber.test.ts new file mode 100644 index 0000000..a64f0dd --- /dev/null +++ b/src/utils/clampNumber.test.ts @@ -0,0 +1,34 @@ +import { describe, it, expect } from 'vitest'; +import { clampNumber } from './clampNumber'; + +describe('clampNumber', () => { + it('returns value if within min and max', () => { + expect(clampNumber(5, 1, 10)).toBe(5); + }); + + it('returns min if value is less than min', () => { + expect(clampNumber(-5, 0, 10)).toBe(0); + }); + + it('returns max if value is greater than max', () => { + expect(clampNumber(20, 0, 10)).toBe(10); + }); + + it('returns min when value equals min', () => { + expect(clampNumber(3, 3, 8)).toBe(3); + }); + + it('returns max when value equals max', () => { + expect(clampNumber(8, 3, 8)).toBe(8); + }); + + it('handles zero boundaries correctly', () => { + expect(clampNumber(0, 0, 0)).toBe(0); + expect(clampNumber(1, 0, 0)).toBe(0); + expect(clampNumber(-1, 0, 0)).toBe(0); + }); + + it('throws if min > max', () => { + expect(() => clampNumber(5, 10, 1)).toThrow('min must be less than or equal to max'); + }); +}); diff --git a/src/utils/clampNumber.ts b/src/utils/clampNumber.ts new file mode 100644 index 0000000..01ceb7c --- /dev/null +++ b/src/utils/clampNumber.ts @@ -0,0 +1,15 @@ +/** + * Clamps a number between min and max (inclusive). + * @param value - The input number to clamp. + * @param min - The minimum allowable value. + * @param max - The maximum allowable value. + * @returns The clamped number. + */ +export function clampNumber(value: number, min: number, max: number): number { + if (min > max) { + throw new Error('min must be less than or equal to max'); + } + if (value < min) return min; + if (value > max) return max; + return value; +}