2015-12-03 21:56:57 +00:00
|
|
|
/*****************************************************************************
|
2018-05-14 22:46:17 +00:00
|
|
|
* Open MCT, Copyright (c) 2014-2018, United States Government
|
2015-12-03 21:56:57 +00:00
|
|
|
* as represented by the Administrator of the National Aeronautics and Space
|
|
|
|
* Administration. All rights reserved.
|
|
|
|
*
|
2016-07-12 23:21:58 +00:00
|
|
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
2015-12-03 21:56:57 +00:00
|
|
|
* "License"); you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
|
|
* License for the specific language governing permissions and limitations
|
|
|
|
* under the License.
|
|
|
|
*
|
2016-07-12 23:21:58 +00:00
|
|
|
* Open MCT includes source code licensed under additional open source
|
2015-12-03 21:56:57 +00:00
|
|
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
|
|
* this source code distribution or the Licensing information page available
|
|
|
|
* at runtime from the About dialog for additional information.
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
define(
|
|
|
|
["../../src/directives/MCTSplitPane"],
|
|
|
|
function (MCTSplitPane) {
|
|
|
|
|
|
|
|
var JQLITE_METHODS = [
|
|
|
|
'on',
|
|
|
|
'addClass',
|
|
|
|
'children',
|
2016-01-04 20:19:33 +00:00
|
|
|
'eq',
|
|
|
|
'toggleClass',
|
|
|
|
'css'
|
2015-12-03 21:56:57 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
describe("The mct-split-pane directive", function () {
|
|
|
|
var mockParse,
|
|
|
|
mockLog,
|
|
|
|
mockInterval,
|
2016-01-04 20:19:33 +00:00
|
|
|
mockParsed,
|
2017-08-02 18:12:09 +00:00
|
|
|
mctSplitPane,
|
|
|
|
mockWindow = {};
|
2015-12-03 21:56:57 +00:00
|
|
|
|
|
|
|
beforeEach(function () {
|
|
|
|
mockParse = jasmine.createSpy('$parse');
|
|
|
|
mockLog =
|
|
|
|
jasmine.createSpyObj('$log', ['warn', 'info', 'debug']);
|
|
|
|
mockInterval = jasmine.createSpy('$interval');
|
|
|
|
mockInterval.cancel = jasmine.createSpy('mockCancel');
|
2016-01-04 20:19:33 +00:00
|
|
|
mockParsed = jasmine.createSpy('parsed');
|
|
|
|
mockParsed.assign = jasmine.createSpy('assign');
|
|
|
|
mockParse.andReturn(mockParsed);
|
|
|
|
|
2017-08-02 18:12:09 +00:00
|
|
|
mockWindow.localStorage = {
|
|
|
|
store: {},
|
|
|
|
setItem: function (key, value) {
|
|
|
|
this.store[key] = value;
|
|
|
|
},
|
|
|
|
getItem: function (key) {
|
|
|
|
return this.store[key];
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2015-12-03 21:56:57 +00:00
|
|
|
mctSplitPane = new MCTSplitPane(
|
|
|
|
mockParse,
|
|
|
|
mockLog,
|
2017-08-02 18:12:09 +00:00
|
|
|
mockInterval,
|
|
|
|
mockWindow
|
2015-12-03 21:56:57 +00:00
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("is only applicable as an element", function () {
|
|
|
|
expect(mctSplitPane.restrict).toEqual("E");
|
|
|
|
});
|
|
|
|
|
|
|
|
describe("when its controller is applied", function () {
|
|
|
|
var mockScope,
|
|
|
|
mockElement,
|
|
|
|
testAttrs,
|
|
|
|
mockChildren,
|
2016-01-04 20:19:33 +00:00
|
|
|
mockFirstPane,
|
|
|
|
mockSplitter,
|
|
|
|
mockSecondPane,
|
2015-12-03 21:56:57 +00:00
|
|
|
controller;
|
|
|
|
|
2016-01-04 20:19:33 +00:00
|
|
|
function fireOn(eventType) {
|
|
|
|
mockScope.$on.calls.forEach(function (call) {
|
|
|
|
if (call.args[0] === eventType) {
|
|
|
|
call.args[1]();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2015-12-03 21:56:57 +00:00
|
|
|
beforeEach(function () {
|
|
|
|
mockScope =
|
|
|
|
jasmine.createSpyObj('$scope', ['$apply', '$watch', '$on']);
|
|
|
|
mockElement =
|
|
|
|
jasmine.createSpyObj('element', JQLITE_METHODS);
|
2017-08-02 18:12:09 +00:00
|
|
|
testAttrs = {alias: 'rightSide'};
|
2015-12-03 21:56:57 +00:00
|
|
|
mockChildren =
|
|
|
|
jasmine.createSpyObj('children', JQLITE_METHODS);
|
2016-01-04 20:19:33 +00:00
|
|
|
mockFirstPane =
|
|
|
|
jasmine.createSpyObj('firstPane', JQLITE_METHODS);
|
|
|
|
mockSplitter =
|
|
|
|
jasmine.createSpyObj('splitter', JQLITE_METHODS);
|
|
|
|
mockSecondPane =
|
|
|
|
jasmine.createSpyObj('secondPane', JQLITE_METHODS);
|
2015-12-03 21:56:57 +00:00
|
|
|
|
|
|
|
mockElement.children.andReturn(mockChildren);
|
2016-01-04 20:19:33 +00:00
|
|
|
mockElement[0] = {
|
|
|
|
offsetWidth: 12321,
|
|
|
|
offsetHeight: 45654
|
|
|
|
};
|
|
|
|
mockChildren.eq.andCallFake(function (i) {
|
|
|
|
return [mockFirstPane, mockSplitter, mockSecondPane][i];
|
|
|
|
});
|
|
|
|
mockFirstPane[0] = { offsetWidth: 123, offsetHeight: 456 };
|
|
|
|
mockSplitter[0] = {
|
|
|
|
nodeName: 'mct-splitter',
|
|
|
|
offsetWidth: 10,
|
|
|
|
offsetHeight: 456
|
|
|
|
};
|
|
|
|
mockSecondPane[0] = { offsetWidth: 10, offsetHeight: 456 };
|
|
|
|
|
|
|
|
mockChildren[0] = mockFirstPane[0];
|
|
|
|
mockChildren[1] = mockSplitter[0];
|
|
|
|
mockChildren[3] = mockSecondPane[0];
|
|
|
|
mockChildren.length = 3;
|
2015-12-03 21:56:57 +00:00
|
|
|
|
|
|
|
controller = mctSplitPane.controller[3](
|
|
|
|
mockScope,
|
|
|
|
mockElement,
|
|
|
|
testAttrs
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("sets an interval which does not trigger digests", function () {
|
|
|
|
expect(mockInterval.mostRecentCall.args[3]).toBe(false);
|
|
|
|
});
|
|
|
|
|
2016-01-04 20:19:33 +00:00
|
|
|
it("exposes its splitter's initial position", function () {
|
|
|
|
expect(controller.position()).toEqual(
|
2017-08-29 17:34:44 +00:00
|
|
|
mockFirstPane[0].offsetWidth
|
2016-01-04 20:19:33 +00:00
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("exposes the current anchoring mode", function () {
|
|
|
|
expect(controller.anchor()).toEqual({
|
|
|
|
edge : 'left',
|
|
|
|
opposite : 'right',
|
|
|
|
dimension : 'width',
|
|
|
|
orientation : 'vertical'
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2017-08-02 18:12:09 +00:00
|
|
|
it("applies resizing class to children when resizing", function () {
|
|
|
|
controller.startResizing();
|
|
|
|
expect(mockChildren.toggleClass).toHaveBeenCalledWith('resizing');
|
|
|
|
});
|
|
|
|
|
|
|
|
it("removes resizing class from children when resizing action ends", function () {
|
|
|
|
controller.endResizing(0);
|
|
|
|
expect(mockChildren.toggleClass).toHaveBeenCalledWith('resizing');
|
2016-01-04 20:19:33 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
it("allows positions to be set", function () {
|
|
|
|
var testValue = mockChildren[0].offsetWidth + 50;
|
2017-08-29 18:50:20 +00:00
|
|
|
controller.position(testValue);
|
2016-01-04 20:19:33 +00:00
|
|
|
expect(mockFirstPane.css).toHaveBeenCalledWith(
|
|
|
|
'width',
|
2017-08-29 17:34:44 +00:00
|
|
|
(testValue) + 'px'
|
2016-01-04 20:19:33 +00:00
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("issues no warnings under nominal usage", function () {
|
|
|
|
expect(mockLog.warn).not.toHaveBeenCalled();
|
|
|
|
});
|
|
|
|
|
|
|
|
it("warns if no mct-splitter is present", function () {
|
|
|
|
mockSplitter[0].nodeName = "not-mct-splitter";
|
|
|
|
controller = mctSplitPane.controller[3](
|
|
|
|
mockScope,
|
|
|
|
mockElement,
|
|
|
|
testAttrs
|
|
|
|
);
|
|
|
|
expect(mockLog.warn).toHaveBeenCalled();
|
|
|
|
});
|
|
|
|
|
|
|
|
it("warns if an unknown anchor key is given", function () {
|
|
|
|
testAttrs.anchor = "middle";
|
|
|
|
controller = mctSplitPane.controller[3](
|
|
|
|
mockScope,
|
|
|
|
mockElement,
|
|
|
|
testAttrs
|
|
|
|
);
|
|
|
|
expect(mockLog.warn).toHaveBeenCalled();
|
|
|
|
});
|
|
|
|
|
|
|
|
it("updates positions on a timer", function () {
|
|
|
|
mockFirstPane[0].offsetWidth += 100;
|
|
|
|
// Should not reflect the change yet
|
|
|
|
expect(controller.position()).not.toEqual(
|
2017-08-29 17:34:44 +00:00
|
|
|
mockFirstPane[0].offsetWidth
|
2016-01-04 20:19:33 +00:00
|
|
|
);
|
|
|
|
mockInterval.mostRecentCall.args[0]();
|
|
|
|
expect(controller.position()).toEqual(
|
2017-08-29 17:34:44 +00:00
|
|
|
mockFirstPane[0].offsetWidth
|
2016-01-04 20:19:33 +00:00
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("cancels the active interval when scope is destroyed", function () {
|
|
|
|
expect(mockInterval.cancel).not.toHaveBeenCalled();
|
|
|
|
fireOn('$destroy');
|
|
|
|
expect(mockInterval.cancel).toHaveBeenCalled();
|
|
|
|
});
|
2017-08-02 18:12:09 +00:00
|
|
|
|
|
|
|
it("saves user preference to localStorage when user is done resizing", function () {
|
|
|
|
controller.endResizing(100);
|
2017-08-29 17:34:44 +00:00
|
|
|
expect(Number(mockWindow.localStorage.getItem('mctSplitPane-rightSide'))).toEqual(100);
|
2017-08-02 18:12:09 +00:00
|
|
|
});
|
|
|
|
|
2015-12-03 21:56:57 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
2016-05-19 18:29:13 +00:00
|
|
|
);
|