mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2026-03-13 10:22:08 +08:00
317 lines
9.3 KiB
JavaScript
317 lines
9.3 KiB
JavaScript
describe('$ionicSideMenus controller', function() {
|
|
var ctrl;
|
|
|
|
var Controller = function(opts) {
|
|
this.el = opts.el;
|
|
this.animateClass = opts.animateClass;
|
|
};
|
|
Controller.prototype = {
|
|
getTranslateX: function() {
|
|
var r = /translate3d\((-?.+)px/;
|
|
var d = r.exec(this.el.style.webkitTransform);
|
|
|
|
if(d && d.length > 0) {
|
|
return parseFloat(d[1]);
|
|
}
|
|
return 0;
|
|
},
|
|
setTranslateX: function(amount) {
|
|
this.el.style.webkitTransform = 'translate3d(' + amount + 'px, 0, 0)';
|
|
},
|
|
enableAnimation: function() {
|
|
this.el.classList.add(this.animateClass);
|
|
},
|
|
disableAnimation: function() {
|
|
this.el.classList.remove(this.animateClass);
|
|
}
|
|
};
|
|
|
|
beforeEach(module('ionic'));
|
|
|
|
beforeEach(function(){
|
|
|
|
inject(function($controller, $rootScope) {
|
|
var scope = $rootScope.$new();
|
|
ctrl = $controller('$ionicSideMenus', angular.extend({
|
|
$scope: scope,
|
|
$attrs: {}
|
|
}, {}));
|
|
angular.extend(ctrl, {});
|
|
ctrl.left = new ionic.views.SideMenu({
|
|
width: 270,
|
|
el: document.createElement('div'),
|
|
isEnabled: true
|
|
});
|
|
ctrl.right = new ionic.views.SideMenu({
|
|
width: 270,
|
|
el: document.createElement('div'),
|
|
isEnabled: true
|
|
});
|
|
var content = new Controller({ el: document.createElement('div') });
|
|
content.setMarginLeft = function(){};
|
|
ctrl.setContent(content);
|
|
});
|
|
|
|
});
|
|
|
|
// Menu enable/disable
|
|
it('should set enabled/disabled', function() {
|
|
ctrl.left.setIsEnabled(false);
|
|
ctrl.right.setIsEnabled(false);
|
|
expect(ctrl.left.isEnabled).toEqual(false);
|
|
expect(ctrl.right.isEnabled).toEqual(false);
|
|
ctrl.left.setIsEnabled(true);
|
|
ctrl.right.setIsEnabled(true);
|
|
expect(ctrl.left.isEnabled).toEqual(true);
|
|
expect(ctrl.right.isEnabled).toEqual(true);
|
|
});
|
|
|
|
// Menu widths
|
|
it('should init widths', function() {
|
|
expect(ctrl.left.width).toEqual(270);
|
|
expect(ctrl.right.width).toEqual(270);
|
|
});
|
|
|
|
it('should have amount and percentage correct', function() {
|
|
ctrl.openAmount(ctrl.left.width/2);
|
|
expect(ctrl.getOpenAmount()).toEqual(ctrl.left.width/2);
|
|
expect(ctrl.getOpenPercentage()).toEqual(50);
|
|
|
|
ctrl.openAmount(ctrl.left.width/4);
|
|
expect(ctrl.getOpenAmount()).toEqual(ctrl.left.width/4);
|
|
expect(ctrl.getOpenPercentage()).toEqual(25);
|
|
|
|
ctrl.openAmount(-ctrl.right.width/2);
|
|
expect(ctrl.getOpenAmount()).toEqual(-ctrl.right.width/2);
|
|
expect(ctrl.getOpenPercentage()).toEqual(-50);
|
|
});
|
|
|
|
it('should add/remove menu-open from the body class', inject(function($document) {
|
|
expect($document[0].body.classList.contains('menu-open')).toEqual(false);
|
|
ctrl.openPercentage(100);
|
|
expect($document[0].body.classList.contains('menu-open')).toEqual(true);
|
|
ctrl.openPercentage(0);
|
|
expect($document[0].body.classList.contains('menu-open')).toEqual(false);
|
|
}));
|
|
|
|
// Open
|
|
it('should toggle left', function() {
|
|
ctrl.toggleLeft();
|
|
expect(ctrl.getOpenPercentage()).toEqual(100);
|
|
ctrl.toggleLeft();
|
|
expect(ctrl.getOpenPercentage()).toEqual(0);
|
|
ctrl.toggleLeft();
|
|
expect(ctrl.getOpenPercentage()).toEqual(100);
|
|
ctrl.toggleLeft();
|
|
expect(ctrl.getOpenPercentage()).toEqual(0);
|
|
});
|
|
|
|
it('should not toggle left with exposed aside', function() {
|
|
expect(ctrl.getOpenPercentage()).toEqual(0);
|
|
ctrl.exposeAside(true);
|
|
ctrl.toggleLeft();
|
|
expect(ctrl.getOpenPercentage()).toEqual(0);
|
|
});
|
|
|
|
it('should not toggle right with exposed aside', function() {
|
|
expect(ctrl.getOpenPercentage()).toEqual(0);
|
|
ctrl.exposeAside(true);
|
|
ctrl.toggleRight();
|
|
expect(ctrl.getOpenPercentage()).toEqual(0);
|
|
});
|
|
|
|
it('should not toggle left when disabled', function() {
|
|
expect(ctrl.getOpenPercentage()).toEqual(0);
|
|
ctrl.left.isEnabled = false;
|
|
ctrl.toggleLeft();
|
|
expect(ctrl.getOpenPercentage()).toEqual(0);
|
|
ctrl.left.isEnabled = true;
|
|
ctrl.toggleLeft();
|
|
expect(ctrl.getOpenPercentage()).toNotEqual(0);
|
|
});
|
|
|
|
it('should not toggle right when disabled', function() {
|
|
expect(ctrl.getOpenPercentage()).toEqual(0);
|
|
ctrl.right.isEnabled = false;
|
|
ctrl.toggleRight();
|
|
expect(ctrl.getOpenPercentage()).toEqual(0);
|
|
ctrl.right.isEnabled = true;
|
|
ctrl.toggleRight();
|
|
expect(ctrl.getOpenPercentage()).toNotEqual(0);
|
|
});
|
|
|
|
it('should close left menu on expose aside', function() {
|
|
ctrl.toggleLeft();
|
|
expect(ctrl.getOpenPercentage()).toEqual(100);
|
|
ctrl.exposeAside(true);
|
|
expect(ctrl.getOpenPercentage()).toEqual(0);
|
|
});
|
|
|
|
it('should close right menu on expose aside', function() {
|
|
ctrl.toggleRight();
|
|
expect(ctrl.getOpenPercentage()).toEqual(-100);
|
|
ctrl.exposeAside(true);
|
|
expect(ctrl.getOpenPercentage()).toEqual(0);
|
|
});
|
|
|
|
it('should set enabled/disabled exposeAside', function() {
|
|
expect(ctrl.isAsideExposed()).toEqual(false);
|
|
ctrl.left.setIsEnabled(false);
|
|
ctrl.exposeAside(true);
|
|
expect(ctrl.isAsideExposed()).toEqual(false);
|
|
ctrl.left.setIsEnabled(true);
|
|
ctrl.exposeAside(true);
|
|
expect(ctrl.isAsideExposed()).toEqual(true);
|
|
});
|
|
|
|
it('should toggle right', function() {
|
|
ctrl.toggleRight();
|
|
expect(ctrl.getOpenPercentage()).toEqual(-100);
|
|
ctrl.toggleRight();
|
|
expect(ctrl.getOpenPercentage()).toEqual(0);
|
|
ctrl.toggleRight();
|
|
expect(ctrl.getOpenPercentage()).toEqual(-100);
|
|
ctrl.toggleRight();
|
|
expect(ctrl.getOpenPercentage()).toEqual(0);
|
|
});
|
|
|
|
it('should isOpen', function() {
|
|
expect(ctrl.isOpen()).toEqual(false);
|
|
ctrl.toggleLeft();
|
|
expect(ctrl.isOpen()).toEqual(true);
|
|
ctrl.toggleLeft();
|
|
expect(ctrl.isOpen()).toEqual(false);
|
|
ctrl.toggleLeft();
|
|
expect(ctrl.isOpen()).toEqual(true);
|
|
ctrl.toggleLeft();
|
|
|
|
expect(ctrl.isOpen()).toEqual(false);
|
|
ctrl.toggleRight();
|
|
expect(ctrl.isOpen()).toEqual(true);
|
|
ctrl.toggleRight();
|
|
expect(ctrl.isOpen()).toEqual(false);
|
|
ctrl.toggleRight();
|
|
expect(ctrl.isOpen()).toEqual(true);
|
|
});
|
|
|
|
|
|
it('should isOpenLeft', function() {
|
|
expect(ctrl.isOpenLeft()).toEqual(false);
|
|
ctrl.toggleLeft();
|
|
expect(ctrl.isOpenLeft()).toEqual(true);
|
|
ctrl.toggleLeft();
|
|
expect(ctrl.isOpenLeft()).toEqual(false);
|
|
ctrl.toggleLeft();
|
|
expect(ctrl.isOpenLeft()).toEqual(true);
|
|
});
|
|
|
|
it('should isOpenRight', function() {
|
|
expect(ctrl.isOpenRight()).toEqual(false);
|
|
ctrl.toggleRight();
|
|
expect(ctrl.isOpenRight()).toEqual(true);
|
|
ctrl.toggleRight();
|
|
expect(ctrl.isOpenRight()).toEqual(false);
|
|
ctrl.toggleRight();
|
|
expect(ctrl.isOpenRight()).toEqual(true);
|
|
});
|
|
|
|
// Snap
|
|
it('should snap', function() {
|
|
|
|
// Center to right, Going right, less than half, too slow (snap back)
|
|
ctrl.openAmount(10);
|
|
ctrl.snapToRest({
|
|
gesture: {
|
|
velocityX: 0,
|
|
direction: 'right'
|
|
}
|
|
});
|
|
expect(ctrl.getOpenPercentage()).toEqual(0);
|
|
|
|
// Right to left, Going left, more than half, too slow (snap back)
|
|
ctrl.openPercentage(51);
|
|
ctrl.snapToRest({
|
|
gesture: {
|
|
velocityX: 0,
|
|
direction: 'left'
|
|
}
|
|
});
|
|
expect(ctrl.getOpenPercentage()).toEqual(100);
|
|
|
|
// Right to left, Going left, less than half, too slow (snap back)
|
|
ctrl.openAmount(10);
|
|
ctrl.snapToRest({
|
|
gesture: {
|
|
velocityX: 0,
|
|
direction: 'left'
|
|
}
|
|
});
|
|
expect(ctrl.getOpenPercentage()).toEqual(0);
|
|
|
|
// Left to right, Going right, more than half, too slow (snap back)
|
|
ctrl.openPercentage(-51);
|
|
ctrl.snapToRest({
|
|
gesture: {
|
|
velocityX: 0,
|
|
direction: 'right'
|
|
}
|
|
});
|
|
expect(ctrl.getOpenPercentage()).toEqual(-100);
|
|
|
|
// Going right, more than half, or quickly (snap open)
|
|
ctrl.openPercentage(-51);
|
|
ctrl.snapToRest({
|
|
gesture: {
|
|
velocityX: 1,
|
|
direction: 'right'
|
|
}
|
|
});
|
|
expect(ctrl.getOpenPercentage()).toEqual(0);
|
|
|
|
// Going left, more than half, or quickly (snap open)
|
|
ctrl.openPercentage(-51);
|
|
ctrl.snapToRest({
|
|
gesture: {
|
|
velocityX: 1,
|
|
direction: 'left'
|
|
}
|
|
});
|
|
expect(ctrl.getOpenPercentage()).toEqual(-100);
|
|
});
|
|
|
|
it('should register with backButton on open and dereg on close', inject(function($ionicPlatform) {
|
|
var openAmount = 0;
|
|
var deregSpy = jasmine.createSpy('deregister');
|
|
spyOn($ionicPlatform, 'registerBackButtonAction').andReturn(deregSpy);
|
|
|
|
spyOn(ctrl, 'getOpenAmount').andCallFake(function() { return openAmount; });
|
|
|
|
expect($ionicPlatform.registerBackButtonAction).not.toHaveBeenCalled();
|
|
openAmount = 1;
|
|
ctrl.$scope.$apply();
|
|
expect($ionicPlatform.registerBackButtonAction).toHaveBeenCalledWith(
|
|
jasmine.any(Function),
|
|
PLATFORM_BACK_BUTTON_PRIORITY_SIDE_MENU
|
|
);
|
|
expect(deregSpy).not.toHaveBeenCalled();
|
|
openAmount = 0;
|
|
ctrl.$scope.$apply();
|
|
expect(deregSpy).toHaveBeenCalled();
|
|
}));
|
|
|
|
it('should deregister back button action on $destroy', inject(function($ionicPlatform) {
|
|
var openAmount = 0;
|
|
var deregSpy = jasmine.createSpy('deregister');
|
|
spyOn($ionicPlatform, 'registerBackButtonAction').andReturn(deregSpy);
|
|
|
|
spyOn(ctrl, 'getOpenAmount').andCallFake(function() { return openAmount; });
|
|
|
|
expect($ionicPlatform.registerBackButtonAction).not.toHaveBeenCalled();
|
|
openAmount = 1;
|
|
ctrl.$scope.$apply();
|
|
expect(deregSpy).not.toHaveBeenCalled();
|
|
ctrl.$scope.$destroy();
|
|
expect(deregSpy).toHaveBeenCalled();
|
|
}));
|
|
});
|