UNPKG

@hello-pangea/color-picker

Version:

React color pickers from Sketch, Photoshop, Chrome, Github, Twitter & more

196 lines (165 loc) 6.77 kB
/* global test, expect, describe */ import * as color from "./color"; describe("helpers/color", () => { describe("simpleCheckForValidColor", () => { test("throws on null", () => { const data = null; expect(() => color.simpleCheckForValidColor(data)).toThrowError( TypeError ); }); test("throws on undefined", () => { const data = undefined; expect(() => color.simpleCheckForValidColor(data)).toThrowError( TypeError ); }); test("no-op on number", () => { const data = 255; expect(color.simpleCheckForValidColor(data)).toEqual(data); }); test("no-op on NaN", () => { const data = NaN; expect(isNaN(color.simpleCheckForValidColor(data))).toBeTruthy(); }); test("no-op on string", () => { const data = "ffffff"; expect(color.simpleCheckForValidColor(data)).toEqual(data); }); test("no-op on array", () => { const data = []; expect(color.simpleCheckForValidColor(data)).toEqual(data); }); test("no-op on rgb objects with numeric keys", () => { const data = { r: 0, g: 0, b: 0 }; expect(color.simpleCheckForValidColor(data)).toEqual(data); }); test("no-op on an object with an r g b a h s v key mapped to a NaN value", () => { const data = { r: NaN }; expect(color.simpleCheckForValidColor(data)).toEqual(data); }); test('no-op on hsl "s" percentage', () => { const data = { s: "15%" }; expect(color.simpleCheckForValidColor(data)).toEqual(data); }); test('no-op on hsl "l" percentage', () => { const data = { l: "100%" }; expect(color.simpleCheckForValidColor(data)).toEqual(data); }); test("should return false for invalid percentage", () => { const data = { l: "100%2" }; expect(color.simpleCheckForValidColor(data)).toBe(false); }); }); describe("toState", () => { test("returns an object giving a color in all formats", () => { expect(color.toState("red")).toEqual({ hsl: { a: 1, h: 0, l: 0.5, s: 1 }, hex: "#ff0000", rgb: { r: 255, g: 0, b: 0, a: 1 }, hsv: { h: 0, s: 1, v: 1, a: 1 }, oldHue: 0, source: undefined, }); }); test("gives hex color with leading hash", () => { expect(color.toState("blue").hex).toEqual("#0000ff"); }); test("doesn't mutate hsl color object", () => { const originalData = { h: 0, s: 0, l: 0, a: 1 }; const data = Object.assign({}, originalData); color.toState(data); expect(data).toEqual(originalData); }); test("doesn't mutate hsv color object", () => { const originalData = { h: 0, s: 0, v: 0, a: 1 }; const data = Object.assign({}, originalData); color.toState(data); expect(data).toEqual(originalData); }); }); describe("isValidHex", () => { test("allows strings of length 3 or 6", () => { expect(color.isValidHex("f")).toBeFalsy(); expect(color.isValidHex("ff")).toBeFalsy(); expect(color.isValidHex("fff")).toBeTruthy(); expect(color.isValidHex("ffff")).toBeFalsy(); expect(color.isValidHex("fffff")).toBeFalsy(); expect(color.isValidHex("ffffff")).toBeTruthy(); expect(color.isValidHex("fffffff")).toBeFalsy(); expect(color.isValidHex("ffffffff")).toBeFalsy(); expect(color.isValidHex("fffffffff")).toBeFalsy(); expect(color.isValidHex("ffffffffff")).toBeFalsy(); expect(color.isValidHex("fffffffffff")).toBeFalsy(); expect(color.isValidHex("ffffffffffff")).toBeFalsy(); }); test("allows strings without leading hash", () => { // Check a sample of possible colors - doing all takes too long. for (let i = 0; i <= 0xffffff; i += 0x010101) { const hex = `000000${i.toString(16)}`.slice(-6); expect(color.isValidHex(hex)).toBeTruthy(); } }); test("allows strings with leading hash", () => { // Check a sample of possible colors - doing all takes too long. for (let i = 0; i <= 0xffffff; i += 0x010101) { const hex = `000000${i.toString(16)}`.slice(-6); expect(color.isValidHex(`#${hex}`)).toBeTruthy(); } }); test("is case-insensitive", () => { expect(color.isValidHex("ffffff")).toBeTruthy(); expect(color.isValidHex("FfFffF")).toBeTruthy(); expect(color.isValidHex("FFFFFF")).toBeTruthy(); }); test("allow transparent color", () => { expect(color.isValidHex("transparent")).toBeTruthy(); }); test("does not allow non-hex characters", () => { expect(color.isValidHex("gggggg")).toBeFalsy(); }); test("does not allow numbers", () => { expect(color.isValidHex(0xffffff)).toBeFalsy(); }); }); describe("getContrastingColor", () => { test("returns a light color for a giving dark color", () => { expect(color.getContrastingColor("red")).toEqual("#fff"); }); test("returns a dark color for a giving light color", () => { expect(color.getContrastingColor("white")).toEqual("#000"); }); test("returns a predefined color for Transparent", () => { expect(color.getContrastingColor("transparent")).toEqual( "rgba(0,0,0,0.4)" ); }); test("returns a light color as default for undefined", () => { expect(color.getContrastingColor(undefined)).toEqual("#fff"); }); }); }); describe("validColorString", () => { test("checks for valid RGB string", () => { expect(color.isvalidColorString("23, 32, 3", "rgb")).toBeTruthy(); expect(color.isvalidColorString("290, 302, 3", "rgb")).toBeTruthy(); expect(color.isvalidColorString("23", "rgb")).toBeFalsy(); expect(color.isvalidColorString("230, 32", "rgb")).toBeFalsy(); }); test("checks for valid HSL string", () => { expect(color.isvalidColorString("200, 12, 93", "hsl")).toBeTruthy(); expect(color.isvalidColorString("200, 12%, 93%", "hsl")).toBeTruthy(); expect(color.isvalidColorString("200, 120, 93%", "hsl")).toBeTruthy(); expect(color.isvalidColorString("335°, 64%, 99%", "hsl")).toBeTruthy(); expect(color.isvalidColorString("100", "hsl")).toBeFalsy(); expect(color.isvalidColorString("20, 32", "hsl")).toBeFalsy(); }); test("checks for valid HSV string", () => { expect(color.isvalidColorString("200, 12, 93", "hsv")).toBeTruthy(); expect(color.isvalidColorString("200, 120, 93%", "hsv")).toBeTruthy(); expect(color.isvalidColorString("200°, 6%, 100%", "hsv")).toBeTruthy(); expect(color.isvalidColorString("1", "hsv")).toBeFalsy(); expect(color.isvalidColorString("20, 32", "hsv")).toBeFalsy(); expect(color.isvalidColorString("200°, ee3, 100%", "hsv")).toBeFalsy(); }); });