43 lines
1.2 KiB
JavaScript
43 lines
1.2 KiB
JavaScript
import { describe, it, expect } from 'vitest'
|
|
import { rgbToHex, rgbToHsl, hexToRgb, hslToRgb } from '../../src/utils/color.js'
|
|
|
|
describe('color conversion', () => {
|
|
it('converts RGB to hex', () => {
|
|
expect(rgbToHex(255, 0, 0)).toBe('FF0000')
|
|
expect(rgbToHex(0, 255, 0)).toBe('00FF00')
|
|
expect(rgbToHex(0, 0, 255)).toBe('0000FF')
|
|
})
|
|
|
|
it('pads single-digit hex values', () => {
|
|
expect(rgbToHex(1, 2, 3)).toBe('010203')
|
|
})
|
|
|
|
it('clamps RGB values to 0-255', () => {
|
|
expect(rgbToHex(300, -10, 128)).toBe('FF0080')
|
|
})
|
|
|
|
it('converts hex to RGB', () => {
|
|
expect(hexToRgb('FF0000')).toEqual({ r: 255, g: 0, b: 0 })
|
|
expect(hexToRgb('invalid')).toBeNull()
|
|
})
|
|
|
|
it('converts RGB to HSL and back (gray)', () => {
|
|
const hsl = rgbToHsl(128, 128, 128)
|
|
expect(hsl.s).toBe(0)
|
|
const rgb = hslToRgb(hsl.h, hsl.s, hsl.l)
|
|
expect(rgb.r).toBeCloseTo(128, 0)
|
|
expect(rgb.g).toBeCloseTo(128, 0)
|
|
expect(rgb.b).toBeCloseTo(128, 0)
|
|
})
|
|
|
|
it('converts pure red RGB <-> HSL', () => {
|
|
const hsl = rgbToHsl(255, 0, 0)
|
|
expect(hsl.h).toBe(0)
|
|
expect(hsl.s).toBe(100)
|
|
const rgb = hslToRgb(0, 100, 50)
|
|
expect(rgb.r).toBe(255)
|
|
expect(rgb.g).toBe(0)
|
|
expect(rgb.b).toBe(0)
|
|
})
|
|
})
|