UNPKG

vuetify

Version:

Vue Material Component Framework

163 lines (140 loc) 6.06 kB
import { classToHex, colorToInt, intToHex, isCssColor, parseGradient, } from '../colorUtils' import * as transformSRGB from '../color/transformSRGB' import * as transformCIELAB from '../color/transformCIELAB' const colors = { red: { base: '#ff0000', lighten1: '#ff6666', }, } const currentTheme = { primary: '#1976d2' } describe('isCssColor', () => { it('should return true if css color is passed', () => { expect(isCssColor('#ff0000')).toBeTruthy() expect(isCssColor('#fff')).toBeTruthy() expect(isCssColor('rgb(255, 255, 255)')).toBeTruthy() expect(isCssColor('rgba(255, 0, 0, 0.8)')).toBeTruthy() expect(isCssColor('var(--my-color)')).toBeTruthy() }) it('should return false if non-css color is passed', () => { expect(isCssColor('red')).toBeFalsy() expect(isCssColor('primary')).toBeFalsy() }) }) describe('colorToInt', () => { it('should convert a hex string to a number', () => { expect(colorToInt('#123456')).toBe(0x123456) expect(colorToInt('#abc')).toBe(0xaabbcc) expect(colorToInt('876543')).toBe(0x876543) expect(colorToInt('669')).toBe(0x666699) expect(colorToInt('fff')).toBe(0xffffff) }) it('should keep existing numbers', () => { expect(colorToInt(0xabcdef)).toBe(0xabcdef) }) it('should reject invalid formats', async () => { expect(() => colorToInt([])).toThrow('Colors can only be numbers or strings, recieved Array instead') expect(() => colorToInt(() => {})).toThrow('Colors can only be numbers or strings, recieved Function instead') colorToInt(-1) colorToInt('#1000000') colorToInt('#13') colorToInt('#6') colorToInt('red') expect(`Colors cannot be negative: '-1'`).toHaveBeenTipped() expect(`'#1000000' is not a valid rgb color`).toHaveBeenTipped() expect(`'#13' is not a valid rgb color`).toHaveBeenTipped() expect(`'#6' is not a valid rgb color`).toHaveBeenTipped() expect(`'red' is not a valid rgb color`).toHaveBeenTipped() }) }) describe('classToHex', () => { it('should convert a color class string to a hex string', () => { expect(classToHex('red', colors, currentTheme)).toBe('#ff0000') expect(classToHex('red lighten-1', colors, currentTheme)).toBe('#ff6666') expect(classToHex('primary', colors, currentTheme)).toBe('#1976d2') }) }) // TODO describe('intToHex', () => { it('should convert', () => { expect(intToHex(0)).toBe('#000000') expect(intToHex(0xffffff)).toBe('#ffffff') }) }) describe('transformSRGB', () => { it('should convert sRGB to XYZ', () => { expect(transformSRGB.toXYZ(0)).toEqual([0, 0, 0]) expect(transformSRGB.toXYZ(0xffffff)).toEqual([0.9505, 1, 1.0890]) expect(transformSRGB.toXYZ(0xfcfbf4)).toEqualCloseTo([0.909712, 0.962215, 0.993659], 6) expect(transformSRGB.toXYZ(0x45a081)).toEqualCloseTo([0.189875, 0.279918, 0.251711], 6) expect(transformSRGB.toXYZ(0x191995)).toEqualCloseTo([0.061733, 0.030719, 0.287013], 6) expect(transformSRGB.toXYZ(0xcd6600)).toEqualCloseTo([0.299282, 0.224819, 0.027620], 6) }) it('should convert XYZ to sRGB', () => { expect(transformSRGB.fromXYZ([0, 0, 0])).toBe(0) expect(transformSRGB.fromXYZ([0.9505, 1, 1.0890])).toBe(0xffffff) expect(transformSRGB.fromXYZ([0.909712, 0.962215, 0.993659])).toBe(0xfcfbf4) expect(transformSRGB.fromXYZ([0.189875, 0.279918, 0.251711])).toBe(0x45a081) expect(transformSRGB.fromXYZ([0.061733, 0.030719, 0.287013])).toBe(0x191995) expect(transformSRGB.fromXYZ([0.299282, 0.224819, 0.027620])).toBe(0xcd6600) }) }) describe('transformCIELAB', () => { it('should convert LAB to XYZ', () => { expect(transformCIELAB.toXYZ([0, 0, 0])).toEqual([0, 0, 0]) expect(transformCIELAB.toXYZ([100, 0.0053, -0.0104])).toEqualCloseTo([0.9505, 1, 1.0890], 4) expect(transformCIELAB.toXYZ([98.5202, -0.8731, 3.4542])).toEqualCloseTo([0.909713, 0.962215, 0.99366], 6) expect(transformCIELAB.toXYZ([59.8813, -34.7853, 8.0829])).toEqualCloseTo([0.189875, 0.279918, 0.251711], 6) expect(transformCIELAB.toXYZ([20.3296, 44.3917, -65.5991])).toEqualCloseTo([0.061733, 0.030719, 0.287014], 6) expect(transformCIELAB.toXYZ([54.5346, 36.1321, 62.8465])).toEqualCloseTo([0.299282, 0.224819, 0.027620], 6) }) it('should convert XYZ to LAB', () => { expect(transformCIELAB.fromXYZ([0, 0, 0])).toEqual([0, 0, 0]) expect(transformCIELAB.fromXYZ([0.9505, 1, 1.0890])).toEqualCloseTo([100, 0.0053, -0.0104], 4) expect(transformCIELAB.fromXYZ([0.909712, 0.962215, 0.993659])).toEqualCloseTo([98.5202, -0.8731, 3.4542], 4) expect(transformCIELAB.fromXYZ([0.189875, 0.279918, 0.251711])).toEqualCloseTo([59.8813, -34.7853, 8.0829], 4) expect(transformCIELAB.fromXYZ([0.061733, 0.030719, 0.287014])).toEqualCloseTo([20.3296, 44.3917, -65.5991], 4) expect(transformCIELAB.fromXYZ([0.299282, 0.224819, 0.027620])).toEqualCloseTo([54.5346, 36.1321, 62.8465], 4) }) }) describe('parseGradient', () => { it('should replace colors with their valid forms', () => { expect( parseGradient('to top, red lighten-1, rgba(#000, .8)', colors, currentTheme) ).toBe('to top, #ff6666, rgba(0,0,0, .8)') expect( parseGradient('to top, #fff, primary', colors, currentTheme) ).toBe('to top, #fff, #1976d2') expect( parseGradient('to top, var(--foo), rgba(#0000, .6)', colors, currentTheme) ).toBe('to top, var(--foo), rgba(0,0,0, .6)') }) }) expect.extend({ toEqualCloseTo (received, expected, precision = 3) { const getType = item => item.constructor.name.toLowerCase() function round (obj) { switch (getType(obj)) { case 'array': return obj.map(round) case 'object': return Object.keys(obj).reduce((acc, key) => { acc[key] = round(obj[key]) return acc }, {}) case 'number': return +obj.toFixed(precision) default: return obj } } expect(round(received)).toEqual(expected) return { pass: true } }, })