textnavi/static/bower_components/bootstrap-multiselect/tests/spec/bootstrap-multiselect.js

2329 lines
92 KiB
JavaScript

describe('Bootstrap Multiselect "Core".', function() {
var onInitialized = false;
beforeEach(function() {
var $select = $('<select id="multiselect" multiple="multiple"></select>');
for (var i = 1; i < 100; i++) {
var $option = $('<option value="' + i + '">' + i + '</option>');
if (i < 10) {
$option.prop('selected', true);
}
$select.append($option);
}
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
onInitialized: function($select) {
onInitialized = true;
},
checkboxName: function($option) {
return 'value-' + $($option).attr('value');
}
});
});
it('Should add the container after the select.', function() {
expect($('#multiselect-container').length).toBe(1);
});
it('Should add the multiselect button.', function() {
expect($('#multiselect-container .multiselect').length).toBe(1);
});
it('Should add the dropdown menu.', function() {
expect($('#multiselect-container .dropdown-menu').length).toBe(1);
});
it('Should add an li element with checkbox and label for each option.', function() {
expect($('#multiselect-container li').length).toBe(99);
expect($('#multiselect-container label').length).toBe(99);
expect($('#multiselect-container input[type="checkbox"]').length).toBe(99);
});
it('Should preserve selected options.', function() {
expect($('#multiselect-container input[type="checkbox"]:checked').length).toBe(9);
expect($('#multiselect option:selected').length).toBe(9);
});
it('Should be able to select options by value.', function() {
$('#multiselect').multiselect('select', '10');
expect($('#multiselect option[value="10"]').prop('selected')).toBe(true);
expect($('#multiselect-container input[value="10"]').prop('checked')).toBe(true);
});
it('Select method should handle "null" and "undefined" correctly.', function() {
expect($('#multiselect option:selected').length).toBe(9);
$('#multiselect').multiselect('select', null);
expect($('#multiselect option:selected').length).toBe(9);
$('#multiselect').multiselect('select', undefined);
expect($('#multiselect option:selected').length).toBe(9);
});
it('Should be able to deselect options by value.', function() {
$('#multiselect').multiselect('select', '10');
$('#multiselect').multiselect('deselect', '10');
expect($('#multiselect option[value="10"]').prop('selected')).toBe(false);
expect($('#multiselect-container input[value="10"]').prop('checked')).toBe(false);
});
it('Deselect method should handle "null" and "undefined" correctly.', function() {
expect($('#multiselect option:selected').length).toBe(9);
$('#multiselect').multiselect('deselect', null);
expect($('#multiselect option:selected').length).toBe(9);
$('#multiselect').multiselect('deselect', undefined);
expect($('#multiselect option:selected').length).toBe(9);
});
it('Should be able to select options using an array of values.', function() {
$('#multiselect').multiselect('select', ['10', '11']);
expect($('#multiselect option[value="10"]').prop('selected')).toBe(true);
expect($('#multiselect-container input[value="10"]').prop('checked')).toBe(true);
expect($('#multiselect option[value="11"]').prop('selected')).toBe(true);
expect($('#multiselect-container input[value="11"]').prop('checked')).toBe(true);
});
it('Should be able to deselect options using an array of values.', function() {
$('#multiselect').multiselect('select', ['10', '11']);
$('#multiselect').multiselect('deselect', ['10', '11']);
expect($('#multiselect option[value="10"]').prop('selected')).toBe(false);
expect($('#multiselect-container input[value="10"]').prop('checked')).toBe(false);
expect($('#multiselect option[value="11"]').prop('selected')).toBe(false);
expect($('#multiselect-container input[value="11"]').prop('checked')).toBe(false);
});
it('Should be able to disable the multiselect', function() {
$('#multiselect').multiselect('disable');
expect($('#multiselect').prop('disabled')).toBe(true);
});
it('Should be able to enable the multiselect', function() {
$('#multiselect').multiselect('disable');
$('#multiselect').multiselect('enable');
expect($('#multiselect').prop('disabled')).toBe(false);
});
it('Should be able to select all options.', function() {
$('#multiselect').multiselect('selectAll');
for (var i = 1; i < 100; i++) {
expect($('#multiselect option[value="' + i.toString() + '"]').prop('selected')).toBe(true);
expect($('#multiselect-container input[value="' + i.toString() + '"]').prop('checked')).toBe(true);
}
});
it('Should be able to deselect all options.', function() {
$('#multiselect').multiselect('selectAll');
for (var i = 1; i < 100; i++) {
expect($('#multiselect option[value="' + i.toString() + '"]').prop('selected')).toBe(true);
expect($('#multiselect-container input[value="' + i.toString() + '"]').prop('checked')).toBe(true);
}
$('#multiselect').multiselect('deselectAll');
for (var i = 1; i < 100; i++) {
expect($('#multiselect option[value="' + i.toString() + '"]').prop('selected')).toBe(false);
expect($('#multiselect-container input[value="' + i.toString() + '"]').prop('checked')).toBe(false);
}
});
it('Should update the checkboxes according to the selected options after using refresh.', function() {
for (var i = 10; i < 20; i++) {
$('#multiselect option[value="' + i + '"]').prop('selected', true);
}
expect($('#multiselect option:selected').length).toBe(19);
expect($('#multiselect-container input[type="checkbox"]:checked').length).toBe(9);
$('#multiselect').multiselect('refresh');
expect($('#multiselect-container input[type="checkbox"]:checked').length).toBe(19);
for (var i = 10; i < 20; i++) {
expect($('#multiselect option[value="' + i + '"]').prop('selected')).toBe(true);
}
});
it('Should remove container, button and ul after destroy.', function() {
$('#multiselect').multiselect('destroy');
// Destroy should remove container, button and ul.
expect($('#multiselect-container.multiselect-container').length).toBe(0);
expect($('#multiselect-container .multiselect').length).toBe(0);
expect($('#multiselect-container .dropdown-menu').length).toBe(0);
});
it('Should select an option when checkbox is changed (change event).', function() {
$('#multiselect-container li input[value="10"]').prop('checked', true);
$('#multiselect-container li input[value="10"]').trigger('change');
expect($('#multiselect-container input[value="10"]').prop('checked')).toBe(true);
expect($('#multiselect option[value="10"]').prop('selected')).toBe(true);
});
it('Should deselect an option when checkbox is changed (change event).', function() {
$('#multiselect-container li input[value="10"]').prop('checked', true);
$('#multiselect-container li input[value="10"]').trigger('change');
// Already checked above.
$('#multiselect-container li input[value="10"]').prop('checked', false);
$('#multiselect-container li input[value="10"]').trigger('change');
expect($('#multiselect-container input[value="10"]').prop('checked')).toBe(false);
expect($('#multiselect option[value="10"]').prop('selected')).toBe(false);
});
it('Should select an option when checkbox is clicked.', function() {
$('#multiselect-container li input[value="10"]').click();
expect($('#multiselect-container input[value="10"]').prop('checked')).toBe(true);
expect($('#multiselect option[value="10"]').prop('selected')).toBe(true);
});
it('Should deselect an option when checkbox is clicked.', function() {
$('#multiselect-container li input[value="10"]').click();
$('#multiselect-container li input[value="10"]').click();
expect($('#multiselect-container input[value="10"]').prop('checked')).toBe(false);
expect($('#multiselect option[value="10"]').prop('selected')).toBe(false);
});
it('Should trigger onInitialized.', function() {
expect(onInitialized).toBe(true);
});
it('Should correctly apply checkboxName.', function() {
$('#multiselect-container input').each(function() {
expect($(this).attr('name')).toBe('value-' + $(this).attr('value'));
});
});
afterEach(function() {
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
});
describe('Bootstrap Multiselect "Multiple Multiselects".', function() {
var multiselects = ['one', 'two', 'three'];
var onSelectAllTriggered = 0;
var onDeselectAllTriggered = 0;
var onChangeFired = 0;
beforeEach(function() {
onSelectAllTriggered = 0;
onDeselectAllTriggered = 0;
onChangeFired = 0;
for (var m = 0; m < 3; m++) {
var $select = $('<select id="multiselect-' + multiselects[m] + '" multiple="multiple"></select>');
for (var i = 1; i < 10; i++) {
$select.append('<option value="' + i + '">Option ' + i + '</option>');
}
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container-' + multiselects[m] + '"></div>',
includeSelectAllOption: true,
selectAllValue: 'multiselect-all',
onSelectAll: function() {
onSelectAllTriggered++;
},
onDeselectAll: function() {
onDeselectAllTriggered++;
},
onChange: function(option, checked) {
onChangeFired++;
}
});
}
});
it('Should initialize all multiselects.', function() {
expect($('.multiselect').length).toBe(3);
for (var m = 0; m < 3; m++) {
expect($('#multiselect-' + multiselects[m]).length).toBe(1);
expect($('#multiselect-container-' + multiselects[m]).length).toBe(1);
expect($('#multiselect-container-' + multiselects[m] + ' .multiselect').length).toBe(1);
expect($('#multiselect-container-' + multiselects[m] + ' .dropdown-menu').length).toBe(1);
expect($('#multiselect-container-' + multiselects[m] + ' li').length).toBe(10); // including select all
expect($('#multiselect-container-' + multiselects[m] + ' label').length).toBe(10); // including select all
expect($('#multiselect-container-' + multiselects[m] + ' input[type="checkbox"]').length).toBe(10); // including select all
}
});
it('Should not select/deselect options in other multiselects.', function() {
for (var m = 0; m < 3; m++) {
for (var i = 1; i < 10; i++) {
$('#multiselect-container-' + multiselects[m] + ' input[value="' + i + '"]').click();
expect($('#multiselect-container-' + multiselects[m] + ' input[value!="multiselect-all"]:checked').length).toBe(i);
for (var n = 0; n < 3; n++) {
if (m != n) {
expect($('#multiselect-container-' + multiselects[n] + ' input[value!="multiselect-all"]:checked').length).toBe(0);
}
}
}
for (var i = 9; i >= 1; i--) {
$('#multiselect-container-' + multiselects[m] + ' input[value="' + i + '"]').click();
expect($('#multiselect-container-' + multiselects[m] + ' input[value!="multiselect-all"]:checked').length).toBe(i - 1);
for (var n = 0; n < 3; n++) {
if (m != n) {
expect($('#multiselect-container-' + multiselects[n] + ' input[value!="multiselect-all"]:checked').length).toBe(0);
}
}
}
}
});
it('Should not trigger onChange in other multiselects.', function() {
for (var m = 0; m < 3; m++) {
for (var i = 1; i < 10; i++) {
$('#multiselect-container-' + multiselects[m] + ' input[value="' + i + '"]').click();
expect(onChangeFired).toBe(1);
onChangeFired = 0;
}
}
});
it('Should not select all/deselect all options in other multiselects.', function() {
for (var m = 0; m < 3; m++) {
$('#multiselect-container-' + multiselects[m] + ' input[value="multiselect-all"]').click();
expect($('#multiselect-container-' + multiselects[m] + ' input[value!="multiselect-all"]:checked').length).toBe(9);
for (var n = 0; n < 3; n++) {
if (n != m) {
expect($('#multiselect-container-' + multiselects[n] + ' input[value!="multiselect-all"]:checked').length).toBe(0);
expect($('#multiselect-container-' + multiselects[n] + ' input[value="multiselect-all"]:checked').length).toBe(0);
}
}
$('#multiselect-container-' + multiselects[m] + ' input[value="multiselect-all"]').click();
expect($('#multiselect-container-' + multiselects[m] + ' input[value!="multiselect-all"]:checked').length).toBe(0);
}
});
it('Should not trigger onSelectAll in other multiselects.', function() {
for (var m = 0; m < 3; m++) {
$('#multiselect-container-' + multiselects[m] + ' input[value="multiselect-all"]').click();
expect(onSelectAllTriggered).toBe(1);
expect(onChangeFired).toBe(0);
$('#multiselect-container-' + multiselects[m] + ' input[value="multiselect-all"]').click();
onSelectAllTriggered = 0;
}
});
it('Should not trigger onDeselectAll in other multiselects', function() {
for (var m = 0; m < 3; m++) {
$('#multiselect-container-' + multiselects[m] + ' input[value="multiselect-all"]').click();
$('#multiselect-container-' + multiselects[m] + ' input[value="multiselect-all"]').click();
expect(onSelectAllTriggered).toBe(1);
expect(onDeselectAllTriggered).toBe(1);
expect(onChangeFired).toBe(0);
onSelectAllTriggered = 0;
onDeselectAllTriggered = 0;
}
});
afterEach(function() {
for (var m = 0; m < 3; m++) {
$('#multiselect-' + multiselects[m]).multiselect('destroy');
$('#multiselect-' + multiselects[m]).remove();
}
});
});
describe('Bootstrap Multiselect "Single Selection".', function() {
beforeEach(function() {
var $select = $('<select id="multiselect"></select>');
for (var i = 1; i < 100; i++) {
$select.append('<option value="' + i + '">Option ' + i + '</option>');
}
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>'
});
});
it('Should create radio buttons instead of checkboxes.', function() {
expect($('#multiselect-container input[type="radio"]').length).toBe(99);
expect($('#multiselect-container input[type="checkbox"]').length).toBe(0);
// Browser selects one option per default.
expect($('#multiselect option:selected').length).toBe(1);
});
it('Only one option at a time can be selected.', function() {
expect($('#multiselect option:selected').length).toBe(1);
var i = 0;
$('#multiselect-container input').each(function() {
if (i === 0) {
expect($(this).prop('checked')).toBe(true);
i++;
}
else {
expect($(this).prop('checked')).toBe(false);
$(this).click();
expect($('#multiselect option:selected').length).toBe(1);
expect($(this).prop('checked')).toBe(true);
i++;
}
});
});
it('Deselect all should work.', function() {
expect($('#multiselect option:selected').length).toBe(1);
});
afterEach(function() {
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
});
describe('Bootstrap Multiselect "Individual Configuration Options".', function() {
describe('disableIfEmpty.', function() {
var $select = null;
beforeEach(function() {
$select = $('<select id="multiselect"></select>');
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
disableIfEmpty: true
});
});
it('Should disable button if emppty.', function() {
expect($('#multiselect-container button').prop('disabled')).toBe(true);
});
it('Should still be disabled after invoking rebuild.', function() {
$select.multiselect('rebuild');
expect($('#multiselect-container button').prop('disabled')).toBe(true);
});
it('Should not be disabled after invoking rebuild after adding options.', function() {
$select.append('<option value="value-1">Option 1</option>');
$select.multiselect('rebuild');
expect($('#multiselect-container button').prop('disabled')).toBe(false);
});
it('Should not be disabled after rebuilding with more options after invoking destroy.', function() {
$select.append('<option value="value-1">Option 1</option>');
$select.multiselect('destroy');
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
disableIfEmpty: true
});
expect($('#multiselect-container button').prop('disabled')).toBe(false);
});
afterEach(function() {
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
});
});
describe('Bootstrap Multiselect "individual Methods".', function() {
describe('Method "clearSelection" should clear selection in multiple mode.', function() {
beforeEach(function() {
var $select = $('<select id="multiselect" multiple="multiple"></select>');
$select.append('<option value="value-1">Option 1</option>');
$select.append('<option value="value-2">Option 2</option>');
$select.append('<option value="value-3">Option 3</option>');
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>'
});
});
it('Method "clearSelection" should clear selection.', function() {
$('#multiselect-container input[value="value-1"]').click();
$('#multiselect-container input[value="value-2"]').click();
expect($('#multiselect-container input:checked').length).toBe(2);
expect($('#multiselect option:selected').length).toBe(2);
$('#multiselect').multiselect('clearSelection');
expect($('#multiselect-container input:checked').length).toBe(0);
expect($('#multiselect option:selected').length).toBe(0);
});
afterEach(function() {
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
});
describe('Method "clearSelection" should correctly update select all.', function() {
beforeEach(function() {
var $select = $('<select id="multiselect" multiple="multiple"></select>');
$select.append('<option value="value-1">Option 1</option>');
$select.append('<option value="value-2">Option 2</option>');
$select.append('<option value="value-3">Option 3</option>');
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
includeSelectAllOption: true,
selectAllValue: 'multiselect-all'
});
});
it('Method "clearSelection" should clear selection.', function() {
$('#multiselect-container input[value="multiselect-all"]').click();
expect($('#multiselect-container input:checked').length).toBe(4);
expect($('#multiselect option:selected').length).toBe(3);
$('#multiselect').multiselect('clearSelection');
expect($('#multiselect-container input:checked').length).toBe(0);
expect($('#multiselect option:selected').length).toBe(0);
});
afterEach(function() {
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
});
describe('Method "clearSelection" should clear selection in single mode.', function() {
beforeEach(function() {
var $select = $('<select id="multiselect"></select>');
$select.append('<option value="value-1">Option 1</option>');
$select.append('<option value="value-2">Option 2</option>');
$select.append('<option value="value-3">Option 3</option>');
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>'
});
});
it('Method "clearSelection" is NOT able to clear selection.', function() {
$('#multiselect-container input[value="value-2"]').click();
expect($('#multiselect-container input:checked').length).toBe(1);
expect($('#multiselect option:selected').length).toBe(1);
$('#multiselect').multiselect('clearSelection');
expect($('#multiselect-container input:checked').length).toBe(1);
expect($('#multiselect option:selected').length).toBe(1);
});
afterEach(function() {
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
});
});
describe('Bootstrap Multiselect "Clickable Optgroups"', function() {
// Count the number of onChanges fired.
var fired = 0;
beforeEach(function() {
var $select = $('<select id="multiselect" multiple="multiple"></select>');
for (var i = 1; i < 11; i++) {
var $optgroup = $('<optgroup label="Group ' + i + '"></optgroup>');
for (var j = 1; j < 11; j++) {
if (i == 1) {
$optgroup.append('<option value="' + i + '-' + j + '" selected="selected">Option ' + i + '.' + j + '</option>');
}
else {
$optgroup.append('<option value="' + i + '-' + j + '">Option ' + i + '.' + j + '</option>');
}
}
$select.append($optgroup);
}
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableClickableOptGroups: true,
numberDisplayed: 10,
onChange: function(option, checked) {
fired++;
}
});
});
it('Should correctly create inputs for optgroups.', function() {
expect($('#multiselect-container li.multiselect-group').length).toBe(10);
expect($('#multiselect-container li.multiselect-group input').length).toBe(10);
$('#multiselect-container label.multiselect-group').each(function() {
expect($('input', $(this)).length).toBe(10);
});
});
it('Groups should be clickable and correctly initialized.', function() {
expect($('#multiselect option:selected').length).toBe(10);
expect(fired).toBe(0);
var i = 0;
$('#multiselect-container li.multiselect-group').each(function() {
if (i == 0) {
$('label', $(this)).click();
expect($('option:selected', $('#multiselect optgroup')[i]).length).toBe(0);
expect($('#multiselect option:selected').length).toBe(0);
$('label', $(this)).click()
expect($('option:selected', $('#multiselect optgroup')[i]).length).toBe(10);
expect($('#multiselect option:selected').length).toBe(10);
}
else {
$('label', $(this)).click();
expect($('option:selected', $('#multiselect optgroup')[i]).length).toBe(10);
expect($('#multiselect option:selected').length).toBe(20);
$('label', $(this)).click();
}
i++;
});
});
it('Clickable groups should fire onChange only once.', function() {
expect($('#multiselect option:selected').length).toBe(10);
fired = 0;
expect(fired).toBe(0);
var i = 0;
$('#multiselect-container li.multiselect-group').each(function() {
$('label', $(this)).click();
// Selected
expect(fired).toBe(1);
fired = 0;
$('label', $(this)).click();
// Deselected
expect(fired).toBe(1);
fired = 0;
i++;
});
});
it('Clickable groups should fire change only once', function() {
expect($('#multiselect option:selected').length).toBe(10);
var changed = 0;
$('#multiselect').on('change', function() {
changed++;
});
$('#multiselect-container li.multiselect-group').each(function() {
$('label', $(this)).click();
// Selected
expect(changed).toBe(1);
changed = 0;
$('label', $(this)).click();
// Deselected
expect(changed).toBe(1);
changed = 0;
});
fired = 0;
});
it('Should update button text.', function() {
expect($('#multiselect option:selected').length).toBe(10);
expect(fired).toBe(0);
var i = 0;
$('#multiselect-container li.multiselect-group').each(function() {
if (i == 0) {
var text = ''
$('option:selected', $('#multiselect optgroup')[i]).each(function() {
text += $(this).text() + ', '
});
text = text.substr(0, text.length - 2);
expect($('#multiselect-container .multiselect-selected-text').text()).toBe(text);
$('label', $(this)).click();
}
else {
$('label', $(this)).click();
var text = ''
$('option:selected', $('#multiselect optgroup')[i]).each(function() {
text += $(this).text() + ', '
});
text = text.substr(0, text.length - 2);
expect($('#multiselect-container .multiselect-selected-text').text()).toBe(text);
$('label', $(this)).click();
}
i++;
});
});
it('Should be updated by clicking corresponding options.', function() {
for (var i = 1; i < 10; i++) {
expect($('option:selected', $('#multiselect optgroup')[0]).length).toBe(10);
expect($('#multiselect option:selected').length).toBe(10);
var $group = $($('#multiselect-container li.multiselect-group')[i]);
var $optGroup = $($('#multiselect optgroup')[i]);
$group.nextUntil('li.multiselect-item').each(function() {
var $input = $('input', this);
$input.click();
expect($input.prop('checked')).toBe(true);
});
expect($('option:selected', $optGroup).length).toBe(10);
expect($('#multiselect option:selected').length).toBe(20);
expect($('input', $group).prop('checked')).toBe(true);
// Undo changes
$group.nextUntil('li.multiselect-item').each(function() {
var $input = $('input', this);
$input.click();
expect($input.prop('checked')).toBe(false);
});
expect($('#multiselect option:selected').length).toBe(10);
expect($('input', $group).prop('checked')).toBe(false);
}
});
it('Should be updated through select/deselect.', function() {
var values = [];
for (var i = 1; i < 11; i++) {
values.push('1-' + i)
}
var $group = $('#multiselect-container li.multiselect-group')[0];
$('#multiselect').multiselect('deselect', values);
expect($('input', $group).prop('checked')).toBe(false);
$('#multiselect').multiselect('select', values);
expect($('input', $group).prop('checked')).toBe(true);
});
afterEach(function() {
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
});
describe('Bootstrap Multiselect "Collapsible Optgroups"', function() {
// Count the number of onChanges fired.
var fired = 0;
beforeEach(function() {
var $select = $('<select id="multiselect" multiple="multiple"></select>');
for (var i = 1; i < 11; i++) {
var $optgroup = $('<optgroup label="Group ' + i + '"></optgroup>');
for (var j = 1; j < 11; j++) {
$optgroup.append('<option value="' + i + '-' + j + '">Option ' + i + '.' + j + '</option>');
}
$select.append($optgroup);
}
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableCollapsibleOptGroups: true,
onChange: function(option, checked) {
fired++;
}
});
});
it('Should correctly create headers for optgroups.', function() {
expect($('#multiselect-container li.multiselect-group').length).toBe(10);
$('#multiselect-container label.multiselect-group').each(function() {
expect($('input', $(this)).length).toBe(10);
});
});
if ('Should not create inputs.', function() {
expect($('#multiselect-container li.multiselect-group input').length).toBe(0);
});
it('Groups should not be clickable.', function() {
expect($('#multiselect option:selected').length).toBe(0);
var i = 0;
$('#multiselect-container li.multiselect-group').each(function() {
$('label', $(this)).click();
expect($('option:selected', $('#multiselect optgroup')[i]).length).toBe(0);
expect($('#multiselect option:selected').length).toBe(0);
$('label', $(this)).click();
i++;
});
});
it('Should be collapsible.', function() {
var $group = $('#multiselect-container li.multiselect-group:first');
$('.caret-container', $group).click();
var $lis = $group.nextUntil('li.multiselect-group');
$lis.each(function() {
expect($(this).hasClass('multiselect-collapsible-hidden')).toBe(true);
expect($(this).hasClass('multiselect-collapsible-hidden')).toBe($(this).is(':hidden'));
});
$('.caret-container', $group).click();
var $lis = $group.nextUntil('li.multiselect-group');
$lis.each(function() {
expect($(this).hasClass('multiselect-collapsible-hidden')).toBe(false);
expect($(this).hasClass('multiselect-collapsible-hidden')).toBe($(this).is(':hidden'));
});
});
afterEach(function() {
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
});
describe('Bootstrap Multiselect "Clickable+Collapsible Optgroups"', function() {
// Count the number of onChanges fired.
var fired = 0;
beforeEach(function() {
var $select = $('<select id="multiselect" multiple="multiple"></select>');
for (var i = 1; i < 11; i++) {
var $optgroup = $('<optgroup label="Group ' + i + '"></optgroup>');
for (var j = 1; j < 11; j++) {
$optgroup.append('<option value="' + i + '-' + j + '">Option ' + i + '.' + j + '</option>');
}
$select.append($optgroup);
}
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableClickableOptGroups: true,
enableCollapsibleOptGroups: true,
onChange: function(option, checked) {
fired++;
}
});
});
it('Should correctly create inputs for optgroups.', function() {
expect($('#multiselect-container li.multiselect-group').length).toBe(10);
expect($('#multiselect-container li.multiselect-group input').length).toBe(10);
$('#multiselect-container label.multiselect-group').each(function() {
expect($('input', $(this)).length).toBe(10);
});
});
it('Groups should be clickable.', function() {
expect($('#multiselect option:selected').length).toBe(0);
var i = 0;
$('#multiselect-container li.multiselect-group').each(function() {
$('label', $(this)).click();
expect($('option:selected', $('#multiselect optgroup')[i]).length).toBe(10);
expect($('#multiselect option:selected').length).toBe(10);
$('label', $(this)).click();
i++;
});
});
it('Clickable groups should fire onChange only once.', function() {
expect($('#multiselect option:selected').length).toBe(0);
fired = 0;
expect(fired).toBe(0);
var i = 0;
$('#multiselect-container li.multiselect-group').each(function() {
$('label', $(this)).click();
// Selected
expect(fired).toBe(1);
fired = 0;
$('label', $(this)).click();
// Deselected
expect(fired).toBe(1);
fired = 0;
i++;
});
});
it('Should be collapsible.', function() {
var $group = $('#multiselect-container li.multiselect-group:first');
$('.caret-container', $group).click();
var $lis = $group.nextUntil('li.multiselect-group');
$lis.each(function() {
expect($(this).hasClass('multiselect-collapsible-hidden')).toBe(true);
expect($(this).hasClass('multiselect-collapsible-hidden')).toBe($(this).is(':hidden'));
});
$('.caret-container', $group).click();
var $lis = $group.nextUntil('li.multiselect-group');
$lis.each(function() {
expect($(this).hasClass('multiselect-collapsible-hidden')).toBe(false);
expect($(this).hasClass('multiselect-collapsible-hidden')).toBe($(this).is(':hidden'));
});
});
afterEach(function() {
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
});
describe('Bootstrap Multiselect "Clickable+Collapsible+SelectAll Optgroups"', function() {
// Count the number of onChanges fired.
var fired = 0;
beforeEach(function() {
var $select = $('<select id="multiselect" multiple="multiple"></select>');
for (var i = 1; i < 11; i++) {
var $optgroup = $('<optgroup label="Group ' + i + '"></optgroup>');
for (var j = 1; j < 11; j++) {
$optgroup.append('<option value="' + i + '-' + j + '">Option ' + i + '.' + j + '</option>');
}
$select.append($optgroup);
}
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableClickableOptGroups: true,
enableCollapsibleOptGroups: true,
includeSelectAllOption: true,
selectAllValue: 'multiselect-all'
});
});
it('Should NOT handle option groups differently, i.e. not set class to active.', function() {
// Otherwise they are hidden.
$('#multiselect-container input[value="multiselect-all"]').click();
var $groups = $('#multiselect-container li.multiselect-group');
$groups.each(function() {
expect($(this).hasClass('active')).toBe(true);
});
var $lis = $('#multiselect-container li:not(.multiselect-group)');
$lis.each(function() {
expect($(this).hasClass('active')).toBe(true);
});
});
it('Should select all options (including option groups).', function() {
//$('#multiselect-container li.multiselect-group .caret-container').click();
$('#multiselect-container input[value="multiselect-all"]').click();
var $lis = $('#multiselect-container li');
$lis.each(function() {
expect($('input', this).prop('checked')).toBe(true);
});
});
it('Should automatically update select all.', function() {
var i = 0;
$('#multiselect-container li.multiselect-group').each(function() {
$('label', $(this)).click();
expect($('option:selected', $('#multiselect optgroup')[i]).length).toBe(10);
expect($('#multiselect option:selected').length).toBe((i + 1)*10);
i++;
});
expect($('#multiselect-container li input[value="multiselect-all"]').prop('checked')).toBe(true);
});
afterEach(function() {
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
});
describe('Bootstrap Multiselect "Dataprovider"', function() {
beforeEach(function() {
var $select = $('<select id="multiselect" multiple="multiple"></select>');
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>'
});
});
var options = [
{label: 'Option 1', value: '1', selected: true, title: 'Option 1 Title'},
{label: 'Option 2', value: '2', title: 'Option 2 Title'},
{label: 'Option 3', value: '3', selected: true, title: 'Option 3 Title'},
{label: 'Option 4', value: '4', title: 'Option 4 Title'},
{label: 'Option 5', value: '5', title: 'Option 5 Title'},
{label: 'Option 6', value: '6', title: 'Option 6 Title'}
];
var options_attributes = [
{label: 'Option 1', value: '1', attributes: {'some-attribute': 'test'}}
];
it("Should be able to add options.", function() {
$('#multiselect').multiselect('dataprovider', options);
expect($('#multiselect option').length).toBe(6);
expect($('#multiselect-container input').length).toBe(6);
expect($('#multiselect option[value="1"]').length).toBe(1);
expect($('#multiselect option[value="1"]').prop('selected')).toBe(true);
expect($('#multiselect-container input[value="1"]').prop('checked')).toBe(true);
expect($('#multiselect option[value="2"]').length).toBe(1);
expect($('#multiselect option[value="2"]').prop('selected')).toBe(false);
expect($('#multiselect-container input[value="2"]').prop('checked')).toBe(false);
expect($('#multiselect option[value="3"]').length).toBe(1);
expect($('#multiselect option[value="3"]').prop('selected')).toBe(true);
expect($('#multiselect-container input[value="3"]').prop('checked')).toBe(true);
expect($('#multiselect option[value="4"]').length).toBe(1);
expect($('#multiselect option[value="4"]').prop('selected')).toBe(false);
expect($('#multiselect-container input[value="4"]').prop('checked')).toBe(false);
expect($('#multiselect option[value="5"]').length).toBe(1);
expect($('#multiselect option[value="5"]').prop('selected')).toBe(false);
expect($('#multiselect-container input[value="5"]').prop('checked')).toBe(false);
expect($('#multiselect option[value="6"]').length).toBe(1);
expect($('#multiselect option[value="6"]').prop('selected')).toBe(false);
expect($('#multiselect-container input[value="6"]').prop('checked')).toBe(false);
});
it("Should be able to define title.", function() {
$('#multiselect').multiselect('dataprovider', options);
expect($('#multiselect option[value="1"]').attr('title')).toBe('Option 1 Title');
expect($('#multiselect option[value="2"]').attr('title')).toBe('Option 2 Title');
expect($('#multiselect option[value="3"]').attr('title')).toBe('Option 3 Title');
expect($('#multiselect option[value="4"]').attr('title')).toBe('Option 4 Title');
expect($('#multiselect option[value="5"]').attr('title')).toBe('Option 5 Title');
expect($('#multiselect option[value="6"]').attr('title')).toBe('Option 6 Title');
expect($('#multiselect-container input[value="1"]').closest('label').attr('title')).toBe('Option 1 Title');
expect($('#multiselect-container input[value="2"]').closest('label').attr('title')).toBe('Option 2 Title');
expect($('#multiselect-container input[value="3"]').closest('label').attr('title')).toBe('Option 3 Title');
expect($('#multiselect-container input[value="4"]').closest('label').attr('title')).toBe('Option 4 Title');
expect($('#multiselect-container input[value="5"]').closest('label').attr('title')).toBe('Option 5 Title');
expect($('#multiselect-container input[value="6"]').closest('label').attr('title')).toBe('Option 6 Title');
});
it("Should be able to define data attributes.", function() {
$('#multiselect').multiselect('dataprovider', options_attributes)
expect($('#multiselect option[value="1"]').attr('value')).toBe('1');
expect($('#multiselect option[value="1"]').attr('data-some-attribute')).toBe('test');
});
var optgroups = [
{
label: 'Group 1', children: [
{label: 'Option 1.1', value: '1-1'},
{label: 'Option 1.2', value: '1-2'},
{label: 'Option 1.3', value: '1-3'}
]
},
{
label: 'Group 2', children: [
{label: 'Option 2.1', value: '1'},
{label: 'Option 2.2', value: '2'},
{label: 'Option 2.3', value: '3'}
]
}
];
it('Should be able to handle optgroups.', function() {
$('#multiselect').multiselect('dataprovider', optgroups);
expect($('#multiselect optgroup').length).toBe(2);
expect($('#multiselect option').length).toBe(6);
expect($('#multiselect-container input').length).toBe(6);
expect($('#multiselect optgroup[label="Group 1"] option').length).toBe(3);
expect($('#multiselect optgroup[label="Group 2"] option').length).toBe(3);
});
afterEach(function() {
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
});
describe('Bootstrap Multiselect "Select All".', function() {
var onSelectAllTriggered = false;
var onDeselectAllTriggered = false;
var fired = 0;
beforeEach(function() {
onSelectAllTriggered = false;
onDeselectAllTriggered = false;
fired = 0;
var $select = $('<select id="multiselect" multiple="multiple"></select>');
for (var i = 1; i < 100; i++) {
$select.append('<option value="' + i + '">1</option>');
}
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
includeSelectAllOption: true,
selectAllValue: 'multiselect-all',
onSelectAll: function() {
onSelectAllTriggered = true;
},
onDeselectAll: function() {
onDeselectAllTriggered = true;
},
onChange: function(option, checked) {
fired++;
}
});
});
it('Should not add an additional option to the select.', function() {
expect($('#multiselect option[value="multiselect-all"]').length).toBe(0);
expect($('#multiselect-container input[value="multiselect-all"]').length).toBe(1);
expect($('#multiselect option').length).toBe(99);
expect($('#multiselect-container input').length).toBe(100);
});
it('Should update the select all when all options are selected by the "select" method.', function() {
expect($('#multiselect option:selected').length).toBe(0);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(false);
for (var i = 1; i < 100; i++) {
$('#multiselect').multiselect('select', i.toString());
expect($('#multiselect option[value="' + i.toString() + '"]').prop('selected')).toBe(true);
}
expect($('#multiselect option:selected').length).toBe(99);
expect($('#multiselect-container input').length).toBe(100);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(true);
});
it('Should update the select all when all options are deselected by the "deselect" method (first all options are selected as before).', function() {
expect($('#multiselect option:selected').length).toBe(0);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(false);
for (var i = 1; i < 100; i++) {
$('#multiselect').multiselect('select', i.toString());
}
expect($('#multiselect option:selected').length).toBe(99);
expect($('#multiselect-container input:checked').length).toBe(100);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(true);
for (var i = 1; i < 100; i++) {
$('#multiselect').multiselect('deselect', i.toString());
}
expect($('#multiselect option:selected').length).toBe(0);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(false);
});
it('Should update the select all option when all options are selected by the change event.', function() {
expect($('#multiselect option:selected').length).toBe(0);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(false);
// Change all checkboxes except the select all one.
$('#multiselect-container input[value!="multiselect-all"]').prop('checked', true);
$('#multiselect-container input[value!="multiselect-all"]').trigger('change');
expect($('#multiselect option:selected[value!="multiselect-all"]').length).toBe(99);
// 100 options seleted including the select all.
expect($('#multiselect option:selected').length).toBe(99);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(true);
});
it('Should update the select all option when all options are deselected by the change event.', function() {
expect($('#multiselect option:selected').length).toBe(0);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(false);
$('#multiselect-container input[value!="multiselect-all"]').prop('checked', true);
$('#multiselect-container input[value!="multiselect-all"]').trigger('change');
expect($('#multiselect option:selected[value!="multiselect-all"]').length).toBe(99);
expect($('#multiselect option:selected').length).toBe(99);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(true);
// Change all checkboxes except the select all one.
$('#multiselect-container input[value!="multiselect-all"]').prop('checked', false);
$('#multiselect-container input[value!="multiselect-all"]').trigger('change');
expect($('#multiselect option:selected').length).toBe(0);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(false);
});
it('Should update the select all option when all options are selected by the click event.', function() {
expect($('#multiselect option:selected').length).toBe(0);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(false);
$('#multiselect-container input[value!="multiselect-all"]').click();
expect($('#multiselect option:selected').length).toBe(99);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(true);
});
it('Should update the select all option when all options are deselected by the click event.', function() {
expect($('#multiselect option:selected').length).toBe(0);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(false);
$('#multiselect-container input[value!="multiselect-all"]').click();
expect($('#multiselect option:selected').length).toBe(99);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(true);
$('#multiselect-container input[value!="multiselect-all"]').click();
expect($('#multiselect option:selected').length).toBe(0);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(false);
});
it('Should trigger onSelectAll/onDeselectAll when changing the select all option.', function() {
expect($('#multiselect option:selected').length).toBe(0);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(false);
$('#multiselect-container input[value="multiselect-all"]').prop('checked', true);
$('#multiselect-container input[value="multiselect-all"]').trigger('change');
expect($('#multiselect option:selected').length).toBe(99);
expect($('#multiselect-container input:checked').length).toBe(100); // including select all
expect(onSelectAllTriggered).toBe(true);
$('#multiselect-container input[value="multiselect-all"]').prop('checked', false);
$('#multiselect-container input[value="multiselect-all"]').trigger('change');
expect($('#multiselect option:selected[value!="multiselect-all"]').length).toBe(0);
expect($('#multiselect option:selected').length).toBe(0);
expect(onDeselectAllTriggered).toBe(true);
});
it('Should trigger the onSelectAll/onDeselectAll when clicking the select all option.', function() {
expect($('#multiselect option:selected').length).toBe(0);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(false);
$('#multiselect-container input[value="multiselect-all"]').click();
expect($('#multiselect option:selected').length).toBe(99);
expect($('#multiselect-container input:checked').length).toBe(100); // including select all
expect(onSelectAllTriggered).toBe(true);
$('#multiselect-container input[value="multiselect-all"]').click();
expect($('#multiselect option:selected[value!="multiselect-all"]').length).toBe(0);
expect($('#multiselect option:selected').length).toBe(0);
expect(onDeselectAllTriggered).toBe(true);
});
it('Should NOT trigger onSelectAll/onDeselectAll based on the change event.', function() {
expect($('#multiselect option:selected').length).toBe(0);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(false);
$('#multiselect-container input[value!="multiselect-all"]').prop('checked', true);
$('#multiselect-container input[value!="multiselect-all"]').trigger('change');
expect($('#multiselect option:selected[value!="multiselect-all"]').length).toBe(99);
expect($('#multiselect option:selected').length).toBe(99);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(true);
expect(onSelectAllTriggered).toBe(false);
$('#multiselect-container input[value!="multiselect-all"]').prop('checked', false);
$('#multiselect-container input[value!="multiselect-all"]').trigger('change');
expect($('#multiselect option:selected[value!="multiselect-all"]').length).toBe(0);
expect($('#multiselect option:selected').length).toBe(0);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(false);
expect(onDeselectAllTriggered).toBe(false);
});
it('Should NOT trigger onSelectAll/onDeselectAll based on the click event.', function() {
expect($('#multiselect option:selected').length).toBe(0);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(false);
$('#multiselect-container input[value!="multiselect-all"]').click();
expect($('#multiselect option:selected').length).toBe(99);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(true);
expect(onSelectAllTriggered).toBe(false);
$('#multiselect-container input[value!="multiselect-all"]').click();
expect($('#multiselect option:selected').length).toBe(0);
expect($('#multiselect-container input[value="multiselect-all"]').prop('checked')).toBe(false);
expect(onDeselectAllTriggered).toBe(false);
});
it('Should trigger onSelectAll/onDeselectAll on function call.', function() {
$('#multiselect').multiselect('selectAll', true, true);
expect(onSelectAllTriggered).toBe(true);
$('#multiselect').multiselect('deselectAll', true, true);
expect(onDeselectAllTriggered).toBe(true);
});
it('Should NOT trigger onSelectAll on initialization but initialize the select all option correctly.', function() {
var $select = $('<select id="multiselect-onSelectAll" multiple="multiple"></select>');
for (var i = 1; i < 10; i++) {
$select.append('<option value="' + i + '" selected>1</option>');
}
$('body').append($select);
onSelectAllTriggered = false;
$select.multiselect({
buttonContainer: '<div id="multiselect-onSelectAll-container"></div>',
includeSelectAllOption: true,
selectAllValue: 'multiselect-all',
onSelectAll: function() {
onSelectAllTriggered = true;
},
});
expect($('#multiselect-onSelectAll-container input[value="multiselect-all"]').prop('checked')).toBe(true);
expect(onSelectAllTriggered).toBe(false);
$('#multiselect-onSelectAll').multiselect('destroy');
$('#multiselect-onSelectAll').remove();
});
it('Should NOT trigger onDeselectAll on initialization but initialize the select all option correctly.', function() {
var $select = $('<select id="multiselect-onDeselectAll" multiple="multiple"></select>');
for (var i = 1; i < 10; i++) {
$select.append('<option value="' + i + '">1</option>');
}
$('body').append($select);
onDeselectAllTriggered = false;
$select.multiselect({
buttonContainer: '<div id="multiselect-onDeselectAll-container"></div>',
includeSelectAllOption: true,
selectAllValue: 'multiselect-all',
onDeselectAll: function() {
onDeselectAllTriggered = true;
},
});
expect($('#multiselect-onDeselectAll-container input[value="multiselect-all"]').prop('checked')).toBe(false);
expect(onDeselectAllTriggered).toBe(false);
$('#multiselect-onDeselectAll').multiselect('destroy');
$('#multiselect-onDeselectAll').remove();
});
afterEach(function() {
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
});
describe('Bootstrap Multiselect "Filter".', function() {
var $select = null;
beforeEach(function() {
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
$select = $('<select id="multiselect" multiple="multiple"></select>');
for (var i = 1; i < 10; i++) {
$select.append('<option value="value-' + i + '">Option ' + i + '</option>');
}
$('body').append($select);
});
describe('Should create filter.', function() {
beforeEach(function() {
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableFiltering: true,
filterBehavior: 'value'
});
});
it('Should create filter.', function() {
expect($('#multiselect-container li.multiselect-filter').length).toBe(1);
expect($('#multiselect-container li.multiselect-filter input').length).toBe(1);
expect($('#multiselect-container li.multiselect-filter .multiselect-clear-filter').length).toBe(1);
});
});
describe('Should filter elements by value.', function() {
beforeEach(function(done) {
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableFiltering: true,
filterBehavior: 'value',
onFiltering: function() {
done();
}
});
$('#multiselect-container li.multiselect-filter input').val('value-9').trigger('keydown');
});
it('Should filter elements.', function() {
for (var i = 1; i < 10; i++) {
if (i != 9) {
expect($('#multiselect-container li input[value="value-' + i + '"]').closest('li').hasClass('multiselect-filter-hidden')).toBe(true, i);
}
else {
expect($('#multiselect-container li input[value="value-' + i + '"]').closest('li').hasClass('multiselect-filter-hidden')).toBe(false, i);
}
}
});
});
describe('Should filter elements by value only.', function() {
beforeEach(function(done) {
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableFiltering: true,
filterBehavior: 'value',
onFiltering: function() {
done();
}
});
$('#multiselect-container li.multiselect-filter input').val('Option').trigger('keydown');
});
it('Should filter elements.', function() {
for (var i = 1; i < 10; i++) {
expect($('#multiselect-container li input[value="value-' + i + '"]').closest('li').hasClass('multiselect-filter-hidden')).toBe(true, i);
}
});
});
describe('Should filter elements by text.', function() {
beforeEach(function(done) {
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableFiltering: true,
filterBehavior: 'text',
onFiltering: function() {
done();
}
});
$('#multiselect-container li.multiselect-filter input').val('Option 9').trigger('keydown');
});
it('Should filter elements.', function() {
for (var i = 1; i < 10; i++) {
if (i != 9) {
expect($('#multiselect-container li input[value="value-' + i + '"]').closest('li').hasClass('multiselect-filter-hidden')).toBe(true, i);
}
else {
expect($('#multiselect-container li input[value="value-' + i + '"]').closest('li').hasClass('multiselect-filter-hidden')).toBe(false, i);
}
}
});
});
describe('Should filter elements by text only.', function() {
beforeEach(function(done) {
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableFiltering: true,
filterBehavior: 'text',
onFiltering: function() {
done();
}
});
$('#multiselect-container li.multiselect-filter input').val('value').trigger('keydown');
});
it('Should filter elements.', function() {
for (var i = 1; i < 10; i++) {
expect($('#multiselect-container li input[value="value-' + i + '"]').closest('li').hasClass('multiselect-filter-hidden')).toBe(true, i);
}
});
});
describe('Should filter elements by text and value - text.', function() {
beforeEach(function(done) {
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableFiltering: true,
filterBehavior: 'both',
onFiltering: function() {
done();
}
});
$('#multiselect-container li.multiselect-filter input').val('Option 9').trigger('keydown');
});
it('Should filter elements.', function() {
for (var i = 1; i < 10; i++) {
if (i != 9) {
expect($('#multiselect-container li input[value="value-' + i + '"]').closest('li').hasClass('multiselect-filter-hidden')).toBe(true, i);
}
else {
expect($('#multiselect-container li input[value="value-' + i + '"]').closest('li').hasClass('multiselect-filter-hidden')).toBe(false, i);
}
}
});
});
describe('Should filter elements by text and value - value.', function() {
beforeEach(function(done) {
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableFiltering: true,
filterBehavior: 'both',
onFiltering: function() {
done();
}
});
$('#multiselect-container li.multiselect-filter input').val('value-9').trigger('keydown');
});
it('Should filter elements.', function() {
for (var i = 1; i < 10; i++) {
if (i != 9) {
expect($('#multiselect-container li input[value="value-' + i + '"]').closest('li').hasClass('multiselect-filter-hidden')).toBe(true, i);
}
else {
expect($('#multiselect-container li input[value="value-' + i + '"]').closest('li').hasClass('multiselect-filter-hidden')).toBe(false, i);
}
}
});
});
describe('Should remove filter on clicking the clear button.', function() {
beforeEach(function(done) {
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableFiltering: true,
filterBehavior: 'value',
onFiltering: function() {
done();
}
});
$('#multiselect-container li.multiselect-filter input').val('value-9').trigger('keydown');
});
it('Should remove filter.', function() {
for (var i = 1; i < 10; i++) {
if (i != 9) {
expect($('#multiselect-container li input[value="value-' + i + '"]').closest('li').hasClass('multiselect-filter-hidden')).toBe(true, i);
}
else {
expect($('#multiselect-container li input[value="value-' + i + '"]').closest('li').hasClass('multiselect-filter-hidden')).toBe(false, i);
}
}
$('#multiselect-container li.multiselect-filter .multiselect-clear-filter').click();
for (var i = 1; i < 10; i++) {
expect($('#multiselect-container li input[value="value-' + i + '"]').closest('li').hasClass('multiselect-filter-hidden')).toBe(false, i);
}
});
});
describe('Filtering and removing the filter should not alter selection.', function() {
beforeEach(function(done) {
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableFiltering: true,
filterBehavior: 'value',
onFiltering: function() {
done();
}
});
$('#multiselect-container li input[value="value-1"]').click();
$('#multiselect-container li input[value="value-9"]').click();
for (var i = 1; i < 10; i++) {
if (i != 9 && i != 1) {
expect($('#multiselect-container li input[value="value-' + i + '"]').prop('checked')).toBe(false, i);
}
else {
expect($('#multiselect-container li input[value="value-' + i + '"]').prop('checked')).toBe(true, i);
}
}
$('#multiselect-container li.multiselect-filter input').val('value-9').trigger('keydown');
});
it('Should not alter selection.', function() {
for (var i = 1; i < 10; i++) {
if (i != 9 && i != 1) {
expect($('#multiselect-container li input[value="value-' + i + '"]').prop('checked')).toBe(false, i);
}
else {
expect($('#multiselect-container li input[value="value-' + i + '"]').prop('checked')).toBe(true, i);
}
}
$('#multiselect-container li.multiselect-filter .multiselect-clear-filter').click();
for (var i = 1; i < 10; i++) {
if (i != 9 && i != 1) {
expect($('#multiselect-container li input[value="value-' + i + '"]').prop('checked')).toBe(false, i);
}
else {
expect($('#multiselect-container li input[value="value-' + i + '"]').prop('checked')).toBe(true, i);
}
}
});
});
describe('Select method should select both hidden and visible options.', function() {
beforeEach(function(done) {
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableFiltering: true,
filterBehavior: 'value',
onFiltering: function() {
done();
}
});
for (var i = 1; i < 10; i++) {
expect($('#multiselect-container li input[value="value-' + i + '"]').prop('checked')).toBe(false, i);
}
$('#multiselect-container li.multiselect-filter input').val('value-9').trigger('keydown');
});
it('Should not alter selection.', function() {
$('#multiselect').multiselect('select', 'value-1');
expect($('#multiselect-container li input[value="value-1"]').prop('checked')).toBe(true);
expect($('#multiselect option[value="value-1"]').prop('selected')).toBe(true);
$('#multiselect').multiselect('select', 'value-9');
expect($('#multiselect-container li input[value="value-9"]').prop('checked')).toBe(true);
expect($('#multiselect option[value="value-9"]').prop('selected')).toBe(true);
});
});
describe('Deselect method should select both hidden and visible options.', function() {
beforeEach(function(done) {
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableFiltering: true,
filterBehavior: 'value',
onFiltering: function() {
done();
}
});
$('#multiselect-container li input[value="value-9"]').click();
$('#multiselect-container li input[value="value-1"]').click();
for (var i = 1; i < 10; i++) {
if (i != 9 && i != 1) {
expect($('#multiselect-container li input[value="value-' + i + '"]').prop('checked')).toBe(false, i);
}
else {
expect($('#multiselect-container li input[value="value-' + i + '"]').prop('checked')).toBe(true, i);
}
}
$('#multiselect-container li.multiselect-filter input').val('value-9').trigger('keydown');
});
it('Should not alter selection.', function() {
$('#multiselect').multiselect('deselect', 'value-1');
expect($('#multiselect-container li input[value="value-1"]').prop('checked')).toBe(false);
expect($('#multiselect option[value="value-1"]').prop('selected')).toBe(false);
$('#multiselect').multiselect('deselect', 'value-9');
expect($('#multiselect-container li input[value="value-9"]').prop('checked')).toBe(false);
expect($('#multiselect option[value="value-9"]').prop('selected')).toBe(false);
});
});
afterEach(function() {
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
});
describe('Bootstrap Multiselect "Select All+Filter+selectAllJustVisible".', function() {
var $select = null;
beforeEach(function() {
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
$select = $('<select id="multiselect" multiple="multiple"></select>');
for (var i = 1; i < 10; i++) {
$select.append('<option value="value-' + i + '">Option ' + i + '</option>');
}
$('body').append($select);
});
describe('Should select only visible options if selectAllJustVisible is true.', function() {
beforeEach(function(done) {
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableFiltering: true,
filterBehavior: 'value',
includeSelectAllOption: true,
selectAllJustVisible: true,
selectAllValue: 'multiselect-all',
onFiltering: function() {
done();
}
});
for (var i = 1; i < 10; i++) {
expect($('#multiselect-container li input[value="value-' + i + '"]').prop('checked')).toBe(false, i);
}
$('#multiselect-container li.multiselect-filter input').val('value-9').trigger('keydown');
});
it('Should select one option.', function() {
$('#multiselect-container li input[value="multiselect-all"]').click();
for (var i = 1; i < 10; i++) {
if (i != 9) {
expect($('#multiselect-container li input[value="value-' + i + '"]').prop('checked')).toBe(false, i);
}
else {
expect($('#multiselect-container li input[value="value-' + i + '"]').prop('checked')).toBe(true, i);
}
}
});
});
describe('Should deselect only visible options if selectAllJustVisible is true.', function() {
beforeEach(function(done) {
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableFiltering: true,
filterBehavior: 'value',
includeSelectAllOption: true,
selectAllJustVisible: true,
selectAllValue: 'multiselect-all',
onFiltering: function() {
done();
}
});
$('#multiselect-container li input[value="value-1"]').click();
$('#multiselect-container li input[value="value-9"]').click();
for (var i = 1; i < 10; i++) {
if (i != 9 && i != 1) {
expect($('#multiselect-container li input[value="value-' + i + '"]').prop('checked')).toBe(false, i);
}
else {
expect($('#multiselect-container li input[value="value-' + i + '"]').prop('checked')).toBe(true, i);
}
}
$('#multiselect-container li.multiselect-filter input').val('value-9').trigger('keydown');
});
it('Should deselect one option.', function() {
$('#multiselect-container li input[value="multiselect-all"]').click();
for (var i = 1; i < 10; i++) {
if (i != 1) {
expect($('#multiselect-container li input[value="value-' + i + '"]').prop('checked')).toBe(false, i);
}
else {
expect($('#multiselect-container li input[value="value-' + i + '"]').prop('checked')).toBe(true, i);
}
}
});
});
describe('Should select all options if selectAllJustVisible is false.', function() {
beforeEach(function(done) {
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableFiltering: true,
filterBehavior: 'value',
includeSelectAllOption: true,
selectAllJustVisible: false,
selectAllValue: 'multiselect-all',
onFiltering: function() {
done();
}
});
for (var i = 1; i < 10; i++) {
expect($('#multiselect-container li input[value="value-' + i + '"]').prop('checked')).toBe(false, i);
}
$('#multiselect-container li.multiselect-filter input').val('value-9').trigger('keydown');
});
it('Should select all options.', function() {
$('#multiselect-container li input[value="multiselect-all"]').click();
for (var i = 1; i < 10; i++) {
expect($('#multiselect-container li input[value="value-' + i + '"]').prop('checked')).toBe(true, i);
}
});
});
describe('Should deselect all options if selectAllJustVisible is false.', function() {
beforeEach(function(done) {
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableFiltering: true,
filterBehavior: 'value',
includeSelectAllOption: true,
selectAllJustVisible: false,
selectAllValue: 'multiselect-all',
onFiltering: function() {
done();
}
});
for (var i = 1; i < 10; i++) {
$('#multiselect-container li input[value="value-' + i + '"]').click();
expect($('#multiselect-container li input[value="value-' + i + '"]').prop('checked')).toBe(true, i);
}
$('#multiselect-container li.multiselect-filter input').val('value-9').trigger('keydown');
});
it('Should select all options.', function() {
$('#multiselect-container li input[value="multiselect-all"]').click();
for (var i = 1; i < 10; i++) {
expect($('#multiselect-container li input[value="value-' + i + '"]').prop('checked')).toBe(false, i);
}
});
});
afterEach(function() {
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
});
describe('Bootstrap Multiselect "Specific Issues".', function() {
it('#393.', function() {
var $select = $('<select id="multiselect" multiple="multiple"></select>');
for (var i = 1; i < 100; i++) {
$select.append('<option value="' + i + '">1</option>');
}
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
includeSelectAllOption: true,
selectAllValue: 0
});
expect($('#multiselect-container input[value="0"]').length).toBe(1);
expect($('#multiselect-container input[value="0"]').prop('checked')).toBe(false);
$('#multiselect').multiselect('selectAll');
expect($('#multiselect option:selected').length).toBe(99);
expect($('#multiselect-container input[value="0"]').prop('checked')).toBe(true);
$('#multiselect').multiselect('deselectAll');
expect($('#multiselect option:selected').length).toBe(0);
expect($('#multiselect-container input[value="0"]').prop('checked')).toBe(false);
$('#multiselect-container input[value="0"]').click();
expect($('#multiselect option:selected').length).toBe(99);
expect($('#multiselect-container input[value="0"]').prop('checked')).toBe(true);
$('#multiselect-container input[value="0"]').click();
expect($('#multiselect option:selected').length).toBe(0);
expect($('#multiselect-container input[value="0"]').prop('checked')).toBe(false);
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
it('#405.', function() {
var selection = document.getSelection();
var range = document.createRange();
var $selection = $('<span>Some text to select</span>');
var $select = $('<select id="multiselect" multiple="multiple"></select>');
for (var i = 1; i < 5; i++) {
$select.append('<option value="' + i + '">select option</option>');
}
$('body').append($selection).append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
});
range.selectNodeContents($selection.get(0));
selection.removeAllRanges();
selection.addRange(range);
if (document.getSelection().type === 'Range') {
$('#multiselect-container').find('a:first label').trigger('click');
expect($('#multiselect-container').find('input:first').prop('checked')).toBe(true);
}
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
$selection.remove();
});
it('#679.', function() {
var $select = $('<select id="multiselect" multiple="multiple"></select>');
for (var i = 1; i < 11; i++) {
var $optgroup = $('<optgroup label="Group ' + i + '"></optgroup>');
for (var j = 1; j < 11; j++) {
$optgroup.append('<option value="' + i + '-' + j + '">Option ' + i + '.' + j + '</option>');
}
$select.append($optgroup);
}
$('body').append($select);
var fired = 0;
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableClickableOptGroups: true,
enableCollapsibleOptGroups: true,
onChange: function(option, checked) {
fired++;
}
});
expect($('#multiselect option:selected').length).toBe(0);
expect(fired).toBe(0);
var i = 0;
$('#multiselect-container li.multiselect-group').each(function() {
$('label', $(this)).click();
// Selected
expect(fired).toBe(1);
fired = 0;
$('label', $(this)).click();
// Deselected
expect(fired).toBe(1);
fired = 0;
i++;
});
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
it('#655/1 when clicking the options.', function() {
var $select = $('<select id="multiselect" multiple="multiple"></select>');
$select.append('<optgroup label="Group 1"><option value="1-1">Option 1.1</option><option value="1-2">Option 1.2</option><option value="1-3">Option 1.3</option></optgroup>');
$select.append('<optgroup label="Group 2"><option value="2-1">Option 2.1</option><option value="2-2">Option 2.2</option><option value="2-3">Option 2.3</option></optgroup>');
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableClickableOptGroups: true
});
$('#multiselect-container input[value="2-1"]').click();
$('#multiselect-container input[value="2-2"]').click();
$('#multiselect-container input[value="2-3"]').click();
expect($($('#multiselect-container li.multiselect-group input')[0]).prop('checked')).toBe(false);
expect($('#multiselect-container input[value="1-1"]').prop('checked')).toBe(false);
expect($('#multiselect-container input[value="1-2"]').prop('checked')).toBe(false);
expect($('#multiselect-container input[value="1-3"]').prop('checked')).toBe(false);
expect($($('#multiselect-container li.multiselect-group input')[1]).prop('checked')).toBe(true);
expect($('#multiselect-container input[value="2-1"]').prop('checked')).toBe(true);
expect($('#multiselect-container input[value="2-2"]').prop('checked')).toBe(true);
expect($('#multiselect-container input[value="2-3"]').prop('checked')).toBe(true);
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
it('#655/1 when clicking the optgroup.', function() {
var $select = $('<select id="multiselect" multiple="multiple"></select>');
$select.append('<optgroup label="Group 1"><option value="1-1">Option 1.1</option><option value="1-2">Option 1.2</option><option value="1-3">Option 1.3</option></optgroup>');
$select.append('<optgroup label="Group 2"><option value="2-1">Option 2.1</option><option value="2-2">Option 2.2</option><option value="2-3">Option 2.3</option></optgroup>');
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableClickableOptGroups: true
});
$($('#multiselect-container li.multiselect-group input')[1]).click();
expect($($('#multiselect-container li.multiselect-group input')[0]).prop('checked')).toBe(false);
expect($('#multiselect-container input[value="1-1"]').prop('checked')).toBe(false);
expect($('#multiselect-container input[value="1-2"]').prop('checked')).toBe(false);
expect($('#multiselect-container input[value="1-3"]').prop('checked')).toBe(false);
expect($($('#multiselect-container li.multiselect-group input')[1]).prop('checked')).toBe(true);
expect($('#multiselect-container input[value="2-1"]').prop('checked')).toBe(true);
expect($('#multiselect-container input[value="2-2"]').prop('checked')).toBe(true);
expect($('#multiselect-container input[value="2-3"]').prop('checked')).toBe(true);
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
it('#655/2 when clicking the options.', function() {
var $select = $('<select id="multiselect" multiple="multiple"></select>');
$select.append('<optgroup label="Group 1"><option value="1-1">Option 1.1</option><option value="1-2">Option 1.2</option><option value="1-3">Option 1.3</option></optgroup>');
$select.append('<optgroup label="Group 2"><option value="2-1">Option 2.1</option><option value="2-2">Option 2.2</option><option value="2-3">Option 2.3</option></optgroup>');
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableClickableOptGroups: true,
selectedClass: 'multiselect-custom-selected'
});
$('#multiselect-container input[value="2-1"]').click();
$('#multiselect-container input[value="2-2"]').click();
$('#multiselect-container input[value="2-3"]').click();
expect($($('#multiselect-container li.multiselect-group')[0]).prop('class').split(' ')).not.toContain('multiselect-custom-selected');
expect($('#multiselect-container li:has(input[value="1-1"])').prop('class').split(' ')).not.toContain('multiselect-custom-selected');
expect($('#multiselect-container li:has(input[value="1-2"])').prop('class').split(' ')).not.toContain('multiselect-custom-selected');
expect($('#multiselect-container li:has(input[value="1-3"])').prop('class').split(' ')).not.toContain('multiselect-custom-selected');
expect($($('#multiselect-container li.multiselect-group')[1]).prop('class').split(' ')).toContain('multiselect-custom-selected');
expect($('#multiselect-container li:has(input[value="2-1"])').prop('class').split(' ')).toContain('multiselect-custom-selected');
expect($('#multiselect-container li:has(input[value="2-2"])').prop('class').split(' ')).toContain('multiselect-custom-selected');
expect($('#multiselect-container li:has(input[value="2-3"])').prop('class').split(' ')).toContain('multiselect-custom-selected');
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
it('#655/2 when clicking the optgroup.', function() {
var $select = $('<select id="multiselect" multiple="multiple"></select>');
$select.append('<optgroup label="Group 1"><option value="1-1">Option 1.1</option><option value="1-2">Option 1.2</option><option value="1-3">Option 1.3</option></optgroup>');
$select.append('<optgroup label="Group 2"><option value="2-1">Option 2.1</option><option value="2-2">Option 2.2</option><option value="2-3">Option 2.3</option></optgroup>');
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableClickableOptGroups: true,
selectedClass: 'multiselect-custom-selected'
});
$($('#multiselect-container li.multiselect-group input')[1]).click();
expect($($('#multiselect-container li.multiselect-group')[0]).prop('class').split(' ')).not.toContain('multiselect-custom-selected');
expect($('#multiselect-container li:has(input[value="1-1"])').prop('class').split(' ')).not.toContain('multiselect-custom-selected');
expect($('#multiselect-container li:has(input[value="1-2"])').prop('class').split(' ')).not.toContain('multiselect-custom-selected');
expect($('#multiselect-container li:has(input[value="1-3"])').prop('class').split(' ')).not.toContain('multiselect-custom-selected');
expect($($('#multiselect-container li.multiselect-group')[1]).prop('class').split(' ')).toContain('multiselect-custom-selected');
expect($('#multiselect-container li:has(input[value="2-1"])').prop('class').split(' ')).toContain('multiselect-custom-selected');
expect($('#multiselect-container li:has(input[value="2-2"])').prop('class').split(' ')).toContain('multiselect-custom-selected');
expect($('#multiselect-container li:has(input[value="2-3"])').prop('class').split(' ')).toContain('multiselect-custom-selected');
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
describe('#732.', function() {
var triggeredOnSelectAll = false;
var triggeredOnDeselectAll = false;
beforeEach(function(done) {
triggeredOnSelectAll = false;
triggeredOnDeselectAll = false;
var $select = $('<select id="multiselect" multiple="multiple"></select>');
$select.append('<option value="value-1">Option 1</option><option value="value-2">Option 2</option><option value="value-1">Option 1</option>');
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
enableFiltering: true,
includeSelectAllOption: true,
onSelectAll: function() {
triggeredOnSelectAll = true;
},
onDeselectAll: function() {
triggeredOnDeselectAll = false;
},
onFiltering: function() {
done();
}
});
$('#multiselect-container li.multiselect-filter input').val('2').trigger('keydown');
});
it('Should not fire onSelectAll or onDeselectAll when filtering or clearing filter.', function() {
expect(triggeredOnSelectAll).toBe(false);
expect(triggeredOnDeselectAll).toBe(false);
$('#multiselect-container li.multiselect-filter .multiselect-clear-filter').click();
expect(triggeredOnSelectAll).toBe(false);
expect(triggeredOnDeselectAll).toBe(false);
});
afterEach(function() {
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
});
it('#759.', function() {
var $select = $('<select data-placeholder="Test" id="multiselect" multiple="multiple"></select>');
$select.append('<option value="value-1">Option 1</option><option value="value-2">Option 2</option><option value="value-3">Option 3</option>');
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>'
});
expect($('#multiselect-container .multiselect-selected-text').text()).toBe('Test');
$('#multiselect').multiselect('destroy');
$('#multiselect').remove();
});
});
describe('Knockout Binding.', function() {
var $testArea;
afterEach(function() {
if ($testArea) {
$testArea.multiselect('destroy').remove();
}
});
it('Should update values and options with an observable array.', function() {
jasmine.clock().install();
$testArea = $('<select multiple="multiple" data-bind="selectedOptions: myValues, options: myOptions, multiselect: {numberDisplayed: 1}"></select>').appendTo(document.body);
var viewModel = {
myValues: ko.observableArray(),
myOptions: ko.observableArray([])
};
expect(ko.bindingHandlers.multiselect.init !== undefined).toEqual(true);
var optionSpy = spyOn(ko.bindingHandlers.selectedOptions, 'init').and.callThrough();
var multiSpy = spyOn(ko.bindingHandlers.multiselect, 'init').and.callThrough();
ko.applyBindings(viewModel, $testArea[0]);
// knockout bindings were called
expect(optionSpy.calls.count()).toEqual(1);
expect(multiSpy.calls.count()).toEqual(1);
// no options are present since myOptions was empty
expect($testArea.find('option').length).toEqual(0);
expect($testArea.val()).toEqual(null);
expect($testArea.next().find('button.multiselect').text().trim()).toEqual('None selected');
expect($testArea.next().find('ul li').length).toEqual(0);
// Add more options
viewModel.myOptions(['option1', 'option2']);
jasmine.clock().tick(1000);
expect($testArea.next().find('ul li').length).toEqual(2);
expect($testArea.find('option').length).toEqual(2);
expect($testArea.find('option:checked').length).toEqual(0);
// select one
viewModel.myValues(['option2']);
jasmine.clock().tick(1000);
expect($testArea.find('option:checked').length).toEqual(1);
expect($testArea.find('option:checked').text().trim()).toEqual('option2');
// select all
viewModel.myValues(['option1', 'option2']);
jasmine.clock().tick(1000);
expect($testArea.find('option:checked').length).toEqual(2);
expect($testArea.find('option:checked').map(function() { return $(this).text().trim() }).toArray()).toEqual(['option1', 'option2']);
expect($testArea.next().find('button.multiselect').text().trim()).toEqual('All selected (2)');
// add another option
viewModel.myOptions.push('wacky option');
jasmine.clock().tick(1000);
expect($testArea.find('option:checked').length).toEqual(2);
expect($testArea.find('option:checked').map(function() { return $(this).text().trim() }).toArray()).toEqual(['option1', 'option2']);
expect($testArea.find('option').map(function() { return $(this).text().trim() }).toArray()).toEqual(['option1', 'option2', 'wacky option']);
expect($testArea.next().find('button.multiselect').text().trim()).toEqual('2 selected');
});
});
describe('Bootstrap Multiselect "Reset".', function() {
var $select;
beforeEach(function() {
$select = $('<select id="multiselect" multiple="multiple"></select>');
for (var i = 1; i < 100; i++) {
$select.append('<option value="' + i + '">1</option>');
}
$('body').append($select);
$select.multiselect({
buttonContainer: '<div id="multiselect-container"></div>',
includeResetOption: true
});
});
it('Should not add an additional option to the select.', function() {
expect($select.find('option').length).toBe(99);
});
it('Should add reset button.', function() {
expect($('#multiselect-container').find('li.multiselect-reset a').text()).toBe('Reset');
});
it('Should reset if button clicked.', function() {
$select.multiselect('selectAll', true, false);
expect($select.find('option:selected').length).toBe(99);
$('#multiselect-container').find('li.multiselect-reset a').click();
expect($select.find('option:selected').length).toBe(0);
});
afterEach(function() {
$select.multiselect('destroy');
$select.remove();
});
});