189 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
		
			Vendored
		
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
		
			Vendored
		
	
	
	
| module('Selection containers - Open On Key Down');
 | |
| 
 | |
| var KEYS = require('select2/keys');
 | |
| var $ = require('jquery');
 | |
| 
 | |
| /**
 | |
|  * Build a keydown event with the given key code and extra options.
 | |
|  *
 | |
|  * @param  {Number} keyCode     the keyboard code to be used for the 'which'
 | |
|  *                              attribute of the keydown event.
 | |
|  * @param  {Object} eventProps  extra properties to build the keydown event.
 | |
|  *
 | |
|  * @return {jQuery.Event} a 'keydown' type event.
 | |
|  */
 | |
| function buildKeyDownEvent (keyCode, eventProps) {
 | |
|   return $.Event('keydown', $.extend({}, { which: keyCode }, eventProps));
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Wrapper function providing a select2 element with a given enabled/disabled
 | |
|  * state that will get a given keydown event triggered on it. Provide an
 | |
|  * assertion callback function to test the results of the triggered event.
 | |
|  *
 | |
|  * @param  {Boolean}  isEnabled   the enabled state of the desired select2
 | |
|  *                                element.
 | |
|  * @param  {String}   testName    name for the test.
 | |
|  * @param  {Number}   keyCode     used to set the 'which' attribute of the
 | |
|  *                                keydown event.
 | |
|  * @param  {Object}   eventProps  attributes to be used to build the keydown
 | |
|  *                                event.
 | |
|  * @param  {Function} fn          assertion callback to perform checks on the
 | |
|  *                                result of triggering the event, receives the
 | |
|  *                                'assert' variable for the test and the select2
 | |
|  *                                instance behind the built <select> element.
 | |
|  * @return {null}
 | |
|  */
 | |
| function testAbled(isEnabled, testName, keyCode, eventProps, fn) {
 | |
|   test(testName, function (assert) {
 | |
|     var $element = $(
 | |
|       '<select>' +
 | |
|         '<option>one</option>' +
 | |
|         '<option>two</option>' +
 | |
|       '</select>'
 | |
|     );
 | |
|     $('#qunit-fixture').append($element);
 | |
|     $element.select2({ disabled: !isEnabled });
 | |
| 
 | |
|     var select2 = $element.data('select2');
 | |
|     var $selection = select2.$selection;
 | |
| 
 | |
|     assert.notOk(select2.isOpen(), 'The instance should not be open');
 | |
|     assert.equal(select2.isEnabled(), isEnabled);
 | |
| 
 | |
|     var event = buildKeyDownEvent(keyCode, eventProps);
 | |
|     assert.ok(event.which, 'The event\'s key code (.which) should be set');
 | |
| 
 | |
|     $selection.trigger(event);
 | |
| 
 | |
|     fn(assert, select2);
 | |
|   });
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Test the given keydown event on an enabled element. See #testAbled for
 | |
|  * params.
 | |
|  */
 | |
| function testEnabled (testName, keyCode, eventProps, fn) {
 | |
|   testAbled(true, testName, keyCode, eventProps, fn);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Test the given keydown event on a disabled element. See #testAbled for
 | |
|  * params.
 | |
|  */
 | |
| function testDisabled (testName, keyCode, eventProps, fn) {
 | |
|   testAbled(false, testName, keyCode, eventProps, fn);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Assertion function used by the above test* wrappers. Asserts that the given
 | |
|  * select2 instance is open.
 | |
|  *
 | |
|  * @param  {Assert}   assert
 | |
|  * @param  {Select2}  select
 | |
|  * @return {null}
 | |
|  */
 | |
| function assertOpened (assert, select2) {
 | |
|   assert.ok(select2.isOpen(), 'The element should be open');
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Assertion function used by the above test* wrappers. Asserts that the given
 | |
|  * select2 instance is not open.
 | |
|  *
 | |
|  * @param  {Assert}   assert
 | |
|  * @param  {Select2}  select
 | |
|  * @return {null}
 | |
|  */
 | |
| function assertNotOpened (assert, select2) {
 | |
|   assert.notOk(select2.isOpen(), 'The element should not be open');
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * ENTER, SPACE, and ALT+DOWN should all open an enabled select2 element.
 | |
|  */
 | |
| testEnabled(
 | |
|   'enabled element will open on ENTER',
 | |
|   KEYS.ENTER, {},
 | |
|   assertOpened
 | |
| );
 | |
| testEnabled(
 | |
|   'enabled element will open on SPACE',
 | |
|   KEYS.SPACE, {},
 | |
|   assertOpened
 | |
| );
 | |
| testEnabled(
 | |
|   'enabled element will open on ALT+DOWN',
 | |
|   KEYS.DOWN, { altKey: true },
 | |
|   assertOpened
 | |
| );
 | |
| 
 | |
| /**
 | |
|  * Some other keys triggered on an enabled select2 element should not open it.
 | |
|  */
 | |
| testEnabled(
 | |
|   'enabled element will not open on UP',
 | |
|   KEYS.UP, {},
 | |
|   assertNotOpened
 | |
| );
 | |
| testEnabled(
 | |
|   'enabled element will not open on DOWN',
 | |
|   KEYS.UP, {},
 | |
|   assertNotOpened
 | |
| );
 | |
| testEnabled(
 | |
|   'enabled element will not open on LEFT',
 | |
|   KEYS.UP, {},
 | |
|   assertNotOpened
 | |
| );
 | |
| testEnabled(
 | |
|   'enabled element will not open on RIGHT',
 | |
|   KEYS.UP, {},
 | |
|   assertNotOpened
 | |
| );
 | |
| 
 | |
| /*
 | |
|  * The keys that will open an enabled select2 element should not open a disabled
 | |
|  * one.
 | |
|  */
 | |
| testDisabled(
 | |
|   'disabled element will not open on ENTER',
 | |
|   KEYS.ENTER, {},
 | |
|   assertNotOpened
 | |
| );
 | |
| testDisabled(
 | |
|   'disabled element will not open on SPACE',
 | |
|   KEYS.SPACE, {},
 | |
|   assertNotOpened
 | |
| );
 | |
| testDisabled(
 | |
|   'disabled element will not open on ALT+DOWN',
 | |
|   KEYS.DOWN, { altKey: true },
 | |
|   assertNotOpened
 | |
| );
 | |
| 
 | |
| /**
 | |
|  * Other keys should continue to not open a disabled select2 element.
 | |
|  */
 | |
| testDisabled(
 | |
|   'disabled element will not open on UP',
 | |
|   KEYS.UP, {},
 | |
|   assertNotOpened
 | |
| );
 | |
| testDisabled(
 | |
|   'disabled element will not open on DOWN',
 | |
|   KEYS.UP, {},
 | |
|   assertNotOpened
 | |
| );
 | |
| testDisabled(
 | |
|   'disabled element will not open on LEFT',
 | |
|   KEYS.UP, {},
 | |
|   assertNotOpened
 | |
| );
 | |
| testDisabled(
 | |
|   'disabled element will not open on RIGHT',
 | |
|   KEYS.UP, {},
 | |
|   assertNotOpened
 | |
| );
 | 
