diff --git a/src/utilities.spec.ts b/src/utilities.spec.ts index c456d36..018c15e 100644 --- a/src/utilities.spec.ts +++ b/src/utilities.spec.ts @@ -1,5 +1,5 @@ -import { describe, beforeEach, it, expect, mock, afterAll, spyOn } from 'bun:test'; -import { debounce, deepCopy, deepDiff, filter, map, MutarionKind, splitAt } from './utilities'; +import { describe, beforeEach, it, expect, afterAll, spyOn } from 'bun:test'; +import { decode, deepCopy, deepDiff, filter, map, MutarionKind, splitAt } from './utilities'; import { install } from '@sinonjs/fake-timers'; type MilliSeconds = number; @@ -72,6 +72,44 @@ describe('utilities', () => { }); }); + describe('decode', () => { + it('should decode \\t characters', async () => { + // Arrange + const given = 'this is\\ta string'; + const expected = 'this is\ta string'; + + // Act + const actual = decode(given); + + // Assert + expect(actual).toBe(expected); + }); + + it('should decode \\n characters', async () => { + // Arrange + const given = 'this is\\na string'; + const expected = 'this is\na string'; + + // Act + const actual = decode(given); + + // Assert + expect(actual).toBe(expected); + }); + + it('should decode \\uHHHH characters', async () => { + // Arrange + const given = 'this is \\u1234 a string'; + const expected = 'this is \u1234 a string'; + + // Act + const actual = decode(given); + + // Assert + expect(actual).toBe(expected); + }); + }); + describe('deepCopy', () => { it('can skip values passed by reference (non-objects, null, and undefined)', async () => { // arrange diff --git a/src/utilities.ts b/src/utilities.ts index e58a76d..ad834c7 100644 --- a/src/utilities.ts +++ b/src/utilities.ts @@ -19,7 +19,7 @@ const decodeReplacer = (_: any, char: string) => ({ f: '\f', "'": '\'', '"': '\"', - u: String.fromCharCode(Number.parseInt(char.slice(1))), + u: String.fromCharCode(Number.parseInt(`0x${char.slice(1)}`)), }[char.charAt(0)] ?? ''); export const decode = (subject: string): string => subject.replace(decodeRegex, decodeReplacer);