diff --git a/platform/features/layout/src/LayoutSelection.js b/platform/features/layout/src/LayoutSelection.js index 0398d3d308..bb1574f0ff 100644 --- a/platform/features/layout/src/LayoutSelection.js +++ b/platform/features/layout/src/LayoutSelection.js @@ -7,6 +7,12 @@ define( /** * Tracks selection state for Layout and Fixed Position views. + * This manages and mutates the provided selection array in-place, + * and takes care to only modify the array elements it manages + * (the view's proxy, and the single selection); selections may be + * added or removed elsewhere provided that similar care is taken + * elsewhere. + * * @param {Array} selection the selection array from the view's scope * @param [proxy] an object which represents the selection of the view * itself (which handles view-level toolbar behavior) diff --git a/platform/features/layout/test/LayoutSelectionSpec.js b/platform/features/layout/test/LayoutSelectionSpec.js index 54742a0531..3712afec3f 100644 --- a/platform/features/layout/test/LayoutSelectionSpec.js +++ b/platform/features/layout/test/LayoutSelectionSpec.js @@ -6,6 +6,79 @@ define( "use strict"; describe("Layout/fixed position selection manager", function () { + var testSelection, + testProxy, + testElement, + otherElement, + selection; + + beforeEach(function () { + testSelection = []; + testProxy = { someKey: "some value" }; + testElement = { someOtherKey: "some other value" }; + otherElement = { yetAnotherKey: 42 }; + selection = new LayoutSelection(testSelection, testProxy); + }); + + it("adds the proxy to the selection array", function () { + expect(testSelection).toEqual([testProxy]); + }); + + it("includes selected objects alongside the proxy", function () { + selection.select(testElement); + expect(testSelection).toEqual([testProxy, testElement]); + }); + + it("allows elements to be deselected", function () { + selection.select(testElement); + selection.deselect(); + expect(testSelection).toEqual([testProxy]); + }); + + it("replaces old selections with new ones", function () { + selection.select(testElement); + selection.select(otherElement); + expect(testSelection).toEqual([testProxy, otherElement]); + }); + + it("allows retrieval of the current selection", function () { + selection.select(testElement); + expect(selection.get()).toBe(testElement); + selection.select(otherElement); + expect(selection.get()).toBe(otherElement); + }); + + it("can check if an element is selected", function () { + selection.select(testElement); + expect(selection.selected(testElement)).toBeTruthy(); + expect(selection.selected(otherElement)).toBeFalsy(); + selection.select(otherElement); + expect(selection.selected(testElement)).toBeFalsy(); + expect(selection.selected(otherElement)).toBeTruthy(); + }); + + it("cleans up the selection on destroy", function () { + selection.destroy(); + expect(testSelection).toEqual([]); + }); + + it("preserves other elements in the array", function () { + testSelection.push(42); + selection.select(testElement); + expect(testSelection).toEqual([testProxy, testElement, 42]); + }); + + it("considers the proxy to be selected", function () { + expect(selection.selected(testProxy)).toBeTruthy(); + selection.select(testElement); + // Even when something else is selected... + expect(selection.selected(testProxy)).toBeTruthy(); + }); + + it("treats selection of the proxy as a no-op", function () { + selection.select(testProxy); + expect(testSelection).toEqual([testProxy]); + }); }); }