diff --git a/platform/representation/src/gestures/GestureProvider.js b/platform/representation/src/gestures/GestureProvider.js index 1bf7307f4f..d77875fc67 100644 --- a/platform/representation/src/gestures/GestureProvider.js +++ b/platform/representation/src/gestures/GestureProvider.js @@ -15,12 +15,10 @@ define( function GestureProvider(gestures) { var gestureMap = {}; - function releaseGestures(gestures) { - gestures.forEach(function (gesture) { - if (gesture && gesture.destroy) { - gesture.destroy(); - } - }); + function releaseGesture(gesture) { + if (gesture && gesture.destroy) { + gesture.destroy(); + } } function attachGestures(element, domainObject, gestureKeys) { @@ -36,7 +34,7 @@ define( return { destroy: function () { - releaseGestures(attachedGestures); + attachedGestures.forEach(releaseGesture); } }; } diff --git a/platform/representation/test/gestures/GestureProviderSpec.js b/platform/representation/test/gestures/GestureProviderSpec.js new file mode 100644 index 0000000000..2e5b6fcef5 --- /dev/null +++ b/platform/representation/test/gestures/GestureProviderSpec.js @@ -0,0 +1,70 @@ +/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/ + +/** + * GestureProviderSpec. Created by vwoeltje on 11/6/14. + */ +define( + ["../../src/gestures/GestureProvider"], + function (GestureProvider) { + "use strict"; + + var JQLITE_FUNCTIONS = [ "on", "off", "attr", "removeAttr" ], + GESTURE_KEYS = ["a", "b", "c", "d", "e"], + DOMAIN_OBJECT_METHODS = [ "getId", "getModel", "getCapability", "hasCapability", "useCapability"]; + + describe("The gesture provider", function () { + var mockGestures, + mockDestroys, + mockElement, + mockDomainObject, + provider; + + beforeEach(function () { + mockElement = jasmine.createSpyObj("element", JQLITE_FUNCTIONS); + mockDomainObject = jasmine.createSpyObj("domainObject", DOMAIN_OBJECT_METHODS); + + mockDestroys = {}; + mockGestures = {}; + GESTURE_KEYS.forEach(function (key) { + mockDestroys[key] = jasmine.createSpy("destroy-" + key); + mockGestures[key] = jasmine.createSpy("gesture-" + key); + mockGestures[key].andReturn({ destroy: mockDestroys[key] }); + mockGestures[key].key = key; + }); + + provider = new GestureProvider(GESTURE_KEYS.map(function (key) { + return mockGestures[key]; + })); + }); + + it("attaches matching to an element", function () { + provider.attachGestures(mockElement, mockDomainObject, ["a", "c", "e"]); + + expect(mockGestures.a).toHaveBeenCalledWith(mockElement, mockDomainObject); + expect(mockGestures.c).toHaveBeenCalledWith(mockElement, mockDomainObject); + expect(mockGestures.e).toHaveBeenCalledWith(mockElement, mockDomainObject); + expect(mockGestures.b).not.toHaveBeenCalled(); + expect(mockGestures.d).not.toHaveBeenCalled(); + + // No destroys should have been called - let's check + GESTURE_KEYS.forEach(function (key) { + expect(mockDestroys[key]).not.toHaveBeenCalled(); + }); + }); + + it("detaches gestures on request", function () { + provider.attachGestures( + mockElement, + mockDomainObject, + ["b", "d", "e"] + ).destroy(); + + expect(mockDestroys.b).toHaveBeenCalled(); + expect(mockDestroys.d).toHaveBeenCalled(); + expect(mockDestroys.e).toHaveBeenCalled(); + expect(mockDestroys.a).not.toHaveBeenCalled(); + expect(mockDestroys.c).not.toHaveBeenCalled(); + }); + }); + } +); \ No newline at end of file diff --git a/platform/representation/test/suite.json b/platform/representation/test/suite.json index ab3c83ac32..0d26002539 100644 --- a/platform/representation/test/suite.json +++ b/platform/representation/test/suite.json @@ -2,6 +2,7 @@ "gestures/ContextMenuGesture", "gestures/DragGesture", "gestures/DropGesture", + "gestures/GestureProvider", "MCTInclude", "MCTRepresentation" ] \ No newline at end of file