mirror of
https://github.com/tenrok/maska.git
synced 2026-06-14 18:42:27 +03:00
New version code prepare
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
<script setup lang="ts">
|
||||
import { reactive } from 'vue'
|
||||
import { MaskaDetail, vMaska } from '../../src'
|
||||
|
||||
const binded = reactive<Partial<MaskaDetail>>({})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<input v-maska="binded" data-maska="#-#" value="123" />
|
||||
<div>{{ binded.masked }}</div>
|
||||
</template>
|
||||
@@ -0,0 +1,11 @@
|
||||
<script setup lang="ts">
|
||||
import { reactive } from 'vue'
|
||||
import { MaskaDetail, vMaska } from '../../src'
|
||||
|
||||
const binded = reactive<Partial<MaskaDetail>>({})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<input v-maska="binded" data-maska="#-#" />
|
||||
<div>{{ binded.masked }}</div>
|
||||
</template>
|
||||
@@ -0,0 +1,11 @@
|
||||
<script setup lang="ts">
|
||||
import { reactive } from 'vue'
|
||||
import { MaskaDetail, vMaska } from '../../src'
|
||||
|
||||
const binded = reactive<Partial<MaskaDetail>>({})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<input v-maska="binded" data-maska="#-#" />
|
||||
<div>{{ binded.unmasked }}</div>
|
||||
</template>
|
||||
@@ -0,0 +1,12 @@
|
||||
<script setup lang="ts">
|
||||
import { reactive } from 'vue'
|
||||
import { MaskaDetail, vMaska } from '../../src'
|
||||
|
||||
const binded = reactive<Partial<MaskaDetail>>({})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<input v-maska="binded" data-maska="#-#-#" />
|
||||
<div v-if="binded.completed">Completed</div>
|
||||
<div v-else>Uncompleted</div>
|
||||
</template>
|
||||
@@ -0,0 +1,21 @@
|
||||
<script setup lang="ts">
|
||||
import { reactive } from 'vue'
|
||||
import { vMaska, MaskaDetail, MaskInputOptions } from '../../src'
|
||||
|
||||
const binded = reactive<Partial<MaskaDetail>>({})
|
||||
const config = reactive<MaskInputOptions>({
|
||||
mask: 'A A',
|
||||
tokens: {
|
||||
A: {
|
||||
pattern: /[A-Z]/,
|
||||
multiple: true,
|
||||
transform: (chr) => chr.toUpperCase()
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<input v-maska:[config]="binded" />
|
||||
<div>{{ binded.masked }}</div>
|
||||
</template>
|
||||
@@ -0,0 +1,7 @@
|
||||
<script setup lang="ts">
|
||||
import { vMaska } from '../../src'
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<input v-maska data-maska="#-#" data-maska-eager />
|
||||
</template>
|
||||
@@ -0,0 +1,10 @@
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import { vMaska } from '../../src'
|
||||
|
||||
const mask = ref('["#--#", "#-#--#"]')
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<input v-maska :data-maska="mask" />
|
||||
</template>
|
||||
@@ -0,0 +1,13 @@
|
||||
<script setup lang="ts">
|
||||
import { MaskaDetail, vMaska } from '../../src'
|
||||
|
||||
const emit = defineEmits(['mask'])
|
||||
|
||||
const onMaska = (e: CustomEvent<MaskaDetail>) => {
|
||||
emit('mask', e.detail)
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<input v-maska data-maska="#-#" @maska="onMaska" />
|
||||
</template>
|
||||
@@ -0,0 +1,12 @@
|
||||
<script setup lang="ts">
|
||||
import { reactive } from 'vue'
|
||||
import { MaskInputOptions, vMaska } from '../../src'
|
||||
|
||||
const config = reactive<MaskInputOptions>({
|
||||
preProcess: (val) => val.toUpperCase()
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<input v-maska:[config] data-maska="A A" data-maska-tokens="A:[A-Z]:multiple" />
|
||||
</template>
|
||||
@@ -0,0 +1,21 @@
|
||||
<script lang="ts">
|
||||
import { vMaska } from '../../src'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
binded: {
|
||||
masked: ''
|
||||
}
|
||||
}
|
||||
},
|
||||
directives: {
|
||||
maska: vMaska
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<input v-maska="binded" data-maska="#-#" />
|
||||
<div>{{ binded.masked }}</div>
|
||||
</template>
|
||||
@@ -0,0 +1,7 @@
|
||||
<script setup lang="ts">
|
||||
import { vMaska } from '../../src'
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<input v-maska data-maska="#-#" />
|
||||
</template>
|
||||
@@ -0,0 +1,152 @@
|
||||
import { nextTick } from 'vue'
|
||||
import { expect, test } from 'vitest'
|
||||
import { mount } from '@vue/test-utils'
|
||||
|
||||
import BindInitial from './components/BindInitial.vue'
|
||||
import BindMasked from './components/BindMasked.vue'
|
||||
import BindUnmasked from './components/BindUnmasked.vue'
|
||||
import Completed from './components/Completed.vue'
|
||||
import Config from './components/Config.vue'
|
||||
import DataAttr from './components/DataAttr.vue'
|
||||
import Dynamic from './components/Dynamic.vue'
|
||||
import Events from './components/Events.vue'
|
||||
import Hooks from './components/Hooks.vue'
|
||||
import Options from './components/Options.vue'
|
||||
import Simple from './components/Simple.vue'
|
||||
|
||||
test('simple directive', async () => {
|
||||
const wrapper = mount(Simple)
|
||||
expect(wrapper.exists).toBeTruthy()
|
||||
|
||||
const input = wrapper.get('input')
|
||||
await input.setValue('123')
|
||||
expect(input.element.value).toBe('1-2')
|
||||
})
|
||||
|
||||
test('data-attr', async () => {
|
||||
const wrapper = mount(DataAttr)
|
||||
const input = wrapper.get('input')
|
||||
|
||||
await input.setValue('1')
|
||||
expect(input.element.value).toBe('1-')
|
||||
|
||||
await input.setValue('123')
|
||||
expect(input.element.value).toBe('1-2')
|
||||
})
|
||||
|
||||
test('dynamic mask', async () => {
|
||||
const wrapper = mount(Dynamic)
|
||||
const input = wrapper.get('input')
|
||||
|
||||
await input.setValue('12')
|
||||
expect(input.element.value).toBe('1--2')
|
||||
|
||||
await input.setValue('123')
|
||||
expect(input.element.value).toBe('1-2--3')
|
||||
})
|
||||
|
||||
test('initial value', async () => {
|
||||
const wrapper = mount(BindInitial)
|
||||
const input = wrapper.get('input')
|
||||
|
||||
await nextTick()
|
||||
|
||||
expect(input.element.value).toBe('1-2')
|
||||
expect(wrapper.get('div').element.textContent).toBe('1-2')
|
||||
})
|
||||
|
||||
test('bind masked', async () => {
|
||||
const wrapper = mount(BindMasked)
|
||||
const input = wrapper.get('input')
|
||||
|
||||
await input.setValue('123')
|
||||
expect(input.element.value).toBe('1-2')
|
||||
expect(wrapper.get('div').element.textContent).toBe('1-2')
|
||||
})
|
||||
|
||||
test('bind unmasked', async () => {
|
||||
const wrapper = mount(BindUnmasked)
|
||||
const input = wrapper.get('input')
|
||||
|
||||
await input.setValue('123')
|
||||
expect(input.element.value).toBe('1-2')
|
||||
expect(wrapper.get('div').element.textContent).toBe('12')
|
||||
})
|
||||
|
||||
test('bind completed', async () => {
|
||||
const wrapper = mount(Completed)
|
||||
const input = wrapper.get('input')
|
||||
|
||||
await input.setValue('12')
|
||||
await nextTick()
|
||||
|
||||
expect(input.element.value).toBe('1-2')
|
||||
expect(wrapper.get('div').element.textContent).toBe('Uncompleted')
|
||||
|
||||
await input.setValue('123')
|
||||
await nextTick()
|
||||
|
||||
expect(input.element.value).toBe('1-2-3')
|
||||
expect(wrapper.get('div').element.textContent).toBe('Completed')
|
||||
})
|
||||
|
||||
test('config and bind', async () => {
|
||||
const wrapper = mount(Config)
|
||||
const input = wrapper.get('input')
|
||||
|
||||
await input.setValue('1')
|
||||
expect(input.element.value).toBe('')
|
||||
expect(wrapper.get('div').element.textContent).toBe('')
|
||||
|
||||
await input.setValue('ab')
|
||||
expect(input.element.value).toBe('AB')
|
||||
expect(wrapper.get('div').element.textContent).toBe('AB')
|
||||
|
||||
await input.setValue('ab cd ')
|
||||
expect(input.element.value).toBe('AB CD')
|
||||
expect(wrapper.get('div').element.textContent).toBe('AB CD')
|
||||
|
||||
await input.setValue('ab cd1')
|
||||
expect(input.element.value).toBe('AB CD')
|
||||
expect(wrapper.get('div').element.textContent).toBe('AB CD')
|
||||
})
|
||||
|
||||
test('hooks', async () => {
|
||||
const wrapper = mount(Hooks)
|
||||
const input = wrapper.get('input')
|
||||
|
||||
await input.setValue('1')
|
||||
expect(input.element.value).toBe('')
|
||||
|
||||
await input.setValue('ab')
|
||||
expect(input.element.value).toBe('AB')
|
||||
|
||||
await input.setValue('ab cd ')
|
||||
expect(input.element.value).toBe('AB CD')
|
||||
|
||||
await input.setValue('ab cd1')
|
||||
expect(input.element.value).toBe('AB CD')
|
||||
})
|
||||
|
||||
test('events', async () => {
|
||||
const wrapper = mount(Events)
|
||||
const input = wrapper.get('input')
|
||||
|
||||
await input.setValue('1')
|
||||
expect(wrapper.emitted()).toHaveProperty('mask')
|
||||
expect(wrapper.emitted('mask')).toHaveLength(1)
|
||||
expect(wrapper.emitted('mask')[0][0]).toHaveProperty('completed', false)
|
||||
|
||||
await input.setValue('12')
|
||||
expect(wrapper.emitted('mask')).toHaveLength(2)
|
||||
expect(wrapper.emitted('mask')[1][0]).toHaveProperty('completed', true)
|
||||
})
|
||||
|
||||
test('options api component', async () => {
|
||||
const wrapper = mount(Options)
|
||||
const input = wrapper.get('input')
|
||||
|
||||
await input.setValue('123')
|
||||
expect(input.element.value).toBe('1-2')
|
||||
expect(wrapper.get('div').element.textContent).toBe('1-2')
|
||||
})
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,224 +0,0 @@
|
||||
import mask from './../src/mask'
|
||||
import tokens from './../src/tokens'
|
||||
import Maska from './../src/maska'
|
||||
|
||||
test('12 #.#', () => {
|
||||
expect(mask('12', '#.#', tokens)).toBe('1.2')
|
||||
})
|
||||
|
||||
test('1 (#)', () => {
|
||||
expect(mask('1', '(#)', tokens)).toBe('(1)')
|
||||
})
|
||||
|
||||
test('1 [(#)]', () => {
|
||||
expect(mask('1', '[(#)]', tokens)).toBe('[(1)]')
|
||||
})
|
||||
|
||||
test('1 #.#', () => {
|
||||
expect(mask('1', '#.#', tokens)).toBe('1.')
|
||||
})
|
||||
|
||||
test('1. #.#', () => {
|
||||
expect(mask('1.', '#.#', tokens)).toBe('1.')
|
||||
})
|
||||
|
||||
test('1-23A #-##!A', () => {
|
||||
expect(mask('123', '#-##!A', tokens)).toBe('1-23A')
|
||||
})
|
||||
|
||||
test('123 #.#', () => {
|
||||
expect(mask('123', '#.#', tokens)).toBe('1.2')
|
||||
})
|
||||
|
||||
test('Raw phone number', () => {
|
||||
expect(mask('44998765432', '+55 (##) #####-####', tokens, false)).toBe('44998765432')
|
||||
})
|
||||
|
||||
test('abcd12345 AAA-####', () => {
|
||||
expect(mask('abcd12345', 'AAA-####', tokens)).toBe('ABC-1234')
|
||||
})
|
||||
|
||||
test('a5-12-34 (XX) - ## - ##', () => {
|
||||
expect(mask('a5-12-34', '(XX) - ## - ##', tokens)).toBe('(a5) - 12 - 34')
|
||||
})
|
||||
|
||||
test('123 ##(#)', () => {
|
||||
expect(mask('123', '##(#)', tokens)).toBe('12(3)')
|
||||
})
|
||||
|
||||
test('12 #!#(#)', () => {
|
||||
expect(mask('12', '#!#(#)', tokens)).toBe('1#(2)')
|
||||
})
|
||||
|
||||
test('12 #!!#', () => {
|
||||
expect(mask('12', '#!!#', tokens)).toBe('1!2')
|
||||
})
|
||||
|
||||
test('12 +1 #', () => {
|
||||
expect(mask('12', '+1 #', tokens)).toBe('+1 2')
|
||||
})
|
||||
|
||||
test('2 +1 #', () => {
|
||||
expect(mask('2', '+1 #', tokens)).toBe('+1 2')
|
||||
})
|
||||
|
||||
test('abc DEF AAA aaa', () => {
|
||||
expect(mask('abc DEF', 'AAA aaa', tokens)).toBe('ABC def')
|
||||
})
|
||||
|
||||
test('123abc #*', () => {
|
||||
expect(mask('123abc', '#*', tokens)).toBe('123')
|
||||
})
|
||||
|
||||
test('123abc A*', () => {
|
||||
expect(mask('123abc', 'A*', tokens)).toBe('ABC')
|
||||
})
|
||||
|
||||
test('123abc #A*', () => {
|
||||
expect(mask('123abc', '#A*', tokens)).toBe('1ABC')
|
||||
})
|
||||
|
||||
test('123abc ## A*', () => {
|
||||
expect(mask('123abc', '## A*', tokens)).toBe('12 ABC')
|
||||
})
|
||||
|
||||
test('123abc #*A', () => {
|
||||
expect(mask('123abc', '#*A', tokens)).toBe('123A')
|
||||
})
|
||||
|
||||
test('123abc #*A*', () => {
|
||||
expect(mask('123abc', '#*A*', tokens)).toBe('123ABC')
|
||||
})
|
||||
|
||||
test('123 abc DEF 456 -> A* a*', () => {
|
||||
expect(mask('123 abc DEF 456', 'A* a*', tokens)).toBe('ABC def')
|
||||
})
|
||||
|
||||
test('abc123 A!*', () => {
|
||||
expect(mask('abc123', 'A!*', tokens)).toBe('A*')
|
||||
})
|
||||
|
||||
test('123abc #!*A*', () => {
|
||||
expect(mask('123abc', '#!*A*', tokens)).toBe('1*ABC')
|
||||
})
|
||||
|
||||
test('123abc (#*)A*', () => {
|
||||
expect(mask('123abc', '(#*)A*', tokens)).toBe('(123)ABC')
|
||||
})
|
||||
|
||||
test('123abc -> # (A*)', () => {
|
||||
expect(mask('123abc', '# (A*)', tokens)).toBe('1 (ABC')
|
||||
expect(mask('123abc ', '# (A*)', tokens)).toBe('1 (ABC)')
|
||||
})
|
||||
|
||||
test('Raw 123abc ##(A*)', () => {
|
||||
expect(mask('123abc', '##(A*)', tokens, false)).toBe('12ABC')
|
||||
})
|
||||
|
||||
test('Dynamic floats', () => {
|
||||
expect(mask('1', '["# cm", "#.# cm", "#.## cm"]', tokens)).toBe('1 cm')
|
||||
expect(mask('12', '["# cm", "#.# cm", "#.## cm"]', tokens)).toBe('1.2 cm')
|
||||
expect(mask('123', '["# cm", "#.# cm", "#.## cm"]', tokens)).toBe('1.23 cm')
|
||||
})
|
||||
|
||||
test('Dynamic CPF/CNPJ', () => {
|
||||
expect(mask('12345678901', '["###.###.###-##", "##.###.###/####-##"]', tokens)).toBe('123.456.789-01')
|
||||
expect(mask('12345678901234', '["###.###.###-##", "##.###.###/####-##"]', tokens)).toBe('12.345.678/9012-34')
|
||||
})
|
||||
|
||||
test('Dynamic boundaries', () => {
|
||||
expect(mask('12', '["!###", "!###-##", "!###-##-##"]', tokens)).toBe('#12')
|
||||
expect(mask('1234', '["!###", "!###-##", "!###-##-##"]', tokens)).toBe('#12-34')
|
||||
expect(mask('1234567', '["!###", "!###-##", "!###-##-##"]', tokens)).toBe('#12-34-56')
|
||||
expect(mask('123', '["###", "###-##", "###.##.##"]', tokens)).toBe('123')
|
||||
expect(mask('12345', '["###", "###-##", "###.##.##"]', tokens)).toBe('123-45')
|
||||
expect(mask('12345678', '["###", "###-##", "###.##.##"]', tokens)).toBe('123.45.67')
|
||||
})
|
||||
|
||||
test('Custom transform: odd number -> 1, even number -> 0', () => {
|
||||
// isOdd
|
||||
const transform = (numberLike) => String(Number(numberLike) % 2)
|
||||
|
||||
expect((mask('1234567890', '#*', {
|
||||
...tokens,
|
||||
...{
|
||||
'#': {
|
||||
pattern: /[0-9]/,
|
||||
transform
|
||||
}
|
||||
}
|
||||
}))).toBe('1010101010')
|
||||
})
|
||||
|
||||
function transliterate(char) {
|
||||
const rule = Object.entries({
|
||||
a: 'а',
|
||||
b: 'в',
|
||||
k: 'к',
|
||||
m: 'м',
|
||||
h: 'н',
|
||||
o: 'о',
|
||||
p: 'р',
|
||||
c: 'с',
|
||||
t: 'т',
|
||||
y: 'у',
|
||||
x: 'х',
|
||||
}).reduce((acc, [from, to]) => {
|
||||
acc[from] = to
|
||||
acc[from.toLocaleUpperCase()] = to.toLocaleUpperCase()
|
||||
return acc
|
||||
}, {})
|
||||
return rule[char]
|
||||
}
|
||||
|
||||
test('Custom transform: transliterate abkTYX -> авкТУХ', () => {
|
||||
expect(mask('abkTYX', 'T*', {
|
||||
...tokens,
|
||||
...{
|
||||
'T': {
|
||||
pattern: /[a-zA-Z]/,
|
||||
transform: transliterate
|
||||
}
|
||||
}
|
||||
})).toBe('авкТУХ')
|
||||
})
|
||||
|
||||
test('Custom transform with `uppercase` and `lowercase` enabled: abkTYX -> АВКТУХ, abkTYX -> авктух', () => {
|
||||
expect(mask('abkTYX', 'T*', {
|
||||
...tokens,
|
||||
...{
|
||||
'T': {
|
||||
pattern: /[a-zA-Z]/,
|
||||
transform: transliterate,
|
||||
uppercase: true,
|
||||
}
|
||||
}
|
||||
})).toBe('АВКТУХ')
|
||||
|
||||
expect(mask('abkTYX', 'T*', {
|
||||
...tokens,
|
||||
...{
|
||||
'T': {
|
||||
pattern: /[a-zA-Z]/,
|
||||
transform: transliterate,
|
||||
lowercase: true,
|
||||
}
|
||||
}
|
||||
})).toBe('авктух')
|
||||
})
|
||||
|
||||
test('Custom value preprocessing', () => {
|
||||
const elem = document.createElement('input')
|
||||
document.body.appendChild(elem)
|
||||
|
||||
const mask = new Maska(elem, {
|
||||
mask: 'S*',
|
||||
preprocessor: function(val) {
|
||||
return val.toLocaleUpperCase()
|
||||
}
|
||||
})
|
||||
elem.value = "abkTYX"
|
||||
elem.dispatchEvent(new Event('input', {bubbles: true}))
|
||||
|
||||
expect(elem.value).toBe("ABKTYX")
|
||||
})
|
||||
@@ -0,0 +1,790 @@
|
||||
import { expect, test } from 'vitest'
|
||||
|
||||
import { Mask } from '../src/mask'
|
||||
|
||||
test('null mask', () => {
|
||||
// @ts-ignore
|
||||
const mask = new Mask({ mask: null })
|
||||
|
||||
expect(mask.masked('1a')).toBe('')
|
||||
})
|
||||
|
||||
test('undefined mask', () => {
|
||||
const mask = new Mask({ mask: undefined })
|
||||
|
||||
expect(mask.masked('1a')).toBe('')
|
||||
})
|
||||
|
||||
test('@ @ mask', () => {
|
||||
const mask = new Mask({ mask: '@ @' })
|
||||
|
||||
expect(mask.masked('1')).toBe('')
|
||||
expect(mask.masked('a')).toBe('a')
|
||||
expect(mask.masked('ab')).toBe('a b')
|
||||
expect(mask.masked('abc')).toBe('a b')
|
||||
expect(mask.masked('1abc')).toBe('a b')
|
||||
|
||||
expect(mask.unmasked('1abc')).toBe('ab')
|
||||
|
||||
expect(mask.completed('a')).toBe(false)
|
||||
expect(mask.completed('ab')).toBe(true)
|
||||
})
|
||||
|
||||
test('@ @ eager mask', () => {
|
||||
const mask = new Mask({ mask: '@ @', eager: true })
|
||||
|
||||
expect(mask.masked('1')).toBe('')
|
||||
expect(mask.masked('a')).toBe('a ')
|
||||
expect(mask.masked('ab')).toBe('a b')
|
||||
expect(mask.masked('abc')).toBe('a b')
|
||||
expect(mask.masked('1abc')).toBe('a b')
|
||||
|
||||
expect(mask.unmasked('1abc')).toBe('ab')
|
||||
})
|
||||
|
||||
test('#.# mask', () => {
|
||||
const mask = new Mask({ mask: '#.#' })
|
||||
|
||||
expect(mask.masked('1')).toBe('1')
|
||||
expect(mask.masked('1.')).toBe('1.')
|
||||
expect(mask.masked('12')).toBe('1.2')
|
||||
expect(mask.masked('123')).toBe('1.2')
|
||||
expect(mask.masked('a123')).toBe('1.2')
|
||||
|
||||
expect(mask.unmasked('a123')).toBe('12')
|
||||
})
|
||||
|
||||
test('#.# eager mask', () => {
|
||||
const mask = new Mask({ mask: '#.#', eager: true })
|
||||
|
||||
expect(mask.masked('1')).toBe('1.')
|
||||
expect(mask.masked('1.')).toBe('1.')
|
||||
expect(mask.masked('1 ')).toBe('1.')
|
||||
expect(mask.masked('12')).toBe('1.2')
|
||||
expect(mask.masked('123')).toBe('1.2')
|
||||
expect(mask.masked('a123')).toBe('1.2')
|
||||
|
||||
expect(mask.unmasked('a123')).toBe('12')
|
||||
})
|
||||
|
||||
test('@@-## mask', () => {
|
||||
const mask = new Mask({ mask: '@@-##' })
|
||||
|
||||
expect(mask.masked('12')).toBe('')
|
||||
expect(mask.masked('ab')).toBe('ab')
|
||||
expect(mask.masked('ab12')).toBe('ab-12')
|
||||
expect(mask.masked('ab-12')).toBe('ab-12')
|
||||
expect(mask.masked('abc123')).toBe('ab-12')
|
||||
expect(mask.masked('a1b2a1b2')).toBe('ab-21')
|
||||
|
||||
expect(mask.unmasked('a1b2a1b2')).toBe('ab21')
|
||||
})
|
||||
|
||||
test('@@-## eager mask', () => {
|
||||
const mask = new Mask({ mask: '@@-##', eager: true })
|
||||
|
||||
expect(mask.masked('12')).toBe('')
|
||||
expect(mask.masked('ab')).toBe('ab-')
|
||||
expect(mask.masked('ab12')).toBe('ab-12')
|
||||
expect(mask.masked('ab-12')).toBe('ab-12')
|
||||
expect(mask.masked('abc123')).toBe('ab-12')
|
||||
expect(mask.masked('a1b2a1b2')).toBe('ab-21')
|
||||
|
||||
expect(mask.unmasked('a1b2a1b2')).toBe('ab21')
|
||||
})
|
||||
|
||||
test('(#) mask', () => {
|
||||
const mask = new Mask({ mask: '(#)' })
|
||||
|
||||
expect(mask.masked('1')).toBe('(1')
|
||||
expect(mask.masked('(1')).toBe('(1')
|
||||
expect(mask.masked('1 ')).toBe('(1)')
|
||||
expect(mask.masked('12')).toBe('(1)')
|
||||
expect(mask.masked('a12')).toBe('(1)')
|
||||
|
||||
expect(mask.unmasked('a123')).toBe('1')
|
||||
})
|
||||
|
||||
test('(#) eager mask', () => {
|
||||
const mask = new Mask({ mask: '(#)', eager: true })
|
||||
|
||||
expect(mask.masked('1')).toBe('(1)')
|
||||
expect(mask.masked('(1')).toBe('(1)')
|
||||
expect(mask.masked('12')).toBe('(1)')
|
||||
expect(mask.masked('a12')).toBe('(1)')
|
||||
|
||||
expect(mask.unmasked('a123')).toBe('1')
|
||||
})
|
||||
|
||||
test('#-#--# mask', () => {
|
||||
const mask = new Mask({ mask: '#-#--#' })
|
||||
|
||||
expect(mask.masked('1')).toBe('1')
|
||||
expect(mask.masked('12')).toBe('1-2')
|
||||
expect(mask.masked('123')).toBe('1-2--3')
|
||||
expect(mask.masked('a1234')).toBe('1-2--3')
|
||||
|
||||
expect(mask.unmasked('a1234')).toBe('123')
|
||||
})
|
||||
|
||||
test('#-#--# eager mask', () => {
|
||||
const mask = new Mask({ mask: '#-#--#', eager: true })
|
||||
|
||||
expect(mask.masked('1')).toBe('1-')
|
||||
expect(mask.masked('12')).toBe('1-2--')
|
||||
expect(mask.masked('123')).toBe('1-2--3')
|
||||
expect(mask.masked('a1234')).toBe('1-2--3')
|
||||
|
||||
expect(mask.unmasked('a1234')).toBe('123')
|
||||
})
|
||||
|
||||
test('!##.# mask', () => {
|
||||
const mask = new Mask({ mask: '!##.#' })
|
||||
|
||||
expect(mask.masked('1')).toBe('#1')
|
||||
expect(mask.masked('#1')).toBe('#1')
|
||||
expect(mask.masked('12')).toBe('#1.2')
|
||||
expect(mask.masked('1.2')).toBe('#1.2')
|
||||
expect(mask.masked('#1.2')).toBe('#1.2')
|
||||
expect(mask.masked('123')).toBe('#1.2')
|
||||
expect(mask.masked('a123')).toBe('#1.2')
|
||||
|
||||
expect(mask.unmasked('a123')).toBe('12')
|
||||
})
|
||||
|
||||
test('!##.# eager mask', () => {
|
||||
const mask = new Mask({ mask: '!##.#', eager: true })
|
||||
|
||||
expect(mask.masked('1')).toBe('#1.')
|
||||
expect(mask.masked('#1')).toBe('#1.')
|
||||
expect(mask.masked('12')).toBe('#1.2')
|
||||
expect(mask.masked('1.2')).toBe('#1.2')
|
||||
expect(mask.masked('#1.2')).toBe('#1.2')
|
||||
expect(mask.masked('123')).toBe('#1.2')
|
||||
expect(mask.masked('a123')).toBe('#1.2')
|
||||
|
||||
expect(mask.unmasked('a123')).toBe('12')
|
||||
})
|
||||
|
||||
test('0#.# mask', () => {
|
||||
const mask = new Mask({ mask: '0#.#' })
|
||||
|
||||
expect(mask.masked('1')).toBe('01')
|
||||
expect(mask.masked('01')).toBe('01')
|
||||
expect(mask.masked('12')).toBe('01.2')
|
||||
expect(mask.masked('1.2')).toBe('01.2')
|
||||
expect(mask.masked('01.2')).toBe('01.2')
|
||||
expect(mask.masked('123')).toBe('01.2')
|
||||
expect(mask.masked('a123')).toBe('01.2')
|
||||
|
||||
expect(mask.unmasked('a123')).toBe('12')
|
||||
})
|
||||
|
||||
test('0#.# eager mask', () => {
|
||||
const mask = new Mask({ mask: '0#.#', eager: true })
|
||||
|
||||
expect(mask.masked('1')).toBe('01.')
|
||||
expect(mask.masked('01')).toBe('00.1')
|
||||
expect(mask.masked('12')).toBe('01.2')
|
||||
expect(mask.masked('1.2')).toBe('01.2')
|
||||
expect(mask.masked('01.2')).toBe('00.1')
|
||||
expect(mask.masked('123')).toBe('01.2')
|
||||
expect(mask.masked('a123')).toBe('01.2')
|
||||
|
||||
expect(mask.unmasked('a123')).toBe('12')
|
||||
})
|
||||
|
||||
test('#.#!* mask', () => {
|
||||
const mask = new Mask({ mask: '#.#!*' })
|
||||
|
||||
expect(mask.masked('1')).toBe('1')
|
||||
expect(mask.masked('12')).toBe('1.2')
|
||||
expect(mask.masked('1.2')).toBe('1.2')
|
||||
expect(mask.masked('12*')).toBe('1.2*')
|
||||
expect(mask.masked('1.2*')).toBe('1.2*')
|
||||
expect(mask.masked('1.2 ')).toBe('1.2*')
|
||||
expect(mask.masked('123')).toBe('1.2*')
|
||||
expect(mask.masked('a123')).toBe('1.2*')
|
||||
|
||||
expect(mask.unmasked('a123')).toBe('12')
|
||||
})
|
||||
|
||||
test('#.#!* eager mask', () => {
|
||||
const mask = new Mask({ mask: '#.#!*', eager: true })
|
||||
|
||||
expect(mask.masked('1')).toBe('1.')
|
||||
expect(mask.masked('12')).toBe('1.2*')
|
||||
expect(mask.masked('1.2')).toBe('1.2*')
|
||||
expect(mask.masked('12*')).toBe('1.2*')
|
||||
expect(mask.masked('1.2*')).toBe('1.2*')
|
||||
expect(mask.masked('123')).toBe('1.2*')
|
||||
expect(mask.masked('a123')).toBe('1.2*')
|
||||
|
||||
expect(mask.unmasked('a123')).toBe('12')
|
||||
})
|
||||
|
||||
test('#.#!** mask', () => {
|
||||
const mask = new Mask({ mask: '#.#!**' })
|
||||
|
||||
expect(mask.masked('1')).toBe('1')
|
||||
expect(mask.masked('12')).toBe('1.2')
|
||||
expect(mask.masked('1.2')).toBe('1.2')
|
||||
expect(mask.masked('12*')).toBe('1.2*')
|
||||
expect(mask.masked('1.2*')).toBe('1.2*')
|
||||
expect(mask.masked('1.2 ')).toBe('1.2*')
|
||||
expect(mask.masked('123')).toBe('1.2*3')
|
||||
expect(mask.masked('12*3')).toBe('1.2*3')
|
||||
expect(mask.masked('a123')).toBe('1.2*3')
|
||||
|
||||
expect(mask.unmasked('a123')).toBe('123')
|
||||
})
|
||||
|
||||
test('#.#!** eager mask', () => {
|
||||
const mask = new Mask({ mask: '#.#!**', eager: true })
|
||||
|
||||
expect(mask.masked('1')).toBe('1.')
|
||||
expect(mask.masked('12')).toBe('1.2*')
|
||||
expect(mask.masked('1.2')).toBe('1.2*')
|
||||
expect(mask.masked('12*')).toBe('1.2*')
|
||||
expect(mask.masked('1.2*')).toBe('1.2*')
|
||||
expect(mask.masked('1.2*3')).toBe('1.2*3')
|
||||
expect(mask.masked('123')).toBe('1.2*3')
|
||||
expect(mask.masked('a123')).toBe('1.2*3')
|
||||
|
||||
expect(mask.unmasked('a123')).toBe('123')
|
||||
})
|
||||
|
||||
test('0#!-# mask', () => {
|
||||
const mask = new Mask({ mask: '0#!-#' })
|
||||
|
||||
expect(mask.masked('a')).toBe('0')
|
||||
expect(mask.masked('0')).toBe('0')
|
||||
expect(mask.masked('1')).toBe('01')
|
||||
expect(mask.masked('12')).toBe('01-2')
|
||||
expect(mask.masked('01-2')).toBe('01-2')
|
||||
expect(mask.masked('123')).toBe('01-2')
|
||||
expect(mask.masked('a123')).toBe('01-2')
|
||||
|
||||
expect(mask.unmasked('a123')).toBe('12')
|
||||
})
|
||||
|
||||
test('!0#!-# eager mask', () => {
|
||||
const mask = new Mask({ mask: '!0#!-#', eager: true })
|
||||
|
||||
expect(mask.masked('a')).toBe('0')
|
||||
expect(mask.masked('0')).toBe('00-')
|
||||
expect(mask.masked('1')).toBe('01-')
|
||||
expect(mask.masked('12')).toBe('01-2')
|
||||
expect(mask.masked('01-2')).toBe('00-1')
|
||||
expect(mask.masked('123')).toBe('01-2')
|
||||
expect(mask.masked('a123')).toBe('01-2')
|
||||
|
||||
expect(mask.unmasked('a123')).toBe('12')
|
||||
})
|
||||
|
||||
test('#2 ## mask', () => {
|
||||
const mask = new Mask({ mask: '#2 ##' })
|
||||
|
||||
expect(mask.masked('1')).toBe('1')
|
||||
expect(mask.masked('12')).toBe('12')
|
||||
expect(mask.masked('12 ')).toBe('12 ')
|
||||
expect(mask.masked('13')).toBe('12 3')
|
||||
expect(mask.masked('123')).toBe('12 3')
|
||||
expect(mask.masked('134')).toBe('12 34')
|
||||
expect(mask.masked('1234')).toBe('12 34')
|
||||
expect(mask.masked('1345')).toBe('12 34')
|
||||
expect(mask.masked('12345')).toBe('12 34')
|
||||
expect(mask.masked('a1')).toBe('1')
|
||||
expect(mask.masked('a13')).toBe('12 3')
|
||||
|
||||
expect(mask.unmasked('12345')).toBe('134')
|
||||
})
|
||||
|
||||
test('#2 ## eager mask', () => {
|
||||
const mask = new Mask({ mask: '#2 ##', eager: true })
|
||||
|
||||
expect(mask.masked('1')).toBe('12 ')
|
||||
expect(mask.masked('12')).toBe('12 2')
|
||||
expect(mask.masked('12 ')).toBe('12 2')
|
||||
expect(mask.masked('13')).toBe('12 3')
|
||||
expect(mask.masked('123')).toBe('12 23')
|
||||
expect(mask.masked('134')).toBe('12 34')
|
||||
expect(mask.masked('1234')).toBe('12 23')
|
||||
expect(mask.masked('1345')).toBe('12 34')
|
||||
expect(mask.masked('12345')).toBe('12 23')
|
||||
expect(mask.masked('a1')).toBe('12 ')
|
||||
expect(mask.masked('a13')).toBe('12 3')
|
||||
|
||||
expect(mask.unmasked('12345')).toBe('134')
|
||||
})
|
||||
|
||||
test('(#) 3## mask', () => {
|
||||
const mask = new Mask({ mask: '(#) 3##' })
|
||||
|
||||
expect(mask.masked('1')).toBe('(1')
|
||||
expect(mask.masked('12')).toBe('(1) 32')
|
||||
expect(mask.masked('123')).toBe('(1) 323')
|
||||
expect(mask.masked('1234')).toBe('(1) 323')
|
||||
expect(mask.masked('13')).toBe('(1) 3')
|
||||
expect(mask.masked('134')).toBe('(1) 34')
|
||||
expect(mask.masked('(1) 23')).toBe('(1) 323')
|
||||
expect(mask.masked('(1) 34')).toBe('(1) 34')
|
||||
|
||||
expect(mask.unmasked('1')).toBe('1')
|
||||
expect(mask.unmasked('1234')).toBe('123')
|
||||
expect(mask.unmasked('(1) 3')).toBe('1')
|
||||
expect(mask.unmasked('(1) 32')).toBe('12')
|
||||
})
|
||||
|
||||
test('(#) 3## eager mask', () => {
|
||||
const mask = new Mask({ mask: '(#) 3##', eager: true })
|
||||
|
||||
expect(mask.masked('1')).toBe('(1) 3')
|
||||
expect(mask.masked('12')).toBe('(1) 32')
|
||||
expect(mask.masked('123')).toBe('(1) 323')
|
||||
expect(mask.masked('1234')).toBe('(1) 323')
|
||||
expect(mask.masked('13')).toBe('(1) 33')
|
||||
expect(mask.masked('134')).toBe('(1) 334')
|
||||
expect(mask.masked('(1) 23')).toBe('(1) 323')
|
||||
expect(mask.masked('(1) 34')).toBe('(1) 334')
|
||||
|
||||
expect(mask.unmasked('1')).toBe('1')
|
||||
expect(mask.unmasked('1234')).toBe('123')
|
||||
expect(mask.unmasked('(1) 3')).toBe('1')
|
||||
expect(mask.unmasked('(1) 32')).toBe('12')
|
||||
})
|
||||
|
||||
test('(1) 2# mask', () => {
|
||||
const mask = new Mask({ mask: '(1) 2#' })
|
||||
|
||||
expect(mask.masked(' ')).toBe('(1) ')
|
||||
expect(mask.masked('.')).toBe('(1) 2')
|
||||
expect(mask.masked('1')).toBe('(1')
|
||||
expect(mask.masked('12')).toBe('(1) 2')
|
||||
expect(mask.masked('123')).toBe('(1) 23')
|
||||
expect(mask.masked('1234')).toBe('(1) 23')
|
||||
expect(mask.masked('13')).toBe('(1) 23')
|
||||
expect(mask.masked('(1) 23')).toBe('(1) 23')
|
||||
expect(mask.masked('(1) 34')).toBe('(1) 23')
|
||||
expect(mask.masked('2')).toBe('(1) 2')
|
||||
expect(mask.masked('23')).toBe('(1) 23')
|
||||
expect(mask.masked('3')).toBe('(1) 23')
|
||||
expect(mask.masked('4')).toBe('(1) 24')
|
||||
|
||||
expect(mask.unmasked('1')).toBe('')
|
||||
expect(mask.unmasked('12')).toBe('')
|
||||
expect(mask.unmasked('123')).toBe('3')
|
||||
expect(mask.unmasked('(1) 23')).toBe('3')
|
||||
})
|
||||
|
||||
test('(1) 2## eager mask', () => {
|
||||
const mask = new Mask({ mask: '(1) 2##', eager: true })
|
||||
|
||||
expect(mask.masked(' ')).toBe('(1) 2')
|
||||
expect(mask.masked('.')).toBe('(1) 2')
|
||||
expect(mask.masked('1')).toBe('(1) 21')
|
||||
expect(mask.masked('12')).toBe('(1) 212')
|
||||
expect(mask.masked('123')).toBe('(1) 212')
|
||||
expect(mask.masked('13')).toBe('(1) 213')
|
||||
expect(mask.masked('(1) 23')).toBe('(1) 212')
|
||||
expect(mask.masked('(1) 34')).toBe('(1) 213')
|
||||
expect(mask.masked('2')).toBe('(1) 22')
|
||||
expect(mask.masked('23')).toBe('(1) 223')
|
||||
expect(mask.masked('3')).toBe('(1) 23')
|
||||
|
||||
expect(mask.unmasked('1')).toBe('')
|
||||
expect(mask.unmasked('12')).toBe('')
|
||||
expect(mask.unmasked('123')).toBe('3')
|
||||
expect(mask.unmasked('(1) 23')).toBe('3')
|
||||
})
|
||||
|
||||
test('12## mask', () => {
|
||||
const mask = new Mask({ mask: '12##' })
|
||||
|
||||
expect(mask.masked('.')).toBe('12')
|
||||
expect(mask.masked('1')).toBe('1')
|
||||
expect(mask.masked('2')).toBe('12')
|
||||
expect(mask.masked('3')).toBe('123')
|
||||
expect(mask.masked('12')).toBe('12')
|
||||
expect(mask.masked('123')).toBe('123')
|
||||
expect(mask.masked('13')).toBe('123')
|
||||
expect(mask.masked('134')).toBe('1234')
|
||||
|
||||
expect(mask.unmasked('1')).toBe('')
|
||||
expect(mask.unmasked('12')).toBe('')
|
||||
expect(mask.unmasked('123')).toBe('3')
|
||||
expect(mask.unmasked('3')).toBe('3')
|
||||
expect(mask.unmasked('(1) 23')).toBe('12')
|
||||
})
|
||||
|
||||
test('12## eager mask', () => {
|
||||
const mask = new Mask({ mask: '12##', eager: true })
|
||||
|
||||
expect(mask.masked(' ')).toBe('12')
|
||||
expect(mask.masked('.')).toBe('12')
|
||||
expect(mask.masked('1')).toBe('121')
|
||||
expect(mask.masked('2')).toBe('122')
|
||||
expect(mask.masked('3')).toBe('123')
|
||||
expect(mask.masked('12')).toBe('1212')
|
||||
expect(mask.masked('123')).toBe('1212')
|
||||
expect(mask.masked('13')).toBe('1213')
|
||||
expect(mask.masked('134')).toBe('1213')
|
||||
|
||||
expect(mask.unmasked('1')).toBe('')
|
||||
expect(mask.unmasked('12')).toBe('')
|
||||
expect(mask.unmasked('123')).toBe('3')
|
||||
expect(mask.unmasked('3')).toBe('3')
|
||||
expect(mask.unmasked('(1) 23')).toBe('12')
|
||||
})
|
||||
|
||||
test('#!!# mask', () => {
|
||||
const mask = new Mask({ mask: '#!!#' })
|
||||
|
||||
expect(mask.masked('1')).toBe('1')
|
||||
expect(mask.masked('12')).toBe('1!2')
|
||||
expect(mask.masked('1!2')).toBe('1!2')
|
||||
expect(mask.masked('123')).toBe('1!2')
|
||||
expect(mask.masked('a123')).toBe('1!2')
|
||||
|
||||
expect(mask.unmasked('a123')).toBe('12')
|
||||
})
|
||||
|
||||
test('#!!# eager mask', () => {
|
||||
const mask = new Mask({ mask: '#!!#', eager: true })
|
||||
|
||||
expect(mask.masked('1')).toBe('1!')
|
||||
expect(mask.masked('12')).toBe('1!2')
|
||||
expect(mask.masked('1!2')).toBe('1!2')
|
||||
expect(mask.masked('123')).toBe('1!2')
|
||||
expect(mask.masked('a123')).toBe('1!2')
|
||||
|
||||
expect(mask.unmasked('a123')).toBe('12')
|
||||
})
|
||||
|
||||
test('+1 (###) ###-##-## mask', () => {
|
||||
const mask = new Mask({ mask: '+1 (###) ###-##-##' })
|
||||
|
||||
expect(mask.masked('999')).toBe('+1 (999')
|
||||
expect(mask.masked('999123')).toBe('+1 (999) 123')
|
||||
expect(mask.masked('19991234567')).toBe('+1 (999) 123-45-67')
|
||||
expect(mask.masked('+19991234567')).toBe('+1 (999) 123-45-67')
|
||||
expect(mask.masked('9991234567')).toBe('+1 (999) 123-45-67')
|
||||
expect(mask.masked('a9991234567')).toBe('+1 (999) 123-45-67')
|
||||
|
||||
expect(mask.unmasked('+19991234567')).toBe('9991234567')
|
||||
})
|
||||
|
||||
test('+1 (###) ###-##-## eager mask', () => {
|
||||
const mask = new Mask({ mask: '+1 (###) ###-##-##', eager: true })
|
||||
|
||||
expect(mask.masked('99')).toBe('+1 (99')
|
||||
expect(mask.masked('999')).toBe('+1 (999) ')
|
||||
expect(mask.masked('99912')).toBe('+1 (999) 12')
|
||||
expect(mask.masked('999123')).toBe('+1 (999) 123-')
|
||||
expect(mask.masked('19991234567')).toBe('+1 (199) 912-34-56')
|
||||
expect(mask.masked('+19991234567')).toBe('+1 (199) 912-34-56')
|
||||
expect(mask.masked('9991234567')).toBe('+1 (999) 123-45-67')
|
||||
expect(mask.masked('a9991234567')).toBe('+1 (999) 123-45-67')
|
||||
|
||||
expect(mask.unmasked('+19991234567')).toBe('9991234567')
|
||||
})
|
||||
|
||||
test('1 (###) ###-##-## eager mask', () => {
|
||||
const mask = new Mask({ mask: '1 (###) ###-##-##', eager: true })
|
||||
|
||||
expect(mask.masked('19991234567')).toBe('1 (199) 912-34-56')
|
||||
expect(mask.masked('+19991234567')).toBe('1 (199) 912-34-56')
|
||||
expect(mask.masked('9991234567')).toBe('1 (999) 123-45-67')
|
||||
expect(mask.masked('a9991234567')).toBe('1 (999) 123-45-67')
|
||||
|
||||
expect(mask.unmasked('19991234567')).toBe('9991234567')
|
||||
expect(mask.unmasked('+19991234567')).toBe('1999123456')
|
||||
})
|
||||
|
||||
test('transform mask', () => {
|
||||
const mask = new Mask({
|
||||
mask: 'ZZzz',
|
||||
tokens: {
|
||||
Z: { pattern: /[a-zA-Z]/, transform: (char) => char.toUpperCase() },
|
||||
z: { pattern: /[a-zA-Z]/, transform: (char) => char.toLowerCase() }
|
||||
}
|
||||
})
|
||||
expect(mask.masked('abcd')).toBe('ABcd')
|
||||
expect(mask.masked('ABCD')).toBe('ABcd')
|
||||
expect(mask.masked('1AB2CD')).toBe('ABcd')
|
||||
|
||||
expect(mask.unmasked('1AB2CD')).toBe('ABcd')
|
||||
})
|
||||
|
||||
test('transform strict mask', () => {
|
||||
const mask = new Mask({
|
||||
mask: 'ZZzz',
|
||||
tokens: {
|
||||
Z: { pattern: /[A-Z]/, transform: (char) => char.toUpperCase() },
|
||||
z: { pattern: /[a-z]/, transform: (char) => char.toLowerCase() }
|
||||
}
|
||||
})
|
||||
expect(mask.masked('abcd')).toBe('ABcd')
|
||||
expect(mask.masked('ABCD')).toBe('ABcd')
|
||||
expect(mask.masked('1AB2CD')).toBe('ABcd')
|
||||
|
||||
expect(mask.unmasked('1AB2CD')).toBe('ABcd')
|
||||
})
|
||||
|
||||
test('IP mask', () => {
|
||||
const mask = new Mask({
|
||||
mask: '#00.#00.#00.#00',
|
||||
tokens: {
|
||||
0: { pattern: /[\d]/, optional: true }
|
||||
}
|
||||
})
|
||||
|
||||
expect(mask.masked('127.0.0.1')).toBe('127.0.0.1')
|
||||
expect(mask.masked('254254254254')).toBe('254.254.254.254')
|
||||
expect(mask.masked('1.23.456.7890')).toBe('1.23.456.789')
|
||||
expect(mask.masked('a1.23.456.7890')).toBe('1.23.456.789')
|
||||
|
||||
expect(mask.unmasked('a254.254.254.254')).toBe('254254254254')
|
||||
})
|
||||
|
||||
test('repeated simple mask', () => {
|
||||
const mask = new Mask({
|
||||
mask: '9',
|
||||
tokens: {
|
||||
9: { pattern: /[\d]/, repeated: true }
|
||||
}
|
||||
})
|
||||
|
||||
expect(mask.masked('1')).toBe('1')
|
||||
expect(mask.masked('12')).toBe('12')
|
||||
expect(mask.masked('12 ')).toBe('12')
|
||||
|
||||
expect(mask.unmasked('a12')).toBe('12')
|
||||
})
|
||||
|
||||
test('repeated 99.9 mask', () => {
|
||||
const mask = new Mask({
|
||||
mask: '99.9',
|
||||
tokens: {
|
||||
9: { pattern: /[\d]/, repeated: true }
|
||||
}
|
||||
})
|
||||
|
||||
expect(mask.masked('12')).toBe('12')
|
||||
expect(mask.masked('123')).toBe('12.3')
|
||||
expect(mask.masked('1234')).toBe('12.34')
|
||||
expect(mask.masked('12345')).toBe('12.345')
|
||||
expect(mask.masked('123456')).toBe('12.345.6')
|
||||
expect(mask.masked('1234567')).toBe('12.345.67')
|
||||
expect(mask.masked('12345678')).toBe('12.345.678')
|
||||
expect(mask.masked('123456789')).toBe('12.345.678.9')
|
||||
expect(mask.masked('a123456789')).toBe('12.345.678.9')
|
||||
|
||||
expect(mask.unmasked('a123456789')).toBe('123456789')
|
||||
})
|
||||
|
||||
test('repeated 99.9 eager mask', () => {
|
||||
const mask = new Mask({
|
||||
mask: '99.9',
|
||||
eager: true,
|
||||
tokens: {
|
||||
9: { pattern: /[\d]/, repeated: true }
|
||||
}
|
||||
})
|
||||
|
||||
expect(mask.masked('12')).toBe('12.')
|
||||
expect(mask.masked('123')).toBe('12.3')
|
||||
expect(mask.masked('1234')).toBe('12.34')
|
||||
expect(mask.masked('12345')).toBe('12.345.')
|
||||
expect(mask.masked('123456')).toBe('12.345.6')
|
||||
expect(mask.masked('1234567')).toBe('12.345.67')
|
||||
expect(mask.masked('12345678')).toBe('12.345.678.')
|
||||
expect(mask.masked('123456789')).toBe('12.345.678.9')
|
||||
|
||||
expect(mask.unmasked('123456789')).toBe('123456789')
|
||||
})
|
||||
|
||||
test('#-## reversed mask', () => {
|
||||
const mask = new Mask({ mask: '#-##', reversed: true })
|
||||
|
||||
expect(mask.masked('1')).toBe('1')
|
||||
expect(mask.masked('12')).toBe('12')
|
||||
expect(mask.masked('123')).toBe('1-23')
|
||||
expect(mask.masked('1234')).toBe('2-34')
|
||||
expect(mask.masked('a1234')).toBe('2-34')
|
||||
|
||||
expect(mask.unmasked('a1234')).toBe('234')
|
||||
})
|
||||
|
||||
test('#-## reversed eager mask', () => {
|
||||
const mask = new Mask({ mask: '#-##', reversed: true, eager: true })
|
||||
|
||||
expect(mask.masked('1')).toBe('1')
|
||||
expect(mask.masked('12')).toBe('-12')
|
||||
expect(mask.masked('123')).toBe('1-23')
|
||||
expect(mask.masked('1234')).toBe('2-34')
|
||||
expect(mask.masked('a1234')).toBe('2-34')
|
||||
|
||||
expect(mask.unmasked('a1234')).toBe('234')
|
||||
})
|
||||
|
||||
test('repeated reversed mask', () => {
|
||||
const mask = new Mask({
|
||||
mask: '9 99#,##',
|
||||
reversed: true,
|
||||
tokens: {
|
||||
9: { pattern: /[\d]/, repeated: true }
|
||||
}
|
||||
})
|
||||
|
||||
expect(mask.masked('12')).toBe('12')
|
||||
expect(mask.masked('123')).toBe('1,23')
|
||||
expect(mask.masked('1234')).toBe('12,34')
|
||||
expect(mask.masked('12345')).toBe('123,45')
|
||||
expect(mask.masked('123456')).toBe('1 234,56')
|
||||
expect(mask.masked('1234567')).toBe('12 345,67')
|
||||
expect(mask.masked('12345678')).toBe('123 456,78')
|
||||
expect(mask.masked('123456789')).toBe('1 234 567,89')
|
||||
|
||||
expect(mask.unmasked('123456789')).toBe('123456789')
|
||||
})
|
||||
|
||||
test('repeated reversed eager mask', () => {
|
||||
const mask = new Mask({
|
||||
mask: '9 99#,##',
|
||||
reversed: true,
|
||||
eager: true,
|
||||
tokens: {
|
||||
9: { pattern: /[\d]/, repeated: true }
|
||||
}
|
||||
})
|
||||
|
||||
expect(mask.masked('1')).toBe('1')
|
||||
expect(mask.masked('12')).toBe(',12')
|
||||
expect(mask.masked('123')).toBe('1,23')
|
||||
expect(mask.masked('1234')).toBe('12,34')
|
||||
expect(mask.masked('12345')).toBe(' 123,45')
|
||||
expect(mask.masked('123456')).toBe('1 234,56')
|
||||
expect(mask.masked('1234567')).toBe('12 345,67')
|
||||
expect(mask.masked('12345678')).toBe(' 123 456,78')
|
||||
expect(mask.masked('123456789')).toBe('1 234 567,89')
|
||||
|
||||
expect(mask.unmasked('123456789')).toBe('123456789')
|
||||
})
|
||||
|
||||
test('multiple numbers mask', () => {
|
||||
const mask = new Mask({
|
||||
mask: '+ +',
|
||||
tokens: { '+': { pattern: /\d/, multiple: true } }
|
||||
})
|
||||
|
||||
expect(mask.masked('1')).toBe('1')
|
||||
expect(mask.masked('1 2')).toBe('1 2')
|
||||
expect(mask.masked('1 2 3')).toBe('1 23')
|
||||
expect(mask.masked('12')).toBe('12')
|
||||
expect(mask.masked('12 ')).toBe('12 ')
|
||||
expect(mask.masked('12 3')).toBe('12 3')
|
||||
expect(mask.masked('12 34')).toBe('12 34')
|
||||
expect(mask.masked('12 34 ')).toBe('12 34')
|
||||
expect(mask.masked('12 34 5')).toBe('12 345')
|
||||
expect(mask.masked('a12 34 5')).toBe('12 345')
|
||||
expect(mask.masked('12.34.5')).toBe('12 345')
|
||||
|
||||
expect(mask.unmasked('a1 2 3')).toBe('123')
|
||||
expect(mask.unmasked('12 3')).toBe('123')
|
||||
expect(mask.unmasked('12 34 5')).toBe('12345')
|
||||
})
|
||||
|
||||
test('multiple letters mask', () => {
|
||||
const mask = new Mask({
|
||||
mask: '+ +',
|
||||
tokens: { '+': { pattern: /[a-zA-Z]/, multiple: true } }
|
||||
})
|
||||
|
||||
expect(mask.masked('a')).toBe('a')
|
||||
expect(mask.masked('ab')).toBe('ab')
|
||||
expect(mask.masked('a b')).toBe('a b')
|
||||
expect(mask.masked('a b с')).toBe('a b')
|
||||
expect(mask.masked('ab ')).toBe('ab ')
|
||||
expect(mask.masked('ab c')).toBe('ab c')
|
||||
expect(mask.masked('ab cd')).toBe('ab cd')
|
||||
expect(mask.masked('ab cd ')).toBe('ab cd')
|
||||
expect(mask.masked('ab cd e')).toBe('ab cde')
|
||||
expect(mask.masked('1ab cd e')).toBe('ab cde')
|
||||
expect(mask.masked('ab.cd.e')).toBe('ab cde')
|
||||
|
||||
expect(mask.unmasked('1a b c')).toBe('abc')
|
||||
expect(mask.unmasked('ab c')).toBe('abc')
|
||||
expect(mask.unmasked('ab cd e')).toBe('abcde')
|
||||
})
|
||||
|
||||
test('dynamic empty mask', () => {
|
||||
const mask = new Mask({ mask: [] })
|
||||
|
||||
expect(mask.masked('1')).toBe('')
|
||||
})
|
||||
|
||||
test('dynamic single mask', () => {
|
||||
const mask = new Mask({ mask: ['#-#'] })
|
||||
|
||||
expect(mask.masked('123')).toBe('1-2')
|
||||
expect(mask.unmasked('123')).toBe('12')
|
||||
})
|
||||
|
||||
test('dynamic mask', () => {
|
||||
const mask = new Mask({ mask: ['###.###.###-##', '##.###.###/####-##'] })
|
||||
|
||||
expect(mask.masked('12345678901')).toBe('123.456.789-01')
|
||||
expect(mask.masked('123456789012')).toBe('12.345.678/9012')
|
||||
expect(mask.masked('12345678901234')).toBe('12.345.678/9012-34')
|
||||
expect(mask.masked('a123456789012345')).toBe('12.345.678/9012-34')
|
||||
|
||||
expect(mask.unmasked('a123456789012345')).toBe('12345678901234')
|
||||
|
||||
expect(mask.completed('12345678901')).toBe(false)
|
||||
expect(mask.completed('12345678901234')).toBe(true)
|
||||
})
|
||||
|
||||
test('dynamic function mask', () => {
|
||||
const mask = new Mask({
|
||||
mask: (value) => (value.startsWith('1') ? '#-#--#' : '## ##')
|
||||
})
|
||||
|
||||
expect(mask.masked('12')).toBe('1-2')
|
||||
expect(mask.masked('1234')).toBe('1-2--3')
|
||||
expect(mask.masked('23')).toBe('23')
|
||||
expect(mask.masked('23456')).toBe('23 45')
|
||||
expect(mask.masked('a23456')).toBe('23 45')
|
||||
|
||||
expect(mask.unmasked('a123')).toBe('123')
|
||||
expect(mask.unmasked('a2345')).toBe('2345')
|
||||
|
||||
expect(mask.completed('12')).toBe(false)
|
||||
expect(mask.completed('123')).toBe(true)
|
||||
expect(mask.completed('234')).toBe(false)
|
||||
expect(mask.completed('2345')).toBe(true)
|
||||
})
|
||||
|
||||
test('dynamic escaped mask', () => {
|
||||
const mask = new Mask({ mask: ['!###', '!###-##', '!###.##.##'] })
|
||||
|
||||
expect(mask.masked('12')).toBe('#12')
|
||||
expect(mask.masked('1234')).toBe('#12-34')
|
||||
expect(mask.masked('12345')).toBe('#12.34.5')
|
||||
expect(mask.masked('1234567')).toBe('#12.34.56')
|
||||
})
|
||||
|
||||
test('tokens replaced', () => {
|
||||
const mask = new Mask({
|
||||
mask: 'Z-#',
|
||||
tokens: { Z: { pattern: /[0-9]/ } },
|
||||
tokensReplace: true
|
||||
})
|
||||
|
||||
expect(mask.masked('1')).toBe('1')
|
||||
expect(mask.masked('12')).toBe('1-#')
|
||||
expect(mask.masked('123')).toBe('1-#')
|
||||
expect(mask.masked('1-#')).toBe('1-#')
|
||||
|
||||
expect(mask.unmasked('12')).toBe('1')
|
||||
})
|
||||
@@ -0,0 +1,67 @@
|
||||
import { expect, test } from 'vitest'
|
||||
|
||||
import { parseMask, parseOpts, parseTokens } from '../src/parser'
|
||||
|
||||
test('mask: empty', () => {
|
||||
expect(parseMask('')).toBe('')
|
||||
})
|
||||
|
||||
test('mask: string', () => {
|
||||
expect(parseMask('#-#')).toBe('#-#')
|
||||
})
|
||||
|
||||
test('mask: array', () => {
|
||||
expect(parseMask('["#", "##"]')).toEqual(expect.arrayContaining(['#', '##']))
|
||||
})
|
||||
|
||||
test('opts: empty', () => {
|
||||
expect(parseOpts('')).toBe(true)
|
||||
})
|
||||
|
||||
test('opts: true', () => {
|
||||
expect(parseOpts('true')).toBe(true)
|
||||
})
|
||||
|
||||
test('opts: truthy', () => {
|
||||
expect(parseOpts('1')).toBe(true)
|
||||
})
|
||||
|
||||
test('opts: false', () => {
|
||||
expect(parseOpts('false')).toBe(false)
|
||||
})
|
||||
|
||||
test('opts: falsy', () => {
|
||||
expect(parseOpts('0')).toBe(false)
|
||||
})
|
||||
|
||||
test('tokens: json', () => {
|
||||
expect(parseTokens('{ "Z": { "pattern": "[0-9]" } }')).toEqual(
|
||||
expect.objectContaining({ Z: { pattern: '[0-9]' } })
|
||||
)
|
||||
})
|
||||
|
||||
test('tokens: code', () => {
|
||||
expect(parseTokens('Z:[0-9]')).toEqual(
|
||||
expect.objectContaining({
|
||||
Z: { pattern: /[0-9]/, multiple: false, optional: false, repeated: false }
|
||||
})
|
||||
)
|
||||
|
||||
expect(parseTokens('Z:[0-9]:multiple')).toEqual(
|
||||
expect.objectContaining({
|
||||
Z: { pattern: /[0-9]/, multiple: true, optional: false, repeated: false }
|
||||
})
|
||||
)
|
||||
|
||||
expect(parseTokens('Z:[0-9]:optional')).toEqual(
|
||||
expect.objectContaining({
|
||||
Z: { pattern: /[0-9]/, multiple: false, optional: true, repeated: false }
|
||||
})
|
||||
)
|
||||
|
||||
expect(parseTokens('Z:[0-9]:repeated')).toEqual(
|
||||
expect.objectContaining({
|
||||
Z: { pattern: /[0-9]/, multiple: false, optional: false, repeated: true }
|
||||
})
|
||||
)
|
||||
})
|
||||
@@ -0,0 +1,5 @@
|
||||
import matchers from '@testing-library/jest-dom/matchers'
|
||||
import { expect } from 'vitest'
|
||||
|
||||
// src: https://markus.oberlehner.net/blog/using-testing-library-jest-dom-with-vitest/
|
||||
expect.extend(matchers)
|
||||
Reference in New Issue
Block a user