// Spectrum Colorpicker Tests // https://github.com/bgrins/spectrum // Author: Brian Grinstead // License: MIT // Pretend like the color inputs aren't supported for initial load. $.fn.spectrum.inputTypeColorSupport = function () { return false; }; QUnit.module("Initialization"); QUnit.test("jQuery Plugin Can Be Created", function (assert) { var el = $("").spectrum(); assert.ok(el.attr("id") === "spec", "Element returned from plugin"); el.spectrum("set", "red"); assert.equal(el.spectrum("get").toName(), "red", "Basic color setting"); assert.equal( el.spectrum("option", "showInput"), false, "Undefined option is false." ); el.spectrum({ showInput: true }); assert.equal( el.spectrum("option", "showInput"), true, "Double initialized spectrum is destroyed before recreating." ); el.spectrum("destroy"); assert.equal( el.spectrum("container"), el, "After destroying spectrum, string function returns input." ); }); QUnit.test("Polyfill", function (assert) { var el = $("#type-color-on-page"); assert.ok( el.spectrum("get").toHex, "The input[type=color] has been initialized on load" ); el.spectrum("destroy"); // Pretend like the color inputs are supported. $.fn.spectrum.inputTypeColorSupport = function () { return true; }; el = $("").spectrum({ allowEmpty: true, }); el.spectrum("set", null); assert.ok(el.spectrum("get"), "input[type] color does not allow null values"); el.spectrum("destroy"); }); QUnit.test("Per-element Options Are Read From Data Attributes", function ( assert ) { var el = $("").spectrum(); assert.equal( el.spectrum("option", "showAlpha"), true, "Took showAlpha value from data attribute" ); el.spectrum("destroy"); var changeDefault = $("").spectrum( { showAlpha: true, } ); assert.equal( changeDefault.spectrum("option", "showAlpha"), true, "Took showAlpha value from options arg" ); changeDefault.spectrum("destroy"); var noData = $("").spectrum({ showAlpha: true, }); assert.equal( noData.spectrum("option", "showAlpha"), true, "Kept showAlpha without data attribute" ); noData.spectrum("destroy"); }); QUnit.test("Events Fire", function (assert) { assert.expect(4); var count = 0; var el = $("").spectrum(); el.on("beforeShow.spectrum", function (e) { // Cancel the event the first time if (count === 0) { assert.ok(true, "Cancel beforeShow"); count++; return false; } assert.equal(count, 1, "Allow beforeShow"); count++; }); el.on("show.spectrum", function (e) { assert.equal(count, 2, "Show"); count++; }); el.on("hide.spectrum", function (e) { assert.equal(count, 3, "Hide"); count++; }); el.on("move.spectrum", function (e) { assert.ok(false, "Change should not fire from `move` call"); }); el.on("change", function (e, color) { assert.ok(false, "Change should not fire from `set` call"); }); el.spectrum("show"); el.spectrum("show"); el.spectrum("hide"); el.spectrum("set", "red"); el.spectrum("destroy"); }); QUnit.test("Events Fire (text input change)", function (assert) { assert.expect(3); var count = 0; var el = $("").spectrum({ showInput: true, }); el.on("move.spectrum", function (e, color) { assert.equal(count, 0, "Move fires when input changes"); count++; }); el.on("change.spectrum", function (e, color) { assert.equal( count, 2, "Change should not fire when input changes, only when chosen" ); count++; }); el.spectrum("container").find(".sp-input").val("blue").trigger("change"); count++; el.spectrum("container").find(".sp-choose").click(); el.spectrum("destroy"); assert.equal(count, 3, "All events fired"); }); QUnit.test("Escape hides the colorpicker", function (assert) { assert.expect(1); var el = $("").spectrum(); el.on("hide.spectrum", function (e) { assert.ok(true, "Hide event should fire"); }); // Simulate an escape before showing -- should do nothing var e = jQuery.Event("keydown"); e.keyCode = 27; $(document).trigger(e); el.spectrum("show"); // Simulate an escape after showing -- should call the hide handler $(document).trigger(e); el.spectrum("destroy"); }); QUnit.test("Dragging", function (assert) { var el = $("").spectrum(); var hueSlider = el.spectrum("container").find(".sp-hue"); assert.ok(hueSlider.length, "There is a hue slider"); hueSlider.trigger("mousedown"); assert.ok($("body").hasClass("sp-dragging"), "The body has dragging class"); hueSlider.trigger("mouseup"); assert.ok( !$("body").hasClass("sp-dragging"), "The body does not have a dragging class" ); el.spectrum("destroy"); }); QUnit.module("Defaults"); QUnit.test("Default Color Is Set By Input Value", function (assert) { var red = $("").spectrum(); assert.equal(red.spectrum("get").toName(), "red", "Basic color setting"); var noColor = $("").spectrum(); assert.equal( noColor.spectrum("get").toHex(), "000000", "Defaults to black with an invalid color" ); var noValue = $("").spectrum(); assert.equal( noValue.spectrum("get").toHex(), "000000", "Defaults to black with no value set" ); var noValueHex3 = $("").spectrum({ preferredFormat: "hex3", }); assert.equal( noValueHex3.spectrum("get").toHex(true), "000", "Defaults to 3 char hex with no value set" ); assert.equal( noValueHex3.spectrum("get").toString(), "#000", "Defaults to 3 char hex with no value set" ); red.spectrum("destroy"); noColor.spectrum("destroy"); noValue.spectrum("destroy"); noValueHex3.spectrum("destroy"); }); QUnit.module("Palettes"); QUnit.test("Palette Events Fire In Correct Order ", function (assert) { assert.expect(4); var el = $("").spectrum({ showPalette: true, palette: [["red", "green", "blue"]], move: function () {}, }); var count = 0; el.on("move.spectrum", function (e) { assert.equal(count, 0, "move fires before change"); count++; }); el.on("change.spectrum", function (e) { assert.equal(count, 1, "change fires after move"); count++; }); el.spectrum("container").find(".sp-thumb-el:last-child").click(); assert.equal(count, 1, "Change event hasn't fired after palette click"); el.spectrum("container").find(".sp-choose").click(); assert.equal(count, 2, "Change event has fired after choose button click"); el.spectrum("destroy"); }); QUnit.test("Palette click events work", function (assert) { assert.expect(7); var moveCount = 0; var moves = ["blue", "green", "red"]; var changeCount = 0; var el = $("") .spectrum({ showPalette: true, preferredFormat: "name", palette: [["red", "green", "blue"]], show: function (c) { assert.equal(c.toName(), "orange", "correct shown color"); }, move: function (c) { assert.equal( c.toName(), moves[moveCount], "Move # " + moveCount + " is correct" ); moveCount++; }, change: function (c) { assert.equal(changeCount, 0, "Only one change happens"); assert.equal(c.toName(), "red"); changeCount++; }, }) .spectrum("show"); el.spectrum("container").find(".sp-thumb-el:nth-child(3)").click(); el.spectrum("container") .find(".sp-thumb-el:nth-child(2) .sp-thumb-inner") .click(); el.spectrum("container") .find(".sp-thumb-el:nth-child(1) .sp-thumb-inner") .click(); el.spectrum("container").find(".sp-choose").click(); assert.equal(el.val(), "red", "Element's value is set"); el.spectrum("destroy"); }); QUnit.test("Palette doesn't changes don't stick if cancelled", function ( assert ) { assert.expect(4); var moveCount = 0; var moves = ["blue", "green", "red", "orange"]; var changeCount = 0; var el = $("") .spectrum({ showPalette: true, preferredFormat: "name", palette: [["red", "green", "blue"]], move: function (c) { assert.equal( c.toName(), moves[moveCount], "Move # " + moveCount + " is correct" ); moveCount++; }, change: function (c) { assert.ok(false, "No change fires"); }, }) .spectrum("show"); el.spectrum("container").find(".sp-thumb-el:nth-child(3)").click(); el.spectrum("container").find(".sp-thumb-el:nth-child(2)").click(); el.spectrum("container").find(".sp-thumb-el:nth-child(1)").click(); el.spectrum("container").find(".sp-cancel").click(); assert.equal(el.val(), "orange", "Element's value is the same"); el.spectrum("destroy"); }); QUnit.test( "hideAfterPaletteSelect: Palette stays open after color select when false", function (assert) { var el = $("").spectrum({ showPalette: true, hideAfterPaletteSelect: false, palette: [["red", "green", "blue"]], }); el.spectrum("show"); el.spectrum("container").find(".sp-thumb-el:nth-child(1)").click(); assert.ok( !el.spectrum("container").hasClass("sp-hidden"), "palette is still visible after color selection" ); el.spectrum("destroy"); } ); QUnit.test( "hideAfterPaletteSelect: Palette closes after color select when true", function (assert) { assert.expect(2); var el = $("").spectrum({ showPalette: true, hideAfterPaletteSelect: true, change: function (c) { assert.equal(c.toName(), "red", "change fires"); }, palette: [["red", "green", "blue"]], }); el.spectrum("show"); el.spectrum("container").find(".sp-thumb-el:nth-child(1)").click(); assert.ok( el.spectrum("container").hasClass("sp-hidden"), "palette is still hidden after color selection" ); el.spectrum("destroy"); } ); QUnit.test("Local Storage Is Limited ", function (assert) { var el = $("").spectrum({ localStorageKey: "spectrum.tests", palette: [["#ff0", "#0ff"]], maxSelectionSize: 3, }); el.spectrum("set", "#f00"); el.spectrum("set", "#e00"); el.spectrum("set", "#d00"); el.spectrum("set", "#c00"); el.spectrum("set", "#b00"); el.spectrum("set", "#a00"); assert.equal( localStorage["spectrum.tests"], "rgb(204, 0, 0);rgb(187, 0, 0);rgb(170, 0, 0)", "Local storage array has been limited" ); el.spectrum("set", "#ff0"); el.spectrum("set", "#0ff"); assert.equal( localStorage["spectrum.tests"], "rgb(204, 0, 0);rgb(187, 0, 0);rgb(170, 0, 0)", "Local storage array did not get changed by selecting palette items" ); el.spectrum("destroy"); }); QUnit.module("Options"); QUnit.test("allowEmpty", function (assert) { var el = $("").spectrum({ allowEmpty: true, }); el.spectrum("set", null); assert.ok( !el.spectrum("get"), "input[type] color does not allow null values" ); el.spectrum("destroy"); el = $("").spectrum(); el.spectrum("set", null); assert.ok(el.spectrum("get"), "input[type] color does not allow null values"); el.spectrum("destroy"); }); QUnit.test("clickoutFiresChange", function (assert) { var el = $("").spectrum({ clickoutFiresChange: false, }); el.spectrum("show"); assert.equal(el.spectrum("get").toName(), "red", "Color is initialized"); el.spectrum("set", "orange"); assert.equal(el.spectrum("get").toName(), "orange", "Color is set"); $(document).click(); assert.equal( el.spectrum("get").toName(), "red", "Color is reverted after clicking 'cancel'" ); el.spectrum("destroy"); // Try again with default behavior (clickoutFiresChange = true) el = $("").spectrum(); el.spectrum("show"); assert.equal(el.spectrum("get").toName(), "red", "Color is initialized"); el.spectrum("set", "orange"); assert.equal(el.spectrum("get").toName(), "orange", "Color is set"); $(document).click(); assert.equal( el.spectrum("get").toName(), "orange", "Color is changed after clicking out" ); el.spectrum("destroy"); }); QUnit.test("replacerClassName", function (assert) { var el = $("").appendTo("body").spectrum({ replacerClassName: "test", }); assert.ok( el.next(".sp-replacer").hasClass("test"), "Replacer class has been applied" ); el.spectrum("destroy").remove(); }); QUnit.test("containerClassName", function (assert) { var el = $("").appendTo("body").spectrum({ containerClassName: "test", }); assert.ok( el.spectrum("container").hasClass("test"), "Container class has been applied" ); el.spectrum("destroy").remove(); }); QUnit.test("Options Can Be Set and Gotten Programmatically", function (assert) { var spec = $("").spectrum({ color: "#ECC", flat: true, showInput: true, className: "full-spectrum", showInitial: true, showPalette: true, showSelectionPalette: true, maxPaletteSize: 10, preferredFormat: "hex", localStorageKey: "spectrum.example", palette: [["red"], ["green"]], }); var allOptions = spec.spectrum("option"); assert.equal( allOptions.flat, true, "Fetching all options provides accurate value" ); var singleOption = spec.spectrum("option", "className"); assert.equal( singleOption, "full-spectrum", "Fetching a single option returns that value" ); spec.spectrum("option", "className", "changed"); singleOption = spec.spectrum("option", "className"); assert.equal( singleOption, "changed", "Changing an option then fetching it is updated" ); var numPaletteElements = spec .spectrum("container") .find(".sp-palette-row:not(.sp-palette-row-selection) .sp-thumb-el").length; assert.equal(numPaletteElements, 2, "Two palette elements to start"); spec.spectrum("option", "palette", [["red"], ["green"], ["blue"]]); var optPalette = spec.spectrum("option", "palette"); assert.deepEqual( optPalette, [["red"], ["green"], ["blue"]], "Changing an option then fetching it is updated" ); numPaletteElements = spec .spectrum("container") .find(".sp-palette-row:not(.sp-palette-row-selection) .sp-thumb-el").length; assert.equal(numPaletteElements, 3, "Three palette elements after updating"); var appendToDefault = $("").spectrum({}); var container = $("
").appendTo("body"); var appendToOther = $("").spectrum({ appendTo: container, }); var appendToParent = $("").appendTo("#c").spectrum({ appendTo: "parent", }); var appendToOtherFlat = $("").spectrum({ appendTo: container, flat: true, }); assert.equal( appendToDefault.spectrum("container").parent()[0], document.body, "Appended to body by default" ); assert.equal( appendToOther.spectrum("container").parent()[0], container[0], "Can be appended to another element" ); assert.equal( appendToOtherFlat.spectrum("container").parent()[0], $(appendToOtherFlat).parent()[0], "Flat CANNOT be appended to another element, will be same as input" ); assert.equal( appendToParent.spectrum("container").parent()[0], container[0], "Passing 'parent' to appendTo works as expected" ); // Issue #70 - https://github.com/bgrins/spectrum/issues/70 assert.equal( spec.spectrum("option", "showPalette"), true, "showPalette is true by default" ); spec.spectrum("option", "showPalette", false); assert.equal( spec.spectrum("option", "showPalette"), false, "showPalette is false after setting showPalette" ); spec.spectrum("option", "showPaletteOnly", true); assert.equal( spec.spectrum("option", "showPaletteOnly"), true, "showPaletteOnly is true after setting showPaletteOnly" ); assert.equal( spec.spectrum("option", "showPalette"), true, "showPalette is true after setting showPaletteOnly" ); spec.spectrum("destroy"); appendToDefault.spectrum("destroy"); appendToOther.spectrum("destroy"); appendToOtherFlat.spectrum("destroy"); appendToParent.spectrum("destroy").remove(); delete window.localStorage["spectrum.example"]; container.remove(); }); QUnit.test("Show Input works as expected", function (assert) { var el = $("").spectrum({ showInput: true, color: "red", }); var input = el.spectrum("container").find(".sp-input"); assert.equal(input.val(), "red", "Input is set to color by default"); input.val("").trigger("change"); assert.ok( input.hasClass("sp-validation-error"), "Input has validation error class after being emptied." ); input.val("red").trigger("change"); assert.ok( !input.hasClass("sp-validation-error"), "Input does not have validation error class after being reset to original color." ); assert.equal( el.spectrum("get").toHexString(), "#ff0000", "Color is still red" ); el.spectrum("destroy"); }); QUnit.test("Toggle Picker Area button works as expected", function (assert) { var div = $( "