form-js
Version:
Create better ui form elements. Supports IE9+, all modern browsers, and mobile.
464 lines (438 loc) • 28.9 kB
JavaScript
"use strict";
var Sinon = require('sinon');
var QUnit = require('qunit');
var TestUtils = require('test-utils');
var Checkboxes = require('../src/checkboxes');
module.exports = (function () {
QUnit.module('Checkboxes');
var checkboxHtml = '' +
'<div class="container">' +
'<label><input type="checkbox" class="ui-checkbox-input" value="NY" name="state1" />New York</label>' +
'<label><input type="checkbox" class="ui-checkbox-input" value="MD" name="state2" />Maryland</label>' +
'<label><input type="checkbox" class="ui-checkbox-input" value="DC" name="state3" />District Of Columbia</label>' +
'</div>';
var selectedClass = 'ui-checkbox-selected',
disabledClass = 'ui-checkbox-disabled';
QUnit.test('initializing/destroying', function() {
QUnit.expect(6);
var fixture = document.getElementById('qunit-fixture');
var wrapper = TestUtils.createHtmlElement(checkboxHtml);
fixture.appendChild(wrapper);
var inputs = wrapper.getElementsByClassName('ui-checkbox-input');
var containers = wrapper.getElementsByTagName('label');
var instance = new Checkboxes({inputs: inputs});
var UIElements = wrapper.getElementsByClassName('ui-checkbox');
QUnit.ok(UIElements[0].childNodes[0].isEqualNode(inputs[0]), 'after init, ui button toggle wrapper html was created for first el');
QUnit.ok(UIElements[1].childNodes[0].isEqualNode(inputs[1]), 'ui button toggle wrapper html was created for second el');
QUnit.ok(UIElements[2].childNodes[0].isEqualNode(inputs[2]), 'ui button toggle wrapper html was created for third el');
instance.destroy();
QUnit.equal(inputs[0].parentNode, containers[0], 'after destroy, first input element\'s parent node is back to original');
QUnit.equal(inputs[1].parentNode, containers[1], 'second input element\'s parent node is back to original');
QUnit.equal(inputs[2].parentNode, containers[2], 'third input element\'s parent node is back to original');
});
QUnit.test('selecting and deselecting', function() {
QUnit.expect(14);
var fixture = document.getElementById('qunit-fixture');
var wrapper = TestUtils.createHtmlElement(checkboxHtml);
fixture.appendChild(wrapper);
var inputs = wrapper.getElementsByClassName('ui-checkbox-input');
var onChangeSpy = Sinon.spy();
var instance = new Checkboxes({inputs: inputs, onChange: onChangeSpy});
var UIElements = wrapper.getElementsByClassName('ui-checkbox');
var onChangeCallCount = 0;
// select first toggle
instance.select(0);
onChangeCallCount++;
QUnit.deepEqual(onChangeSpy.args[onChangeCallCount - 1], [inputs[0].value, inputs[0], UIElements[0]], 'when first toggle item is clicked, onChange callback fired with correct args');
QUnit.ok(inputs[0].checked, 'first toggle input boolean returns truthy');
QUnit.ok(UIElements[0].classList.contains(selectedClass), 'first toggle ui element contains active class');
// deselect first toggle again
instance.deselect(0);
onChangeCallCount++;
QUnit.deepEqual(onChangeSpy.args[onChangeCallCount - 1], [inputs[0].value, inputs[0], UIElements[0]], 'when first toggle item is clicked again, onChange callback fired with correct args');
QUnit.ok(!inputs[0].checked, 'first toggle input boolean returns falsy');
QUnit.ok(!UIElements[0].classList.contains(selectedClass), 'first toggle ui element does NOT contain active class');
// select second toggle
instance.select(1);
onChangeCallCount++;
QUnit.deepEqual(onChangeSpy.args[onChangeCallCount - 1], [inputs[1].value, inputs[1], UIElements[1]], ' when second toggle item is clicked, onChange callback fired with correct args');
QUnit.ok(inputs[1].checked, 'second toggle input boolean returns truthy');
QUnit.ok(UIElements[1].classList.contains(selectedClass), 'second toggle ui element contains active class');
// select third toggle
instance.select(2);
onChangeCallCount++;
QUnit.deepEqual(onChangeSpy.args[onChangeCallCount - 1], [inputs[2].value, inputs[2], UIElements[2]], 'when third toggle item is clicked, onChange callback fired with correct args');
QUnit.ok(inputs[2].checked, 'third toggle input boolean returns truthy');
QUnit.ok(UIElements[2].classList.contains(selectedClass), 'third toggle ui element contains active class');
QUnit.ok(inputs[1].checked, 'second toggle input boolean still returns true');
QUnit.ok(UIElements[1].classList.contains(selectedClass), 'second toggle ui element still contains active class');
instance.destroy();
});
QUnit.test('clicking on input element should apply the appropriate active classes', function() {
QUnit.expect(8);
var fixture = document.getElementById('qunit-fixture');
var wrapper = TestUtils.createHtmlElement(checkboxHtml);
fixture.appendChild(wrapper);
var inputs = wrapper.getElementsByClassName('ui-checkbox-input');
var instance = new Checkboxes({inputs: inputs});
var UIElements = wrapper.getElementsByClassName('ui-checkbox');
// click first input
inputs[0].click();
QUnit.ok(UIElements[0].classList.contains(selectedClass), 'first input ui element contains active class');
QUnit.ok(!UIElements[1].classList.contains(selectedClass), 'second input ui element does NOT contain active class');
QUnit.ok(!UIElements[2].classList.contains(selectedClass), 'third input ui element does NOT contain active class');
// click first input again
inputs[0].click();
QUnit.ok(!UIElements[0].classList.contains(selectedClass), 'first input ui element no longer contains active class');
QUnit.ok(!UIElements[1].classList.contains(selectedClass), 'second input ui element does NOT contain active class');
QUnit.ok(!UIElements[2].classList.contains(selectedClass), 'third input ui element does NOT contain active class');
// click second input
inputs[1].click();
QUnit.ok(UIElements[1].classList.contains(selectedClass), 'second input ui element now contains active class');
// click third input
inputs[2].click();
QUnit.ok(UIElements[2].classList.contains(selectedClass), 'third input ui element now contains active class');
instance.destroy();
});
QUnit.test('clicking on input element should trigger onChange callback option', function() {
QUnit.expect(4);
var fixture = document.getElementById('qunit-fixture');
var wrapper = TestUtils.createHtmlElement(checkboxHtml);
fixture.appendChild(wrapper);
var inputs = wrapper.getElementsByClassName('ui-checkbox-input');
var onChangeSpy = Sinon.spy();
var instance = new Checkboxes({inputs: inputs, onChange: onChangeSpy});
var UIElements = wrapper.getElementsByClassName('ui-checkbox');
// click first input
inputs[0].click();
QUnit.deepEqual(onChangeSpy.args[0], [inputs[0].value, inputs[0], UIElements[0]], 'clicking on first input input fires onChange callback with correct args');
// click first input again
inputs[0].click();
QUnit.deepEqual(onChangeSpy.args[1], [inputs[0].value, inputs[0], UIElements[0]], 'clicking on first input input again fires onChange callback again with correct args');
// click second input
inputs[1].click();
QUnit.deepEqual(onChangeSpy.args[2], [inputs[1].value, inputs[1], UIElements[1]], 'clicking on second input input fires onChange callback with correct args');
// click third input
inputs[2].click();
QUnit.deepEqual(onChangeSpy.args[3], [inputs[2].value, inputs[2], UIElements[2]], 'clicking on third input input fires onChange callback with correct args');
instance.destroy();
});
QUnit.test('clicking on input\'s label parent adds and removes css active classes appropriately', function() {
QUnit.expect(8);
var fixture = document.getElementById('qunit-fixture');
var wrapper = TestUtils.createHtmlElement(checkboxHtml);
fixture.appendChild(wrapper);
var inputs = wrapper.getElementsByClassName('ui-checkbox-input');
var labels = wrapper.getElementsByTagName('label');
var instance = new Checkboxes({inputs: inputs});
var UIElements = wrapper.getElementsByClassName('ui-checkbox');
// click first label
labels[0].click();
QUnit.ok(UIElements[0].classList.contains(selectedClass), 'first label ui element contains active class');
QUnit.ok(!UIElements[1].classList.contains(selectedClass), 'second label ui element does NOT contain active class');
QUnit.ok(!UIElements[2].classList.contains(selectedClass), 'third label ui element does NOT contain active class');
// click first label again
labels[0].click();
QUnit.ok(!UIElements[0].classList.contains(selectedClass), 'first label ui element no longer contains active class');
QUnit.ok(!UIElements[1].classList.contains(selectedClass), 'second label ui element does NOT contain active class');
QUnit.ok(!UIElements[2].classList.contains(selectedClass), 'third label ui element does NOT contain active class');
// click second label
labels[1].click();
QUnit.ok(UIElements[1].classList.contains(selectedClass), 'second label ui element now contains active class');
// click third label
labels[2].click();
QUnit.ok(UIElements[2].classList.contains(selectedClass), 'third label ui element now contains active class');
instance.destroy();
});
QUnit.test('clicking on input\'s label parent call onChange callback option', function() {
QUnit.expect(4);
var fixture = document.getElementById('qunit-fixture');
var wrapper = TestUtils.createHtmlElement(checkboxHtml);
fixture.appendChild(wrapper);
var inputs = wrapper.getElementsByClassName('ui-checkbox-input');
var labels = wrapper.getElementsByTagName('label');
var onChangeSpy = Sinon.spy();
var instance = new Checkboxes({inputs: inputs, onChange: onChangeSpy});
var UIElements = wrapper.getElementsByClassName('ui-checkbox');
// click first label
labels[0].click();
QUnit.deepEqual(onChangeSpy.args[0], [inputs[0].value, inputs[0], UIElements[0]], 'clicking on first label fires onChange callback with correct args');
// click first label again
labels[0].click();
QUnit.deepEqual(onChangeSpy.args[1], [inputs[0].value, inputs[0], UIElements[0]], 'clicking on first label again fires onChange callback again with correct args');
// click second label
labels[1].click();
QUnit.deepEqual(onChangeSpy.args[2], [inputs[1].value, inputs[1], UIElements[1]], 'clicking on second label fires onChange callback with correct args');
// click third label
labels[2].click();
QUnit.deepEqual(onChangeSpy.args[3], [inputs[2].value, inputs[2], UIElements[2]], 'clicking on third label fires onChange callback with correct args');
instance.destroy();
});
QUnit.test('getElementKey()', function() {
QUnit.expect(1);
var wrapper = TestUtils.createHtmlElement(checkboxHtml);
var checkboxes = wrapper.getElementsByClassName('ui-checkbox-input');
var instance = new Checkboxes({inputs: checkboxes});
QUnit.equal(instance.getElementKey(), 'checkboxes', 'getElementKey() method was called and returned "checkboxes"');
instance.destroy();
});
QUnit.test('initializing when checked initially', function() {
QUnit.expect(3);
var wrapper = TestUtils.createHtmlElement(checkboxHtml);
var inputs = wrapper.getElementsByClassName('ui-checkbox-input');
inputs[0].checked = true; // make it so that input is checked initially
var onSelectedSpy = Sinon.spy();
var instance = new Checkboxes({inputs: inputs});
var UIElements = wrapper.getElementsByClassName('ui-checkbox');
QUnit.equal(inputs[0].checked, true, 'first input\'s checked property returns true initially');
QUnit.ok(UIElements[0].classList.contains(selectedClass), 'first ui element toggle has active class initially because original input was checked initially');
QUnit.equal(onSelectedSpy.callCount, 0, 'onSelected callback was NOT fired');
instance.destroy();
});
QUnit.test('enabling and disabling', function () {
QUnit.expect(18);
var wrapper = TestUtils.createHtmlElement(checkboxHtml);
var inputs = wrapper.getElementsByClassName('ui-checkbox-input');
var instance = new Checkboxes({inputs: inputs});
var UIElements = wrapper.getElementsByClassName('ui-checkbox');
QUnit.ok(!UIElements[0].classList.contains(disabledClass), 'first toggle does not have active class initially');
QUnit.ok(!inputs[0].disabled, 'first toggle input\'s disabled property returns falsy');
QUnit.ok(!UIElements[1].classList.contains(disabledClass), 'second toggle does not have active class initially');
QUnit.ok(!inputs[1].disabled, 'second toggle input\'s disabled property returns falsy');
QUnit.ok(!UIElements[2].classList.contains(disabledClass), 'third toggle does not have active class initially');
QUnit.ok(!inputs[2].disabled, 'third toggle input\'s disabled property returns falsy');
instance.disable();
QUnit.ok(UIElements[0].classList.contains(disabledClass), 'after calling disable(), first toggle does not have active class initially');
QUnit.ok(inputs[0].disabled, 'first toggle input\'s disabled property returns truthy');
QUnit.ok(UIElements[1].classList.contains(disabledClass), 'second toggle does not have active class initially');
QUnit.ok(inputs[1].disabled, 'second toggle input\'s disabled property returns truthy');
QUnit.ok(UIElements[2].classList.contains(disabledClass), 'third toggle does not have active class initially');
QUnit.ok(inputs[2].disabled, 'third toggle input\'s disabled property returns truthy');
instance.enable();
QUnit.ok(!UIElements[0].classList.contains(disabledClass), 'after calling enable(), first toggle does not have active class initially');
QUnit.ok(!inputs[0].disabled, 'first toggle input\'s disabled property returns falsy');
QUnit.ok(!UIElements[1].classList.contains(disabledClass), 'second toggle does not have active class initially');
QUnit.ok(!inputs[1].disabled, 'second toggle input\'s disabled property returns falsy');
QUnit.ok(!UIElements[2].classList.contains(disabledClass), 'third toggle does not have active class initially');
QUnit.ok(!inputs[2].disabled, 'third toggle input\'s disabled property returns falsy');
instance.destroy();
});
QUnit.test('initializing when disabled initially', function() {
QUnit.expect(2);
var wrapper = TestUtils.createHtmlElement(checkboxHtml);
var inputs = wrapper.getElementsByClassName('ui-checkbox-input');
inputs[0].disabled = true; // disable input field initially
var instance = new Checkboxes({inputs: inputs});
var UIElements = wrapper.getElementsByClassName('ui-checkbox');
QUnit.ok(inputs[0].disabled, 'first toggle input was disabled initially');
QUnit.ok(UIElements[0].classList.contains(disabledClass), 'first toggle element has disabled class initially because original input was disabled initially');
instance.destroy();
});
QUnit.test('getValue() should return all values of the currently selected checkboxes', function() {
QUnit.expect(3);
var checkboxHtml = '' +
'<div class="container">' +
'<label><input type="checkbox" value="NY" name="state1" />New York</label>' +
'<label><input type="checkbox" value="MD" name="state2" />Maryland</label>' +
'<label><input type="checkbox" value="DC" name="state3" />District Of Columbia</label>' +
'</div>';
var wrapper = TestUtils.createHtmlElement(checkboxHtml);
document.getElementById('qunit-fixture').appendChild(wrapper);
var checkboxes = wrapper.getElementsByTagName('input');
var instance = new Checkboxes({inputs: checkboxes});
QUnit.equal(instance.getValue(), '', 'calling getValue() when there is no currently set value returns empty string');
// select first checkbox
instance.select(0);
var testArray = [checkboxes[0].value];
QUnit.deepEqual(instance.getValue(), testArray, 'after selecting first toggle, getValue() returns an array with first item\'s value');
// click second toggle
instance.select(1);
testArray.push(checkboxes[1].value);
QUnit.deepEqual(instance.getValue(), testArray, 'after selecting second toggle, getValue() returns an array with first and second item\'s value');
instance.destroy();
});
QUnit.test('getValue() should return an empty array if no checkboxes are selected', function() {
QUnit.expect(1);
var checkboxHtml = '' +
'<div class="container">' +
'<label><input type="checkbox" value="NY" name="state1" />New York</label>' +
'<label><input type="checkbox" value="MD" name="state2" />Maryland</label>' +
'<label><input type="checkbox" value="DC" name="state3" />District Of Columbia</label>' +
'</div>';
var wrapper = TestUtils.createHtmlElement(checkboxHtml);
document.getElementById('qunit-fixture').appendChild(wrapper);
var checkboxes = wrapper.getElementsByTagName('input');
var instance = new Checkboxes({inputs: checkboxes});
QUnit.deepEqual(instance.getValue(), []);
instance.destroy();
});
QUnit.test('clear() should clear all checkbox button toggles', function() {
QUnit.expect(1);
var checkboxHtml = '' +
'<div class="container">' +
'<label><input type="checkbox" value="NY" name="state1" />New York</label>' +
'<label><input type="checkbox" value="MD" name="state2" />Maryland</label>' +
'<label><input type="checkbox" value="DC" name="state3" />District Of Columbia</label>' +
'</div>';
var wrapper = TestUtils.createHtmlElement(checkboxHtml);
document.getElementById('qunit-fixture').appendChild(wrapper);
var checkboxes = wrapper.getElementsByTagName('input');
var instance = new Checkboxes({inputs: checkboxes});
instance.select(0); // select first toggle
instance.select(1); // select second toggle
instance.clear();
QUnit.deepEqual(instance.getValue(), [], 'clear() returns empty array');
instance.destroy();
});
QUnit.test('clear() should unselect the currently selected radio button toggle', function() {
QUnit.expect(4);
var checkboxHtml = '' +
'<div class="container">' +
'<label><input type="checkbox" value="NY" name="state1" />New York</label>' +
'<label><input type="checkbox" value="MD" name="state2" />Maryland</label>' +
'<label><input type="checkbox" value="DC" name="state3" />District Of Columbia</label>' +
'</div>';
var wrapper = TestUtils.createHtmlElement(checkboxHtml);
document.getElementById('qunit-fixture').appendChild(wrapper);
var radios = wrapper.getElementsByTagName('input');
var instance = new Checkboxes({inputs: radios});
// click second toggle
instance.select(1);
QUnit.equal(radios[1].checked, true, 'second item is original selected');
// click third toggle
instance.clear();
QUnit.equal(radios[0].checked, false, 'after clear(), first item is not checked');
QUnit.equal(radios[1].checked, false, 'second item is not checked');
QUnit.equal(radios[2].checked, false, 'third item is not checked');
instance.destroy();
});
QUnit.test('getValue() should return empty array when clear() method is called on checkboxes', function() {
QUnit.expect(2);
var checkboxHtml = '' +
'<div class="container">' +
'<label><input type="checkbox" value="NY" name="state1" />New York</label>' +
'<label><input type="checkbox" value="MD" name="state2" />Maryland</label>' +
'<label><input type="checkbox" value="DC" name="state3" />District Of Columbia</label>' +
'</div>';
var wrapper = TestUtils.createHtmlElement(checkboxHtml);
document.getElementById('qunit-fixture').appendChild(wrapper);
var radios = wrapper.getElementsByTagName('input');
var instance = new Checkboxes({inputs: radios});
// click second toggle
instance.select(1);
QUnit.equal(instance.getValue(), radios[1].value, 'second item is original selected');
instance.clear();
QUnit.deepEqual(instance.getValue(), [], 'after clear(), getValue() returns empty value');
instance.destroy();
});
QUnit.test('should select the checkbox element with a value that matches the value passed into setValue()', function() {
QUnit.expect(6);
var fixture = document.getElementById('qunit-fixture');
var selectValue = 'MD';
var checkboxHtml = '' +
'<div class="container">' +
'<label><input type="checkbox" class="ui-checkbox-input" value="NY" name="state1" />New York</label>' +
'<label><input type="checkbox" class="ui-checkbox-input" value="' + selectValue + '" name="state2" />Maryland</label>' +
'<label><input type="checkbox" class="ui-checkbox-input" value="DC" name="state3" />District of Columbia</label>' +
'</div>';
var wrapper = TestUtils.createHtmlElement(checkboxHtml);
fixture.appendChild(wrapper);
var radios = wrapper.getElementsByTagName('input');
var checkbox2 = wrapper.querySelector('input[value="' + selectValue + '"]');
var checkbox1 = wrapper.querySelector('input[value="NY"]');
var checkbox3 = wrapper.querySelector('input[value="DC"]');
var instance = new Checkboxes({inputs: radios});
QUnit.equal(checkbox2.checked, false);
QUnit.equal(checkbox1.checked, false);
QUnit.equal(checkbox3.checked, false);
instance.setValue(selectValue);
QUnit.equal(checkbox2.checked, true, 'correct radio button is selected after passing its matching value to setValue()');
QUnit.equal(checkbox1.checked, false);
QUnit.equal(checkbox3.checked, false);
instance.destroy();
});
QUnit.test('should check all checkboxes that match the value of the options values passed in on initialize', function() {
QUnit.expect(3);
var val = 'NY';
var checkboxHtml = '' +
'<div class="container">' +
'<label><input type="checkbox" value="MD" name="state2" />Maryland</label>' +
'<label><input type="checkbox" value="' + val + '" name="state1" />New York</label>' +
'<label><input type="checkbox" value="DC" name="state3" />District Of Columbia</label>' +
'</div>';
var wrapper = TestUtils.createHtmlElement(checkboxHtml);
var inputs = wrapper.getElementsByTagName('input');
var instance = new Checkboxes({inputs: inputs, value: val});
QUnit.equal(inputs[0].checked, false, 'first input\'s checked property returns false because its value doesnt match value passed in initialize options');
QUnit.equal(inputs[1].checked, true, 'second input\'s checked property returns true initially because value was passed to options that matches it');
QUnit.equal(inputs[2].checked, false, 'third input\'s checked property returns false because its value doesnt match value passed in initialize options');
instance.destroy();
});
QUnit.test('should check all checkboxes that match the value of the options values passed in on initialize', function() {
QUnit.expect(3);
var val = 'NY';
var val2 = 'MD';
var checkboxHtml = '' +
'<div class="container">' +
'<label><input type="checkbox" value="' + val + '" name="state1" />New York</label>' +
'<label><input type="checkbox" value="' + val2 + '" name="state2" />Maryland</label>' +
'<label><input type="checkbox" value="DC" name="state3" />District Of Columbia</label>' +
'</div>';
var wrapper = TestUtils.createHtmlElement(checkboxHtml);
var inputs = wrapper.getElementsByTagName('input');
var instance = new Checkboxes({inputs: inputs, value: [val, val2]});
QUnit.equal(inputs[0].checked, true, 'first input\'s checked property returns true initially because value was passed to options that matches it');
QUnit.equal(inputs[1].checked, true, 'second input\'s checked property returns true initially because value was passed to options that matches it');
QUnit.equal(inputs[2].checked, false, 'third input\'s checked property returns false because its value doesnt match value passed in initialize options');
instance.destroy();
});
QUnit.test('clicking on UI elements should apply the appropriate active classes', function() {
QUnit.expect(8);
var fixture = document.getElementById('qunit-fixture');
var wrapper = TestUtils.createHtmlElement(checkboxHtml);
fixture.appendChild(wrapper);
var inputs = wrapper.getElementsByClassName('ui-checkbox-input');
var instance = new Checkboxes({inputs: inputs});
var UIElements = wrapper.getElementsByClassName('ui-checkbox');
// click first input
UIElements[0].click();
QUnit.ok(UIElements[0].classList.contains(selectedClass), 'first input ui element contains active class');
QUnit.ok(!UIElements[1].classList.contains(selectedClass), 'second input ui element does NOT contain active class');
QUnit.ok(!UIElements[2].classList.contains(selectedClass), 'third input ui element does NOT contain active class');
// click first input again
UIElements[0].click();
QUnit.ok(!UIElements[0].classList.contains(selectedClass), 'first input ui element no longer contains active class');
QUnit.ok(!UIElements[1].classList.contains(selectedClass), 'second input ui element does NOT contain active class');
QUnit.ok(!UIElements[2].classList.contains(selectedClass), 'third input ui element does NOT contain active class');
// click second input
UIElements[1].click();
QUnit.ok(UIElements[1].classList.contains(selectedClass), 'second input ui element now contains active class');
// click third input
UIElements[2].click();
QUnit.ok(UIElements[2].classList.contains(selectedClass), 'third input ui element now contains active class');
instance.destroy();
});
QUnit.test('clicking on UI elements should trigger onChange callback option', function() {
QUnit.expect(4);
var fixture = document.getElementById('qunit-fixture');
var wrapper = TestUtils.createHtmlElement(checkboxHtml);
fixture.appendChild(wrapper);
var inputs = wrapper.getElementsByClassName('ui-checkbox-input');
var onChangeSpy = Sinon.spy();
var instance = new Checkboxes({inputs: inputs, onChange: onChangeSpy});
var UIElements = wrapper.getElementsByClassName('ui-checkbox');
// click first input
UIElements[0].click();
QUnit.deepEqual(onChangeSpy.args[0], [inputs[0].value, inputs[0], UIElements[0]], 'clicking on first input input fires onChange callback with correct args');
// click first input again
UIElements[0].click();
QUnit.deepEqual(onChangeSpy.args[1], [inputs[0].value, inputs[0], UIElements[0]], 'clicking on first input input again fires onChange callback again with correct args');
// click second input
UIElements[1].click();
QUnit.deepEqual(onChangeSpy.args[2], [inputs[1].value, inputs[1], UIElements[1]], 'clicking on second input input fires onChange callback with correct args');
// click third input
UIElements[2].click();
QUnit.deepEqual(onChangeSpy.args[3], [inputs[2].value, inputs[2], UIElements[2]], 'clicking on third input input fires onChange callback with correct args');
instance.destroy();
});
})();