Permalink
/*! | |
* test/formatter.js | |
* | |
* Copyright (c) 2014 First Opinion | |
*/ | |
define([ | |
'jquery', | |
'proclaim', | |
'sinon', | |
'fakey', | |
'formatter', | |
'inpt-sel', | |
'pattern-matcher', | |
'pattern', | |
'utils' | |
], function ($, assert, sinon, fakey, Formatter, inptSel, utils) { | |
// | |
// formatter.js tests | |
// | |
describe('formatter.js', function () { | |
// Global vars | |
var $workboard = $('#workboard'); | |
// Test vars | |
var formatted, $el, el; | |
// Define new inptType | |
Formatter.addInptType('D', /[A-Za-z0-9.]/); | |
// Add fresh element | |
beforeEach(function () { | |
var html = $('#tmpl-input-text').html(); | |
$el = $(html); | |
el = $el[0]; | |
$('#workboard').append($el); | |
}); | |
// Remove element | |
afterEach(function () { | |
$el.remove(); | |
}); | |
// | |
// Formatter global tests | |
// | |
describe('global', function () { | |
// Create new instance | |
var createInstance = function (str) { | |
formatted = new Formatter($el[0], { | |
pattern: str, | |
persistent: true | |
}); | |
}; | |
it('Should set init values and merge defaults', function () { | |
createInstance('({{999}}) {{999}}-{{9999}}'); | |
// Check opts | |
assert.equal(formatted.opts.patterns[0]['*'], '({{999}}) {{999}}-{{9999}}'); | |
assert.isTrue(formatted.opts.persistent); | |
// Check pattern | |
assert.isObject(formatted.chars); | |
assert.isObject(formatted.inpts); | |
assert.isNumber(formatted.mLength); | |
// Check init values | |
assert.isObject(formatted.hldrs); | |
assert.isNumber(formatted.focus); | |
}); | |
it('Should natively handle home, end, and arrow keys', function (done) { | |
createInstance('({{999}}) {{999}}-{{9999}}'); | |
sinon.spy(Formatter.prototype, '_processKey'); | |
fakey.seq(el, [ | |
{ key: 'leftarrow' }, | |
{ key: 'rightarrow' }, | |
{ key: 'uparrow' }, | |
{ key: 'downarrow' }, | |
{ key: 'home' }, | |
{ key: 'end' }, | |
{ key: 'enter' }, | |
{ key: 'tab' } | |
], function () { | |
assert.ok(Formatter.prototype._processKey.notCalled); | |
Formatter.prototype._processKey.restore(); | |
done(); | |
}); | |
}); | |
it('Should be capable of containg a period in the pattern', function (done) { | |
createInstance('http://www.{{DDDDDDDD}}'); | |
fakey.seq(el, [ | |
{ str: 'abcd' }, | |
{ key: '.' }, | |
{ str: 'com'} | |
], function () { | |
assert.equal(formatted.el.value, 'http://www.abcd.com'); | |
done(); | |
}); | |
}); | |
it('Should update value when resetPattern method is called', function (done) { | |
createInstance('({{999}}) {{999}}-{{9999}}'); | |
fakey.str(el, '24567890', function () { | |
formatted.resetPattern('{{999}}.{{999}}.{{9999}}'); | |
assert.equal(formatted.el.value, '245.678.90 '); | |
done(); | |
}); | |
}); | |
it('Should focus to the next available inpt position', function (done) { | |
createInstance('({{999}}) {{999}}-{{9999}}'); | |
fakey.str(el, '1237890', function () { | |
assert.equal(formatted.focus, 11); | |
done(); | |
}); | |
}); | |
it('Should not focus on a formatted char', function (done) { | |
createInstance('({{999}}) {{999}}-{{9999}}'); | |
fakey.str(el, '123', function () { | |
assert.equal(formatted.focus, 6); | |
done(); | |
}); | |
}); | |
it('Should enforce pattern maxLength', function (done) { | |
createInstance('({{999}}) {{999}}-{{9999}}'); | |
fakey.str(el, '12345678901', function () { | |
assert.equal(formatted.el.value, '(123) 456-7890'); | |
done(); | |
}); | |
}); | |
it('Should add regex inpts', function (done) { | |
Formatter.addInptType('L', /[A-Z]/); | |
createInstance('{{LLL}}'); | |
fakey.str(el, 'AaAaA', function () { | |
assert.equal(formatted.el.value, 'AAA'); | |
done(); | |
}); | |
}); | |
}); | |
// | |
// Formatter with value dependent patterns | |
// | |
describe('value dependent patterns', function () { | |
it('Should apply the default format', function (done) { | |
formatted = new Formatter(el, { | |
patterns: [ | |
{ '*': '!{{9}}' } | |
] | |
}); | |
fakey.key(el, '1', function () { | |
assert.equal(formatted.el.value, '!1'); | |
done(); | |
}); | |
}); | |
it('Should apply appropriate format based on current value', function (done) { | |
formatted = new Formatter(el, { | |
patterns: [ | |
{ '^0': '!{{9999}}' }, | |
{ '*': '{{9999}}' } | |
] | |
}); | |
fakey.str(el, '0123', function () { | |
assert.equal(formatted.el.value, '!0123'); | |
done(); | |
}); | |
}); | |
it('Should apply the first appropriate format that matches the current value', function (done) { | |
formatted = new Formatter(el, { | |
patterns: [ | |
{ '^0': 'first:{{9999}}' }, | |
{ '^00': 'second:{{9999}}' } | |
] | |
}); | |
fakey.str(el, '00', function () { | |
assert.equal(formatted.el.value, 'first:00'); | |
done(); | |
}); | |
}); | |
}); | |
// | |
// Formatter with persistence | |
// | |
describe('persistent: true', function () { | |
beforeEach(function () { | |
formatted = new Formatter(el, { | |
pattern: '({{999}}) {{999}}-{{9999}}', | |
persistent: true | |
}); | |
}); | |
it('Should format chars as they are entered', function (done) { | |
fakey.str(el, '1237890', function () { | |
assert.equal(formatted.el.value, '(123) 789-0 '); | |
done(); | |
}); | |
}); | |
it('Should fromat chars entered mid str', function (done) { | |
fakey.str(el, '1237890', function () { | |
inptSel.set(el, 6); | |
fakey.str(el, '456', function () { | |
assert.equal(formatted.el.value, '(123) 456-7890'); | |
done(); | |
}); | |
}); | |
}); | |
it('Should delete chars when highlighted', function (done) { | |
fakey.str(el, '1234567890', function () { | |
inptSel.set(el, { begin: 2, end: 8 }); | |
fakey.key(el, 'backspace', function () { | |
assert.equal(formatted.el.value, '(167) 890- '); | |
done(); | |
}); | |
}); | |
}); | |
// it('Should handle pasting multiple characters', function (done) { | |
// user.keySeq('167890', function () { | |
// sel = { begin: 2, end: 2 }; | |
// user.paste('2345', function () { | |
// assert.equal(formatted.el.value, '(123) 456-7890'); | |
// done(); | |
// }); | |
// }); | |
// }); | |
it('Should remove previous character on backspace key', function (done) { | |
fakey.str(el, '1234567890', function () { | |
inptSel.set(el, 2); | |
fakey.key(el, 'backspace', function () { | |
assert.equal(formatted.el.value, '(234) 567-890 '); | |
done(); | |
}); | |
}); | |
}); | |
it('Should remove characters in correct order when backspacing over a formatted character.', function (done) { | |
fakey.str(el, '1234567890', function () { | |
fakey.key(el, 'backspace', 6, function () { | |
assert.equal(formatted.el.value, '(123) 45 - '); | |
done(); | |
}); | |
}); | |
}); | |
it('Should remove next character on delete key', function (done) { | |
fakey.str(el, '234567890', function () { | |
inptSel.set(el, 2); | |
fakey.key(el, 'delete', function () { | |
assert.equal(formatted.el.value, '(245) 678-90 '); | |
done(); | |
}); | |
}); | |
}); | |
}); | |
// | |
// Formatter without persistence | |
// | |
describe('persistent: false', function () { | |
beforeEach(function () { | |
formatted = new Formatter(el, { | |
pattern: '({{999}}) {{999}}-{{9999}}' | |
}); | |
}); | |
it('Should format chars as they are entered', function (done) { | |
fakey.str(el, '1237890', function () { | |
assert.equal(formatted.el.value, '(123) 789-0'); | |
done(); | |
}); | |
}); | |
it('Should fromat chars entered mid str', function (done) { | |
fakey.str(el, '1237890', function () { | |
inptSel.set(el, 6); | |
fakey.str(el, '456', function () { | |
assert.equal(formatted.el.value, '(123) 456-7890'); | |
done(); | |
}); | |
}); | |
}); | |
it('Should delete chars when highlighted', function (done) { | |
fakey.str(el, '1234567890', function () { | |
inptSel.set(el, { begin: 2, end: 8 }); | |
fakey.key(el, 'backspace', function () { | |
assert.equal(formatted.el.value, '(167) 890'); | |
done(); | |
}); | |
}); | |
}); | |
// it('Should handle pasting multiple characters', function (done) { | |
// fakey.str(el, '167890', function () { | |
// inptSel.set(el, 2); | |
// user.paste('2345', function () { | |
// assert.equal(formatted.el.value, '(123) 456-7890'); | |
// done(); | |
// }); | |
// }); | |
// }); | |
it('Should remove previous character on backspace key', function (done) { | |
fakey.str(el, '1234567890', function () { | |
inptSel.set(el, 2); | |
fakey.key(el, 'backspace', function () { | |
assert.equal(formatted.el.value, '(234) 567-890'); | |
done(); | |
}); | |
}); | |
}); | |
it('Should remove a format character when it is the last character on backspace key', function (done) { | |
fakey.str(el, '123', function () { | |
fakey.key(el, 'backspace', function () { | |
assert.equal(formatted.el.value, '(123'); | |
done(); | |
}); | |
}); | |
}); | |
it('Should completely empty field', function (done) { | |
fakey.key(el, '1', function () { | |
fakey.key(el, 'backspace', function () { | |
assert.equal(formatted.el.value, ''); | |
done(); | |
}); | |
}); | |
}); | |
it('Should not add chars past focus location if deleting', function (done) { | |
fakey.str(el, '1234567', function () { | |
fakey.key(el, 'backspace', function () { | |
assert.equal(formatted.el.value, '(123) 456'); | |
done(); | |
}); | |
}); | |
}); | |
it('Should remove next character on delete key', function (done) { | |
fakey.str(el, '234567890', function () { | |
inptSel.set(el, 2); | |
fakey.key(el, 'delete', function () { | |
assert.equal(formatted.el.value, '(245) 678-90'); | |
done(); | |
}); | |
}); | |
}); | |
it('Should update value when resetPattern method is called', function (done) { | |
fakey.str(el, '24567890', function () { | |
formatted.resetPattern('{{999}}.{{999}}.{{9999}}'); | |
assert.equal(formatted.el.value, '245.678.90'); | |
done(); | |
}); | |
}); | |
it('Should update value when resetPattern method is called without changing pattern', function (done) { | |
fakey.str(el, '2456789013', function () { | |
formatted.resetPattern(); | |
assert.equal(formatted.el.value, '(245) 678-9013'); | |
done(); | |
}); | |
}); | |
it('Should not reset caret position on format', function (done) { | |
fakey.str(el, '24567890', function () { | |
formatted.resetPattern(); | |
assert.equal(formatted.el.value, '(245) 678-90'); | |
assert.deepEqual({ begin: 12, end: 12 }, inptSel.get(el)); | |
done(); | |
}); | |
}); | |
}); | |
}); | |
}); |