/src/__tests__/utils.test.js

https://github.com/renato-bohler/redux-form-input-masks · JavaScript · 1415 lines · 1358 code · 53 blank · 4 comment · 8 complexity · 3a30757b9e4831763e602462f749228f MD5 · raw file

  1. import * as utils from '../utils';
  2. import defaultMaskDefinitions from '../defaultMaskDefinitions';
  3. const maskDefinitions = {
  4. A: {
  5. regExp: /[A-Za-z]/,
  6. transform: char => char.toUpperCase(),
  7. },
  8. a: {
  9. regExp: /[a-z]/,
  10. transform: char => char.toUpperCase(),
  11. },
  12. 9: {
  13. regExp: /[0-9]/,
  14. },
  15. 0: {
  16. regExp: /[0-9]/,
  17. transform: char => (Number(char) === 9 ? 0 : Number(char) + 1),
  18. },
  19. };
  20. const numericPattern = '(999) 999-9999';
  21. const mixedPattern = 'AAA-9999';
  22. const positionsPattern = '--AA-=-=-99==';
  23. const transformPattern = 'AAA-00009';
  24. const placeholder = '_';
  25. describe('escapeRegExp', () => {
  26. it('should add escape to all RegExp special characters', () => {
  27. const special = '-[]/{}()*+?.^$|';
  28. const escapedSpecial = '\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\^\\$\\|';
  29. expect(utils.escapeRegExp(special)).toBe(escapedSpecial);
  30. });
  31. });
  32. describe('countOcurrences', () => {
  33. it('should count ocurrences of substrings correctly', () => {
  34. const string = 'abc---';
  35. expect(utils.countOcurrences(string, /a/g)).toBe(1);
  36. expect(utils.countOcurrences(string, /b/g)).toBe(1);
  37. expect(utils.countOcurrences(string, /c/g)).toBe(1);
  38. expect(utils.countOcurrences(string, /d/g)).toBe(0);
  39. expect(utils.countOcurrences(string, /-/g)).toBe(3);
  40. });
  41. });
  42. describe('numberToLocaleString', () => {
  43. it('should transform a number to locale string', () => {
  44. expect(utils.numberToLocaleString(1, 'en-US', 0)).toBe('1');
  45. expect(utils.numberToLocaleString(1234, 'en-US', 0)).toBe('1,234');
  46. expect(utils.numberToLocaleString(1234.56, 'en-US', 0)).toBe('1,235');
  47. expect(utils.numberToLocaleString(1234.56, 'en-US', 2)).toBe('1,234.56');
  48. expect(utils.numberToLocaleString(1234.56, 'en-US', 1)).toBe('1,234.6');
  49. });
  50. });
  51. describe('getMaskDefinition', () => {
  52. it('should return the mask definition for a given char', () => {
  53. expect(utils.getMaskDefinition('A', maskDefinitions)).toBe(
  54. maskDefinitions['A'],
  55. );
  56. expect(utils.getMaskDefinition('a', maskDefinitions)).toBe(
  57. maskDefinitions['a'],
  58. );
  59. expect(utils.getMaskDefinition('9', maskDefinitions)).toBe(
  60. maskDefinitions['9'],
  61. );
  62. });
  63. });
  64. describe('applyMask', () => {
  65. it('should apply mask to complete and correct stripped values', () => {
  66. expect(
  67. utils.applyMask(
  68. 'ABC0123',
  69. mixedPattern,
  70. placeholder,
  71. true,
  72. false,
  73. maskDefinitions,
  74. ),
  75. ).toBe('ABC-0123');
  76. expect(
  77. utils.applyMask(
  78. 'ABC0123',
  79. mixedPattern,
  80. placeholder,
  81. false,
  82. false,
  83. maskDefinitions,
  84. ),
  85. ).toBe('ABC-0123');
  86. expect(
  87. utils.applyMask(
  88. '0123456789',
  89. numericPattern,
  90. placeholder,
  91. true,
  92. false,
  93. maskDefinitions,
  94. ),
  95. ).toBe('(012) 345-6789');
  96. expect(
  97. utils.applyMask(
  98. '0123456789',
  99. numericPattern,
  100. placeholder,
  101. false,
  102. false,
  103. maskDefinitions,
  104. ),
  105. ).toBe('(012) 345-6789');
  106. });
  107. it('should apply mask to incomplete and correct stripped values', () => {
  108. expect(
  109. utils.applyMask(
  110. '',
  111. mixedPattern,
  112. placeholder,
  113. false,
  114. false,
  115. maskDefinitions,
  116. ),
  117. ).toBe('');
  118. expect(
  119. utils.applyMask(
  120. '',
  121. numericPattern,
  122. placeholder,
  123. true,
  124. false,
  125. maskDefinitions,
  126. ),
  127. ).toBe('(___) ___-____');
  128. expect(
  129. utils.applyMask(
  130. '9',
  131. numericPattern,
  132. placeholder,
  133. true,
  134. false,
  135. maskDefinitions,
  136. ),
  137. ).toBe('(9__) ___-____');
  138. expect(
  139. utils.applyMask(
  140. '9876',
  141. numericPattern,
  142. placeholder,
  143. true,
  144. false,
  145. maskDefinitions,
  146. ),
  147. ).toBe('(987) 6__-____');
  148. expect(
  149. utils.applyMask(
  150. '9876543',
  151. numericPattern,
  152. placeholder,
  153. true,
  154. false,
  155. maskDefinitions,
  156. ),
  157. ).toBe('(987) 654-3___');
  158. expect(
  159. utils.applyMask(
  160. '',
  161. numericPattern,
  162. placeholder,
  163. false,
  164. false,
  165. maskDefinitions,
  166. ),
  167. ).toBe('(');
  168. expect(
  169. utils.applyMask(
  170. '9',
  171. numericPattern,
  172. placeholder,
  173. false,
  174. false,
  175. maskDefinitions,
  176. ),
  177. ).toBe('(9');
  178. expect(
  179. utils.applyMask(
  180. '9876',
  181. numericPattern,
  182. placeholder,
  183. false,
  184. false,
  185. maskDefinitions,
  186. ),
  187. ).toBe('(987) 6');
  188. expect(
  189. utils.applyMask(
  190. '9876543',
  191. numericPattern,
  192. placeholder,
  193. false,
  194. false,
  195. maskDefinitions,
  196. ),
  197. ).toBe('(987) 654-3');
  198. });
  199. it('should apply mask to incorrect stripped values', () => {
  200. expect(
  201. utils.applyMask(
  202. '1',
  203. mixedPattern,
  204. placeholder,
  205. true,
  206. false,
  207. maskDefinitions,
  208. ),
  209. ).toBe('___-____');
  210. expect(
  211. utils.applyMask(
  212. '$234567',
  213. mixedPattern,
  214. placeholder,
  215. true,
  216. false,
  217. maskDefinitions,
  218. ),
  219. ).toBe('___-____');
  220. expect(
  221. utils.applyMask(
  222. 'ABC$?45',
  223. mixedPattern,
  224. placeholder,
  225. true,
  226. false,
  227. maskDefinitions,
  228. ),
  229. ).toBe('ABC-____');
  230. expect(
  231. utils.applyMask(
  232. '1',
  233. mixedPattern,
  234. placeholder,
  235. false,
  236. false,
  237. maskDefinitions,
  238. ),
  239. ).toBe('');
  240. expect(
  241. utils.applyMask(
  242. '$234567',
  243. mixedPattern,
  244. placeholder,
  245. false,
  246. false,
  247. maskDefinitions,
  248. ),
  249. ).toBe('');
  250. expect(
  251. utils.applyMask(
  252. 'ABC$?45',
  253. mixedPattern,
  254. placeholder,
  255. false,
  256. false,
  257. maskDefinitions,
  258. ),
  259. ).toBe('ABC-');
  260. expect(
  261. utils.applyMask(
  262. 'a',
  263. numericPattern,
  264. placeholder,
  265. true,
  266. false,
  267. maskDefinitions,
  268. ),
  269. ).toBe('(___) ___-____');
  270. expect(
  271. utils.applyMask(
  272. '012345$678',
  273. numericPattern,
  274. placeholder,
  275. true,
  276. false,
  277. maskDefinitions,
  278. ),
  279. ).toBe('(012) 345-____');
  280. expect(
  281. utils.applyMask(
  282. 'a',
  283. numericPattern,
  284. placeholder,
  285. false,
  286. false,
  287. maskDefinitions,
  288. ),
  289. ).toBe('(');
  290. expect(
  291. utils.applyMask(
  292. '012345$678',
  293. numericPattern,
  294. placeholder,
  295. false,
  296. false,
  297. maskDefinitions,
  298. ),
  299. ).toBe('(012) 345-');
  300. });
  301. it('should apply mask to overflowing stripped values', () => {
  302. expect(
  303. utils.applyMask(
  304. 'ABC12345',
  305. mixedPattern,
  306. placeholder,
  307. true,
  308. false,
  309. maskDefinitions,
  310. ),
  311. ).toBe('ABC-1234');
  312. expect(
  313. utils.applyMask(
  314. 'ABC1234*',
  315. mixedPattern,
  316. placeholder,
  317. true,
  318. false,
  319. maskDefinitions,
  320. ),
  321. ).toBe('ABC-1234');
  322. expect(
  323. utils.applyMask(
  324. '01234567891',
  325. numericPattern,
  326. placeholder,
  327. true,
  328. false,
  329. maskDefinitions,
  330. ),
  331. ).toBe('(012) 345-6789');
  332. expect(
  333. utils.applyMask(
  334. '0123456789+',
  335. numericPattern,
  336. placeholder,
  337. true,
  338. false,
  339. maskDefinitions,
  340. ),
  341. ).toBe('(012) 345-6789');
  342. });
  343. it('should show the guide even if allowEmpty is set', () => {
  344. expect(
  345. utils.applyMask(
  346. '',
  347. numericPattern,
  348. placeholder,
  349. true,
  350. true,
  351. maskDefinitions,
  352. ),
  353. ).toBe('(___) ___-____');
  354. expect(
  355. utils.applyMask(
  356. undefined,
  357. numericPattern,
  358. placeholder,
  359. true,
  360. true,
  361. maskDefinitions,
  362. ),
  363. ).toBe('(___) ___-____');
  364. expect(
  365. utils.applyMask(
  366. null,
  367. numericPattern,
  368. placeholder,
  369. true,
  370. true,
  371. maskDefinitions,
  372. ),
  373. ).toBe('(___) ___-____');
  374. });
  375. it('should return an empty string if the value is empty and allowEmpty is set', () => {
  376. expect(
  377. utils.applyMask(
  378. '',
  379. numericPattern,
  380. placeholder,
  381. false,
  382. true,
  383. maskDefinitions,
  384. ),
  385. ).toBe('');
  386. expect(
  387. utils.applyMask(
  388. undefined,
  389. numericPattern,
  390. placeholder,
  391. false,
  392. true,
  393. maskDefinitions,
  394. ),
  395. ).toBe('');
  396. expect(
  397. utils.applyMask(
  398. null,
  399. numericPattern,
  400. placeholder,
  401. false,
  402. true,
  403. maskDefinitions,
  404. ),
  405. ).toBe('');
  406. });
  407. });
  408. describe('maskStrip', () => {
  409. it('should strip complete and correct formatted values', () => {
  410. expect(
  411. utils.maskStrip('ABC-1234', mixedPattern, placeholder, maskDefinitions),
  412. ).toBe('ABC1234');
  413. expect(
  414. utils.maskStrip(
  415. '(012) 345-6789',
  416. numericPattern,
  417. placeholder,
  418. maskDefinitions,
  419. ),
  420. ).toBe('0123456789');
  421. });
  422. it('should strip incomplete and correct formatted values', () => {
  423. expect(
  424. utils.maskStrip('', mixedPattern, placeholder, maskDefinitions),
  425. ).toBe('');
  426. expect(
  427. utils.maskStrip('___-____', mixedPattern, placeholder, maskDefinitions),
  428. ).toBe('');
  429. expect(
  430. utils.maskStrip('1__-____', mixedPattern, placeholder, maskDefinitions),
  431. ).toBe('');
  432. expect(
  433. utils.maskStrip('___-__1_', mixedPattern, placeholder, maskDefinitions),
  434. ).toBe('');
  435. expect(
  436. utils.maskStrip('ABC-12__', mixedPattern, placeholder, maskDefinitions),
  437. ).toBe('ABC12');
  438. expect(
  439. utils.maskStrip('ABC-12', mixedPattern, placeholder, maskDefinitions),
  440. ).toBe('ABC12');
  441. expect(
  442. utils.maskStrip('', numericPattern, placeholder, maskDefinitions),
  443. ).toBe('');
  444. expect(
  445. utils.maskStrip(
  446. '(___) ___-____',
  447. numericPattern,
  448. placeholder,
  449. maskDefinitions,
  450. ),
  451. ).toBe('');
  452. expect(
  453. utils.maskStrip(
  454. '(___) ___-__1_',
  455. numericPattern,
  456. placeholder,
  457. maskDefinitions,
  458. ),
  459. ).toBe('');
  460. expect(
  461. utils.maskStrip(
  462. '(A__) ___-____',
  463. numericPattern,
  464. placeholder,
  465. maskDefinitions,
  466. ),
  467. ).toBe('');
  468. expect(
  469. utils.maskStrip(
  470. '(012) 345-',
  471. numericPattern,
  472. placeholder,
  473. maskDefinitions,
  474. ),
  475. ).toBe('012345');
  476. expect(
  477. utils.maskStrip(
  478. '(012) 345-____',
  479. numericPattern,
  480. placeholder,
  481. maskDefinitions,
  482. ),
  483. ).toBe('012345');
  484. });
  485. it('should strip overflowing formatted values', () => {
  486. expect(
  487. utils.maskStrip('ABC-12345', mixedPattern, placeholder, maskDefinitions),
  488. ).toBe('ABC1234');
  489. expect(
  490. utils.maskStrip(
  491. '(012) 345-67890',
  492. numericPattern,
  493. placeholder,
  494. maskDefinitions,
  495. ),
  496. ).toBe('0123456789');
  497. });
  498. });
  499. describe('inputReformat', () => {
  500. it('should handle user input for guided masks', () => {
  501. expect(
  502. utils.inputReformat(
  503. '___-____',
  504. mixedPattern,
  505. placeholder,
  506. true,
  507. false,
  508. maskDefinitions,
  509. ),
  510. ).toBe('___-____');
  511. expect(
  512. utils.inputReformat(
  513. 'A___-____',
  514. mixedPattern,
  515. placeholder,
  516. true,
  517. false,
  518. maskDefinitions,
  519. ),
  520. ).toBe('A__-____');
  521. expect(
  522. utils.inputReformat(
  523. 'ABC1-____',
  524. mixedPattern,
  525. placeholder,
  526. true,
  527. false,
  528. maskDefinitions,
  529. ),
  530. ).toBe('ABC-1___');
  531. expect(
  532. utils.inputReformat(
  533. 'ABC-1____',
  534. mixedPattern,
  535. placeholder,
  536. true,
  537. false,
  538. maskDefinitions,
  539. ),
  540. ).toBe('ABC-1___');
  541. expect(
  542. utils.inputReformat(
  543. 'ABC-1234_',
  544. mixedPattern,
  545. placeholder,
  546. true,
  547. false,
  548. maskDefinitions,
  549. ),
  550. ).toBe('ABC-1234');
  551. expect(
  552. utils.inputReformat(
  553. '',
  554. mixedPattern,
  555. placeholder,
  556. true,
  557. false,
  558. maskDefinitions,
  559. ),
  560. ).toBe('___-____');
  561. expect(
  562. utils.inputReformat(
  563. 'A',
  564. mixedPattern,
  565. placeholder,
  566. true,
  567. false,
  568. maskDefinitions,
  569. ),
  570. ).toBe('A__-____');
  571. expect(
  572. utils.inputReformat(
  573. 'ABC-1',
  574. mixedPattern,
  575. placeholder,
  576. true,
  577. false,
  578. maskDefinitions,
  579. ),
  580. ).toBe('ABC-1___');
  581. expect(
  582. utils.inputReformat(
  583. 'ABC-1234_',
  584. mixedPattern,
  585. placeholder,
  586. true,
  587. false,
  588. maskDefinitions,
  589. ),
  590. ).toBe('ABC-1234');
  591. expect(
  592. utils.inputReformat(
  593. '(___) ___-____',
  594. numericPattern,
  595. placeholder,
  596. true,
  597. false,
  598. maskDefinitions,
  599. ),
  600. ).toBe('(___) ___-____');
  601. expect(
  602. utils.inputReformat(
  603. '0(___) ___-____',
  604. numericPattern,
  605. placeholder,
  606. true,
  607. false,
  608. maskDefinitions,
  609. ),
  610. ).toBe('(0__) ___-____');
  611. expect(
  612. utils.inputReformat(
  613. '(0___) ___-____',
  614. numericPattern,
  615. placeholder,
  616. true,
  617. false,
  618. maskDefinitions,
  619. ),
  620. ).toBe('(0__) ___-____');
  621. expect(
  622. utils.inputReformat(
  623. '(01__) ___-____',
  624. numericPattern,
  625. placeholder,
  626. true,
  627. false,
  628. maskDefinitions,
  629. ),
  630. ).toBe('(01_) ___-____');
  631. expect(
  632. utils.inputReformat(
  633. '(012_) ___-____',
  634. numericPattern,
  635. placeholder,
  636. true,
  637. false,
  638. maskDefinitions,
  639. ),
  640. ).toBe('(012) ___-____');
  641. expect(
  642. utils.inputReformat(
  643. '(0123) ___-____',
  644. numericPattern,
  645. placeholder,
  646. true,
  647. false,
  648. maskDefinitions,
  649. ),
  650. ).toBe('(012) 3__-____');
  651. expect(
  652. utils.inputReformat(
  653. '(012)3 ___-____',
  654. numericPattern,
  655. placeholder,
  656. true,
  657. false,
  658. maskDefinitions,
  659. ),
  660. ).toBe('(012) 3__-____');
  661. expect(
  662. utils.inputReformat(
  663. '(012) 3___-____',
  664. numericPattern,
  665. placeholder,
  666. true,
  667. false,
  668. maskDefinitions,
  669. ),
  670. ).toBe('(012) 3__-____');
  671. expect(
  672. utils.inputReformat(
  673. '(012) 3456-____',
  674. numericPattern,
  675. placeholder,
  676. true,
  677. false,
  678. maskDefinitions,
  679. ),
  680. ).toBe('(012) 345-6___');
  681. expect(
  682. utils.inputReformat(
  683. '(012) 345-6789_',
  684. numericPattern,
  685. placeholder,
  686. true,
  687. false,
  688. maskDefinitions,
  689. ),
  690. ).toBe('(012) 345-6789');
  691. expect(
  692. utils.inputReformat(
  693. '',
  694. numericPattern,
  695. placeholder,
  696. true,
  697. false,
  698. maskDefinitions,
  699. ),
  700. ).toBe('(___) ___-____');
  701. expect(
  702. utils.inputReformat(
  703. '(0',
  704. numericPattern,
  705. placeholder,
  706. true,
  707. false,
  708. maskDefinitions,
  709. ),
  710. ).toBe('(0__) ___-____');
  711. expect(
  712. utils.inputReformat(
  713. '(0123) ___-____',
  714. numericPattern,
  715. placeholder,
  716. true,
  717. false,
  718. maskDefinitions,
  719. ),
  720. ).toBe('(012) 3__-____');
  721. expect(
  722. utils.inputReformat(
  723. '(012)3 ___-____',
  724. numericPattern,
  725. placeholder,
  726. true,
  727. false,
  728. maskDefinitions,
  729. ),
  730. ).toBe('(012) 3__-____');
  731. expect(
  732. utils.inputReformat(
  733. '(012) 3___-____',
  734. numericPattern,
  735. placeholder,
  736. true,
  737. false,
  738. maskDefinitions,
  739. ),
  740. ).toBe('(012) 3__-____');
  741. });
  742. it('should handle user input for non guided masks', () => {
  743. expect(
  744. utils.inputReformat(
  745. '',
  746. mixedPattern,
  747. placeholder,
  748. false,
  749. false,
  750. maskDefinitions,
  751. ),
  752. ).toBe('');
  753. expect(
  754. utils.inputReformat(
  755. 'A',
  756. mixedPattern,
  757. placeholder,
  758. false,
  759. false,
  760. maskDefinitions,
  761. ),
  762. ).toBe('A');
  763. expect(
  764. utils.inputReformat(
  765. 'ABC',
  766. mixedPattern,
  767. placeholder,
  768. false,
  769. false,
  770. maskDefinitions,
  771. ),
  772. ).toBe('ABC-');
  773. expect(
  774. utils.inputReformat(
  775. 'ABC1-',
  776. mixedPattern,
  777. placeholder,
  778. false,
  779. false,
  780. maskDefinitions,
  781. ),
  782. ).toBe('ABC-1');
  783. expect(
  784. utils.inputReformat(
  785. 'ABC-1',
  786. mixedPattern,
  787. placeholder,
  788. false,
  789. false,
  790. maskDefinitions,
  791. ),
  792. ).toBe('ABC-1');
  793. expect(
  794. utils.inputReformat(
  795. 'ABC-1234',
  796. mixedPattern,
  797. placeholder,
  798. false,
  799. false,
  800. maskDefinitions,
  801. ),
  802. ).toBe('ABC-1234');
  803. expect(
  804. utils.inputReformat(
  805. '(',
  806. numericPattern,
  807. placeholder,
  808. false,
  809. false,
  810. maskDefinitions,
  811. ),
  812. ).toBe('(');
  813. expect(
  814. utils.inputReformat(
  815. '0(',
  816. numericPattern,
  817. placeholder,
  818. false,
  819. false,
  820. maskDefinitions,
  821. ),
  822. ).toBe('(0');
  823. expect(
  824. utils.inputReformat(
  825. '(0',
  826. numericPattern,
  827. placeholder,
  828. false,
  829. false,
  830. maskDefinitions,
  831. ),
  832. ).toBe('(0');
  833. expect(
  834. utils.inputReformat(
  835. '(01',
  836. numericPattern,
  837. placeholder,
  838. false,
  839. false,
  840. maskDefinitions,
  841. ),
  842. ).toBe('(01');
  843. expect(
  844. utils.inputReformat(
  845. '(012',
  846. numericPattern,
  847. placeholder,
  848. false,
  849. false,
  850. maskDefinitions,
  851. ),
  852. ).toBe('(012) ');
  853. expect(
  854. utils.inputReformat(
  855. '(0123',
  856. numericPattern,
  857. placeholder,
  858. false,
  859. false,
  860. maskDefinitions,
  861. ),
  862. ).toBe('(012) 3');
  863. expect(
  864. utils.inputReformat(
  865. '(012)3',
  866. numericPattern,
  867. placeholder,
  868. false,
  869. false,
  870. maskDefinitions,
  871. ),
  872. ).toBe('(012) 3');
  873. expect(
  874. utils.inputReformat(
  875. '(012) 3',
  876. numericPattern,
  877. placeholder,
  878. false,
  879. false,
  880. maskDefinitions,
  881. ),
  882. ).toBe('(012) 3');
  883. expect(
  884. utils.inputReformat(
  885. '(012) 345',
  886. numericPattern,
  887. placeholder,
  888. false,
  889. false,
  890. maskDefinitions,
  891. ),
  892. ).toBe('(012) 345-');
  893. expect(
  894. utils.inputReformat(
  895. '(012) 3456-',
  896. numericPattern,
  897. placeholder,
  898. false,
  899. false,
  900. maskDefinitions,
  901. ),
  902. ).toBe('(012) 345-6');
  903. expect(
  904. utils.inputReformat(
  905. '(012) 345-6',
  906. numericPattern,
  907. placeholder,
  908. false,
  909. false,
  910. maskDefinitions,
  911. ),
  912. ).toBe('(012) 345-6');
  913. expect(
  914. utils.inputReformat(
  915. '(012) 345-6789',
  916. numericPattern,
  917. placeholder,
  918. false,
  919. false,
  920. maskDefinitions,
  921. ),
  922. ).toBe('(012) 345-6789');
  923. expect(
  924. utils.inputReformat(
  925. '',
  926. numericPattern,
  927. placeholder,
  928. false,
  929. false,
  930. maskDefinitions,
  931. ),
  932. ).toBe('(');
  933. expect(
  934. utils.inputReformat(
  935. '(0',
  936. numericPattern,
  937. placeholder,
  938. false,
  939. false,
  940. maskDefinitions,
  941. ),
  942. ).toBe('(0');
  943. expect(
  944. utils.inputReformat(
  945. '(0123)',
  946. numericPattern,
  947. placeholder,
  948. false,
  949. false,
  950. maskDefinitions,
  951. ),
  952. ).toBe('(012) 3');
  953. expect(
  954. utils.inputReformat(
  955. '(012)3',
  956. numericPattern,
  957. placeholder,
  958. false,
  959. false,
  960. maskDefinitions,
  961. ),
  962. ).toBe('(012) 3');
  963. expect(
  964. utils.inputReformat(
  965. '(012) 3',
  966. numericPattern,
  967. placeholder,
  968. false,
  969. false,
  970. maskDefinitions,
  971. ),
  972. ).toBe('(012) 3');
  973. expect(
  974. utils.inputReformat(
  975. '(012) 3456-',
  976. numericPattern,
  977. placeholder,
  978. false,
  979. false,
  980. maskDefinitions,
  981. ),
  982. ).toBe('(012) 345-6');
  983. expect(
  984. utils.inputReformat(
  985. '(012) 345-6',
  986. numericPattern,
  987. placeholder,
  988. false,
  989. false,
  990. maskDefinitions,
  991. ),
  992. ).toBe('(012) 345-6');
  993. });
  994. expect(
  995. utils.inputReformat(
  996. '',
  997. numericPattern,
  998. placeholder,
  999. false,
  1000. true,
  1001. maskDefinitions,
  1002. ),
  1003. ).toBe('');
  1004. expect(
  1005. utils.inputReformat(
  1006. '0',
  1007. numericPattern,
  1008. placeholder,
  1009. false,
  1010. true,
  1011. maskDefinitions,
  1012. ),
  1013. ).toBe('(0');
  1014. });
  1015. describe('isPatternComplete', () => {
  1016. it('should return true when a pattern is completely and correctly filled', () => {
  1017. expect(
  1018. utils.isPatternComplete('ABC-1234', mixedPattern, maskDefinitions),
  1019. ).toBe(true);
  1020. expect(
  1021. utils.isPatternComplete(
  1022. '(012) 345-6789',
  1023. numericPattern,
  1024. maskDefinitions,
  1025. ),
  1026. ).toBe(true);
  1027. });
  1028. it('should return false when a pattern is not completely and correctly filled', () => {
  1029. expect(utils.isPatternComplete('', mixedPattern, maskDefinitions)).toBe(
  1030. false,
  1031. );
  1032. expect(
  1033. utils.isPatternComplete('___-____', mixedPattern, maskDefinitions),
  1034. ).toBe(false);
  1035. expect(utils.isPatternComplete('ABC-', mixedPattern, maskDefinitions)).toBe(
  1036. false,
  1037. );
  1038. expect(
  1039. utils.isPatternComplete('ABC-____', mixedPattern, maskDefinitions),
  1040. ).toBe(false);
  1041. expect(
  1042. utils.isPatternComplete('ABC-123', mixedPattern, maskDefinitions),
  1043. ).toBe(false);
  1044. expect(
  1045. utils.isPatternComplete('ABC!1234', mixedPattern, maskDefinitions),
  1046. ).toBe(false);
  1047. expect(
  1048. utils.isPatternComplete(
  1049. '(0__) ___-____',
  1050. numericPattern,
  1051. maskDefinitions,
  1052. ),
  1053. ).toBe(false);
  1054. expect(utils.isPatternComplete('(0', numericPattern, maskDefinitions)).toBe(
  1055. false,
  1056. );
  1057. expect(
  1058. utils.isPatternComplete(
  1059. '(012] 345-6789',
  1060. numericPattern,
  1061. maskDefinitions,
  1062. ),
  1063. ).toBe(false);
  1064. });
  1065. });
  1066. describe('validCaretPositions', () => {
  1067. it('should return all valid caret positions for any pattern', () => {
  1068. // AAA-9999: all positions are valid
  1069. expect(utils.validCaretPositions(mixedPattern, maskDefinitions)).toEqual([
  1070. 0,
  1071. 1,
  1072. 2,
  1073. 3,
  1074. 4,
  1075. 5,
  1076. 6,
  1077. 7,
  1078. 8,
  1079. ]);
  1080. // |(999)| 999-9999: positions marked with pipe should be invalid
  1081. expect(utils.validCaretPositions(numericPattern, maskDefinitions)).toEqual([
  1082. 1,
  1083. 2,
  1084. 3,
  1085. 4,
  1086. 6,
  1087. 7,
  1088. 8,
  1089. 9,
  1090. 10,
  1091. 11,
  1092. 12,
  1093. 13,
  1094. 14,
  1095. ]);
  1096. // |-|-AA-|=|-|=|-99=|=|: positions marked with pipe should be invalid
  1097. // --AA-=-=-99==
  1098. expect(
  1099. utils.validCaretPositions(positionsPattern, maskDefinitions),
  1100. ).toEqual([2, 3, 4, 9, 10, 11]);
  1101. expect(utils.validCaretPositions()).toEqual([]);
  1102. expect(utils.validCaretPositions('')).toEqual([]);
  1103. expect(utils.validCaretPositions({})).toEqual([]);
  1104. });
  1105. });
  1106. describe('firstUnfilledPosition', () => {
  1107. it('should return the first unfilled position for any value', () => {
  1108. expect(
  1109. utils.firstUnfilledPosition(
  1110. '',
  1111. mixedPattern,
  1112. placeholder,
  1113. maskDefinitions,
  1114. ),
  1115. ).toBe(0);
  1116. expect(
  1117. utils.firstUnfilledPosition(
  1118. '___-____',
  1119. mixedPattern,
  1120. placeholder,
  1121. maskDefinitions,
  1122. ),
  1123. ).toBe(0);
  1124. expect(
  1125. utils.firstUnfilledPosition(
  1126. 'A__-____',
  1127. mixedPattern,
  1128. placeholder,
  1129. maskDefinitions,
  1130. ),
  1131. ).toBe(1);
  1132. expect(
  1133. utils.firstUnfilledPosition(
  1134. 'ABC-____',
  1135. mixedPattern,
  1136. placeholder,
  1137. maskDefinitions,
  1138. ),
  1139. ).toBe(4);
  1140. expect(
  1141. utils.firstUnfilledPosition(
  1142. 'ABC-1234',
  1143. mixedPattern,
  1144. placeholder,
  1145. maskDefinitions,
  1146. ),
  1147. ).toBe(8);
  1148. expect(
  1149. utils.firstUnfilledPosition(
  1150. 'A',
  1151. mixedPattern,
  1152. placeholder,
  1153. maskDefinitions,
  1154. ),
  1155. ).toBe(1);
  1156. expect(
  1157. utils.firstUnfilledPosition(
  1158. 'ABC-',
  1159. mixedPattern,
  1160. placeholder,
  1161. maskDefinitions,
  1162. ),
  1163. ).toBe(4);
  1164. expect(
  1165. utils.firstUnfilledPosition(
  1166. '(___) ___-____',
  1167. numericPattern,
  1168. placeholder,
  1169. maskDefinitions,
  1170. ),
  1171. ).toBe(1);
  1172. expect(
  1173. utils.firstUnfilledPosition(
  1174. '(0__) ___-____',
  1175. numericPattern,
  1176. placeholder,
  1177. maskDefinitions,
  1178. ),
  1179. ).toBe(2);
  1180. expect(
  1181. utils.firstUnfilledPosition(
  1182. '(012) ___-____',
  1183. numericPattern,
  1184. placeholder,
  1185. maskDefinitions,
  1186. ),
  1187. ).toBe(6);
  1188. expect(
  1189. utils.firstUnfilledPosition(
  1190. '(012) 345-____',
  1191. numericPattern,
  1192. placeholder,
  1193. maskDefinitions,
  1194. ),
  1195. ).toBe(10);
  1196. expect(
  1197. utils.firstUnfilledPosition(
  1198. '(012) 345-6789',
  1199. numericPattern,
  1200. placeholder,
  1201. maskDefinitions,
  1202. ),
  1203. ).toBe(14);
  1204. expect(
  1205. utils.firstUnfilledPosition(
  1206. '(012)',
  1207. numericPattern,
  1208. placeholder,
  1209. maskDefinitions,
  1210. ),
  1211. ).toBe(5);
  1212. expect(
  1213. utils.firstUnfilledPosition(
  1214. '(012) ',
  1215. numericPattern,
  1216. placeholder,
  1217. maskDefinitions,
  1218. ),
  1219. ).toBe(6);
  1220. expect(
  1221. utils.firstUnfilledPosition(
  1222. '(012) 345',
  1223. numericPattern,
  1224. placeholder,
  1225. maskDefinitions,
  1226. ),
  1227. ).toBe(9);
  1228. expect(
  1229. utils.firstUnfilledPosition(
  1230. '(012) 345-',
  1231. numericPattern,
  1232. placeholder,
  1233. maskDefinitions,
  1234. ),
  1235. ).toBe(10);
  1236. expect(
  1237. utils.firstUnfilledPosition(
  1238. '',
  1239. positionsPattern,
  1240. placeholder,
  1241. maskDefinitions,
  1242. ),
  1243. ).toBe(0);
  1244. expect(
  1245. utils.firstUnfilledPosition(
  1246. 'A_-=-=-__==',
  1247. positionsPattern,
  1248. placeholder,
  1249. maskDefinitions,
  1250. ),
  1251. ).toBe(1);
  1252. expect(
  1253. utils.firstUnfilledPosition(
  1254. 'AA-=-=-__==',
  1255. positionsPattern,
  1256. placeholder,
  1257. maskDefinitions,
  1258. ),
  1259. ).toBe(7);
  1260. expect(
  1261. utils.firstUnfilledPosition(
  1262. '--AA-=-=-99==',
  1263. positionsPattern,
  1264. placeholder,
  1265. maskDefinitions,
  1266. ),
  1267. ).toBe(11);
  1268. expect(
  1269. utils.firstUnfilledPosition(
  1270. 'A',
  1271. positionsPattern,
  1272. placeholder,
  1273. maskDefinitions,
  1274. ),
  1275. ).toBe(1);
  1276. expect(
  1277. utils.firstUnfilledPosition(
  1278. 'AA',
  1279. positionsPattern,
  1280. placeholder,
  1281. maskDefinitions,
  1282. ),
  1283. ).toBe(2);
  1284. });
  1285. });
  1286. describe('applyTransform', () => {
  1287. it('should apply transform to the inputted characters', () => {
  1288. const strippedTransformPattern = utils.maskStrip(
  1289. transformPattern,
  1290. transformPattern,
  1291. placeholder,
  1292. maskDefinitions,
  1293. );
  1294. expect(
  1295. utils.applyTransform('', '', strippedTransformPattern, maskDefinitions),
  1296. ).toBe('');
  1297. expect(
  1298. utils.applyTransform('a', '', strippedTransformPattern, maskDefinitions),
  1299. ).toBe('A');
  1300. expect(
  1301. utils.applyTransform(
  1302. 'a',
  1303. undefined,
  1304. strippedTransformPattern,
  1305. maskDefinitions,
  1306. ),
  1307. ).toBe('A');
  1308. expect(
  1309. utils.applyTransform(
  1310. 'A',
  1311. null,
  1312. strippedTransformPattern,
  1313. maskDefinitions,
  1314. ),
  1315. ).toBe('A');
  1316. expect(
  1317. utils.applyTransform(
  1318. 'ABc',
  1319. 'AB',
  1320. strippedTransformPattern,
  1321. maskDefinitions,
  1322. ),
  1323. ).toBe('ABC');
  1324. expect(
  1325. utils.applyTransform(
  1326. 'ABC0',
  1327. 'ABC',
  1328. strippedTransformPattern,
  1329. maskDefinitions,
  1330. ),
  1331. ).toBe('ABC1');
  1332. expect(
  1333. utils.applyTransform(
  1334. 'ABC1233',
  1335. 'ABC123',
  1336. strippedTransformPattern,
  1337. maskDefinitions,
  1338. ),
  1339. ).toBe('ABC1234');
  1340. expect(
  1341. utils.applyTransform(
  1342. 'ABC12344',
  1343. 'ABC1234',
  1344. strippedTransformPattern,
  1345. maskDefinitions,
  1346. ),
  1347. ).toBe('ABC12344');
  1348. });
  1349. describe('charMatchTest', () => {
  1350. it('should return the RegExp that matches the char on mask definitions', () => {
  1351. expect(utils.charMatchTest('B', defaultMaskDefinitions)).toBe('A');
  1352. expect(utils.charMatchTest('b', defaultMaskDefinitions)).toBe('A');
  1353. expect(utils.charMatchTest('0', defaultMaskDefinitions)).toBe('9');
  1354. });
  1355. it('should return undefined if char does not match any mask definition', () => {
  1356. expect(utils.charMatchTest('_', defaultMaskDefinitions)).toBe(undefined);
  1357. expect(utils.charMatchTest('-', defaultMaskDefinitions)).toBe(undefined);
  1358. expect(utils.charMatchTest('?', defaultMaskDefinitions)).toBe(undefined);
  1359. expect(utils.charMatchTest(' ', defaultMaskDefinitions)).toBe(undefined);
  1360. });
  1361. });
  1362. });