-
Notifications
You must be signed in to change notification settings - Fork 86
/
control.spec.js
129 lines (102 loc) · 4.11 KB
/
control.spec.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
modules.define(
'spec',
['i-bem__dom', 'control', 'jquery', 'dom', 'objects', 'next-tick', 'BEMHTML', 'chai'],
function(provide, BEMDOM, Control, $, dom, objects, nextTick, BEMHTML, chai) {
var expect = chai.expect;
describe('control', function() {
var bemjson = {
block : 'control',
js : true,
tag : 'span',
content : {
elem : 'control',
tag : 'input',
attrs : { name : 'blah' }
}
},
control, controlElem;
beforeEach(function() {
control = buildControl(bemjson);
controlElem = control.elem('control');
});
afterEach(function() {
BEMDOM.destruct(control.domElem);
});
describe('name', function() {
it('getName should return name of the control', function() {
control.getName().should.be.equal('blah');
});
it('getName should return an empty string for non inputs', function() {
// NOTE: we're replacing `<input>` tag with `<span>`
var controlElem = control.findElem('control');
controlElem.replaceWith('<span class="' + controlElem[0].className + '" tabindex="0">Blah</span>');
control.dropElemCache();
control.getName().should.be.equal('');
});
});
describe('value', function() {
it('getVal should return value of the control', function() {
controlElem.val('blah-blah');
control.getVal().should.be.equal('blah-blah');
});
});
describe('focus', function() {
it('should synchronize focus state with DOM-focus', function() {
control.hasMod('focused').should.be.false;
controlElem.focus();
control.hasMod('focused').should.be.true;
controlElem.blur();
control.hasMod('focused').should.be.false;
});
it('should synchronize DOM-focus with focus state', function() {
control.hasMod('focused').should.be.false;
control.setMod('focused');
dom.getFocused()[0].should.be.equal(controlElem[0]);
control.delMod('focused');
dom.getFocused()[0].should.not.be.equal(controlElem[0]);
});
it('should set focus state if DOM-focus has been set before init', function() {
var domElem = $(BEMHTML.apply(bemjson)).appendTo('body');
domElem.find('.' + Control.buildClass('control')).focus();
var control = BEMDOM.init(domElem).bem('control');
control.hasMod('focused').should.be.true;
BEMDOM.destruct(control.domElem);
});
it('should have DOM-focus if initialized with focus state', function() {
var bemJson = objects.extend({}, bemjson);
bemJson.mods = { focused : true };
var control = buildControl(bemJson);
dom.containsFocus(control.elem('control')).should.be.true;
BEMDOM.destruct(control.domElem);
});
});
describe('disable', function() {
it('should drop focus state on disabling', function() {
control
.setMod('focused')
.setMod('disabled')
.hasMod('focused').should.be.false;
});
it('should not set focus state if disabled', function() {
control
.setMod('disabled')
.setMod('focused')
.hasMod('focused').should.be.false;
});
it('should react on disabling', function() {
controlElem.prop('disabled').should.be.false;
expect(controlElem.attr('disabled')).to.be.undefined;
control.setMod('disabled');
controlElem.prop('disabled').should.be.true;
controlElem.attr('disabled').should.be.equal('disabled');
control.delMod('disabled');
controlElem.prop('disabled').should.be.false;
expect(controlElem.attr('disabled')).to.be.undefined;
});
});
});
provide();
function buildControl(bemjson) {
return BEMDOM.init($(BEMHTML.apply(bemjson)).appendTo('body')).bem('control');
}
});