text-utils-spec.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. const textUtils = require('../src/text-utils');
  2. describe('text utilities', () => {
  3. describe('.hasPairedCharacter(string)', () =>
  4. it('returns true when the string contains a surrogate pair, variation sequence, or combined character', () => {
  5. expect(textUtils.hasPairedCharacter('abc')).toBe(false);
  6. expect(textUtils.hasPairedCharacter('a\uD835\uDF97b\uD835\uDF97c')).toBe(
  7. true
  8. );
  9. expect(textUtils.hasPairedCharacter('\uD835\uDF97')).toBe(true);
  10. expect(textUtils.hasPairedCharacter('\u2714\uFE0E')).toBe(true);
  11. expect(textUtils.hasPairedCharacter('e\u0301')).toBe(true);
  12. expect(textUtils.hasPairedCharacter('\uD835')).toBe(false);
  13. expect(textUtils.hasPairedCharacter('\uDF97')).toBe(false);
  14. expect(textUtils.hasPairedCharacter('\uFE0E')).toBe(false);
  15. expect(textUtils.hasPairedCharacter('\u0301')).toBe(false);
  16. expect(textUtils.hasPairedCharacter('\uFE0E\uFE0E')).toBe(false);
  17. expect(textUtils.hasPairedCharacter('\u0301\u0301')).toBe(false);
  18. }));
  19. describe('.isPairedCharacter(string, index)', () =>
  20. it('returns true when the index is the start of a high/low surrogate pair, variation sequence, or combined character', () => {
  21. expect(
  22. textUtils.isPairedCharacter('a\uD835\uDF97b\uD835\uDF97c', 0)
  23. ).toBe(false);
  24. expect(
  25. textUtils.isPairedCharacter('a\uD835\uDF97b\uD835\uDF97c', 1)
  26. ).toBe(true);
  27. expect(
  28. textUtils.isPairedCharacter('a\uD835\uDF97b\uD835\uDF97c', 2)
  29. ).toBe(false);
  30. expect(
  31. textUtils.isPairedCharacter('a\uD835\uDF97b\uD835\uDF97c', 3)
  32. ).toBe(false);
  33. expect(
  34. textUtils.isPairedCharacter('a\uD835\uDF97b\uD835\uDF97c', 4)
  35. ).toBe(true);
  36. expect(
  37. textUtils.isPairedCharacter('a\uD835\uDF97b\uD835\uDF97c', 5)
  38. ).toBe(false);
  39. expect(
  40. textUtils.isPairedCharacter('a\uD835\uDF97b\uD835\uDF97c', 6)
  41. ).toBe(false);
  42. expect(textUtils.isPairedCharacter('a\u2714\uFE0E', 0)).toBe(false);
  43. expect(textUtils.isPairedCharacter('a\u2714\uFE0E', 1)).toBe(true);
  44. expect(textUtils.isPairedCharacter('a\u2714\uFE0E', 2)).toBe(false);
  45. expect(textUtils.isPairedCharacter('a\u2714\uFE0E', 3)).toBe(false);
  46. expect(textUtils.isPairedCharacter('\uD835')).toBe(false);
  47. expect(textUtils.isPairedCharacter('\uDF97')).toBe(false);
  48. expect(textUtils.isPairedCharacter('\uFE0E')).toBe(false);
  49. expect(textUtils.isPairedCharacter('\uFE0E')).toBe(false);
  50. expect(textUtils.isPairedCharacter('\uFE0E\uFE0E')).toBe(false);
  51. expect(textUtils.isPairedCharacter('ae\u0301c', 0)).toBe(false);
  52. expect(textUtils.isPairedCharacter('ae\u0301c', 1)).toBe(true);
  53. expect(textUtils.isPairedCharacter('ae\u0301c', 2)).toBe(false);
  54. expect(textUtils.isPairedCharacter('ae\u0301c', 3)).toBe(false);
  55. expect(textUtils.isPairedCharacter('ae\u0301c', 4)).toBe(false);
  56. }));
  57. describe('.isDoubleWidthCharacter(character)', () =>
  58. it('returns true when the character is either japanese, chinese or a full width form', () => {
  59. expect(textUtils.isDoubleWidthCharacter('我')).toBe(true);
  60. expect(textUtils.isDoubleWidthCharacter('私')).toBe(true);
  61. expect(textUtils.isDoubleWidthCharacter('B')).toBe(true);
  62. expect(textUtils.isDoubleWidthCharacter(',')).toBe(true);
  63. expect(textUtils.isDoubleWidthCharacter('¢')).toBe(true);
  64. expect(textUtils.isDoubleWidthCharacter('a')).toBe(false);
  65. }));
  66. describe('.isHalfWidthCharacter(character)', () =>
  67. it('returns true when the character is an half width form', () => {
  68. expect(textUtils.isHalfWidthCharacter('ハ')).toBe(true);
  69. expect(textUtils.isHalfWidthCharacter('ヒ')).toBe(true);
  70. expect(textUtils.isHalfWidthCharacter('ᆲ')).toBe(true);
  71. expect(textUtils.isHalfWidthCharacter('■')).toBe(true);
  72. expect(textUtils.isHalfWidthCharacter('B')).toBe(false);
  73. }));
  74. describe('.isKoreanCharacter(character)', () =>
  75. it('returns true when the character is a korean character', () => {
  76. expect(textUtils.isKoreanCharacter('우')).toBe(true);
  77. expect(textUtils.isKoreanCharacter('가')).toBe(true);
  78. expect(textUtils.isKoreanCharacter('ㅢ')).toBe(true);
  79. expect(textUtils.isKoreanCharacter('ㄼ')).toBe(true);
  80. expect(textUtils.isKoreanCharacter('O')).toBe(false);
  81. }));
  82. describe('.isWrapBoundary(previousCharacter, character)', () =>
  83. it('returns true when the character is CJK or when the previous character is a space/tab', () => {
  84. const anyCharacter = 'x';
  85. expect(textUtils.isWrapBoundary(anyCharacter, '我')).toBe(true);
  86. expect(textUtils.isWrapBoundary(anyCharacter, '私')).toBe(true);
  87. expect(textUtils.isWrapBoundary(anyCharacter, 'B')).toBe(true);
  88. expect(textUtils.isWrapBoundary(anyCharacter, ',')).toBe(true);
  89. expect(textUtils.isWrapBoundary(anyCharacter, '¢')).toBe(true);
  90. expect(textUtils.isWrapBoundary(anyCharacter, 'ハ')).toBe(true);
  91. expect(textUtils.isWrapBoundary(anyCharacter, 'ヒ')).toBe(true);
  92. expect(textUtils.isWrapBoundary(anyCharacter, 'ᆲ')).toBe(true);
  93. expect(textUtils.isWrapBoundary(anyCharacter, '■')).toBe(true);
  94. expect(textUtils.isWrapBoundary(anyCharacter, '우')).toBe(true);
  95. expect(textUtils.isWrapBoundary(anyCharacter, '가')).toBe(true);
  96. expect(textUtils.isWrapBoundary(anyCharacter, 'ㅢ')).toBe(true);
  97. expect(textUtils.isWrapBoundary(anyCharacter, 'ㄼ')).toBe(true);
  98. expect(textUtils.isWrapBoundary(' ', 'h')).toBe(true);
  99. expect(textUtils.isWrapBoundary('\t', 'h')).toBe(true);
  100. expect(textUtils.isWrapBoundary('a', 'h')).toBe(false);
  101. }));
  102. });