import { dedent } from '..'; function tag(strings: TemplateStringsArray, ...values: number[]) { let string = strings[0]; values.forEach((value, i) => { string += 2 * value + strings[i + 1]; }); return string; } describe('dedent tag', () => { it('should work with empty string', () => { expect(dedent``).toEqual(''); }); it('should work with tabs', () => { expect(dedent`Line #1 Line #2 Line #3`).toEqual('Line #1\nLine #2\nLine #3'); expect(dedent`Line #${1} Line #${2} Line #${3}`).toEqual('Line #1\nLine #2\nLine #3'); expect(dedent`${1}. line #${1} ${2}. line #${2} ${3}. line`).toEqual('1. line #1\n2. line #2\n3. line'); }); it('should work with spaces', () => { expect(dedent`Line #1 Line #2 Line #3`).toEqual('Line #1\nLine #2\nLine #3'); expect(dedent`Line #${1} Line #${2} Line #${3}`).toEqual('Line #1\nLine #2\nLine #3'); expect(dedent`${1}. line #${1} ${2}. line #${2} ${3}. line`).toEqual('1. line #1\n2. line #2\n3. line'); }); it('should remove leading/trailing line break', () => { expect( dedent` Line #1 Line #2 Line #3 `, ).toEqual('Line #1\nLine #2\nLine #3'); expect( dedent` Line #1 Line #2 Line #3 `, ).toEqual('Line #1\n\tLine #2\n\tLine #3'); expect( dedent` Line #${1} Line #${2} Line #${3} `, ).toEqual('Line #1\nLine #2\nLine #3'); expect( dedent` Line #${1} Line #${2} Line #${3} `, ).toEqual('Line #1\n\tLine #2\n\tLine #3'); expect( dedent` ${1}. line #${1} ${2}. line #${2} ${3}. line `, ).toEqual('1. line #1\n2. line #2\n3. line'); }); it('should not remove more than one leading/trailing line break', () => { expect( dedent` Line #1 Line #2 Line #3 `, ).toEqual('\nLine #1\nLine #2\nLine #3\n'); expect( dedent` Line #${1} Line #${2} Line #${3} `, ).toEqual('\nLine #1\nLine #2\nLine #3\n'); expect( dedent` ${1}. line #${1} ${2}. line #${2} ${3}. line `, ).toEqual('\n1. line #1\n2. line #2\n3. line\n'); }); it('should remove the same number of tabs/spaces from each line', () => { expect( dedent` Line #1 Line #2 Line #3 `, ).toEqual('Line #1\n\tLine #2\n\t\tLine #3'); expect( dedent` Line #${1} Line #${2} Line #${3} `, ).toEqual('Line #1\n\tLine #2\n\t\tLine #3'); expect( dedent` ${1}. line #${1} ${2}. line #${2} ${3}. line `, ).toEqual('1. line #1\n\t2. line #2\n\t\t3. line'); }); it("should ignore the last line if it doesn't contain anything else than whitespace", () => { expect( (() => { return dedent` Line #1 Line #2 Line #3 `; })(), ).toEqual('Line #1\nLine #2\nLine #3'); expect( (() => { return dedent` Line #${1} Line #${2} Line #${3} `; })(), ).toEqual('Line #1\nLine #2\nLine #3'); expect( (() => { return dedent` ${1}. line #${1} ${2}. line #${2} ${3}. line `; })(), ).toEqual('1. line #1\n2. line #2\n3. line'); }); it("should process escape sequences", () => { expect( (() => { return dedent` \${not interpolated} \` `; })(), ).toEqual('${not interpolated}\n`'); }); }); describe('dedent() function', () => { it('should work with tabs', () => { expect( dedent(`Line #1 Line #2 Line #3`), ).toEqual('Line #1\nLine #2\nLine #3'); expect( dedent(`Line #${1} Line #${2} Line #${3}`), ).toEqual('Line #1\nLine #2\nLine #3'); expect( dedent(`${1}. line #${1} ${2}. line #${2} ${3}. line`), ).toEqual('1. line #1\n2. line #2\n3. line'); }); it('should work with spaces', () => { expect( dedent(`Line #1 Line #2 Line #3`), ).toEqual('Line #1\nLine #2\nLine #3'); expect( dedent(`Line #${1} Line #${2} Line #${3}`), ).toEqual('Line #1\nLine #2\nLine #3'); expect( dedent(`${1}. line #${1} ${2}. line #${2} ${3}. line`), ).toEqual('1. line #1\n2. line #2\n3. line'); }); it('should remove leading/trailing line break', () => { expect( dedent(` Line #1 Line #2 Line #3 `), ).toEqual('Line #1\nLine #2\nLine #3'); expect( dedent(` Line #1 Line #2 Line #3 `), ).toEqual('Line #1\n\tLine #2\n\tLine #3'); expect( dedent(` Line #${1} Line #${2} Line #${3} `), ).toEqual('Line #1\nLine #2\nLine #3'); expect( dedent(` Line #${1} Line #${2} Line #${3} `), ).toEqual('Line #1\n\tLine #2\n\tLine #3'); expect( dedent(` ${1}. line #${1} ${2}. line #${2} ${3}. line `), ).toEqual('1. line #1\n2. line #2\n3. line'); }); it('should not remove more than one leading/trailing line break', () => { expect( dedent(` Line #1 Line #2 Line #3 `), ).toEqual('\nLine #1\nLine #2\nLine #3\n'); expect( dedent(` Line #${1} Line #${2} Line #${3} `), ).toEqual('\nLine #1\nLine #2\nLine #3\n'); expect( dedent(` ${1}. line #${1} ${2}. line #${2} ${3}. line `), ).toEqual('\n1. line #1\n2. line #2\n3. line\n'); }); it('should remove the same number of tabs/spaces from each line', () => { expect( dedent(` Line #1 Line #2 Line #3 `), ).toEqual('Line #1\n\tLine #2\n\t\tLine #3'); expect( dedent(` Line #${1} Line #${2} Line #${3} `), ).toEqual('Line #1\n\tLine #2\n\t\tLine #3'); expect( dedent(` ${1}. line #${1} ${2}. line #${2} ${3}. line `), ).toEqual('1. line #1\n\t2. line #2\n\t\t3. line'); }); it("should ignore the last line if it doesn't contain anything else than whitespace", () => { expect( (() => { return dedent(` Line #1 Line #2 Line #3 `); })(), ).toEqual('Line #1\nLine #2\nLine #3'); expect( (() => { return dedent(` Line #${1} Line #${2} Line #${3} `); })(), ).toEqual('Line #1\nLine #2\nLine #3'); expect( (() => { return dedent(` ${1}. line #${1} ${2}. line #${2} ${3}. line `); })(), ).toEqual('1. line #1\n2. line #2\n3. line'); }); it("should process escape sequences", () => { expect( dedent(` \${not interpolated} \` `), ).toEqual('${not interpolated}\n`'); }); }); describe('dedent() function with custom tag', () => { it('should work with tabs', () => { expect( dedent(tag`Line #1 Line #2 Line #3`), ).toEqual('Line #1\nLine #2\nLine #3'); expect( dedent(tag`Line #${1} Line #${2} Line #${3}`), ).toEqual('Line #2\nLine #4\nLine #6'); expect( dedent(tag`${1}. line #${1} ${2}. line #${2} ${3}. line`), ).toEqual('2. line #2\n4. line #4\n6. line'); }); it('should work with spaces', () => { expect( dedent(tag`Line #1 Line #2 Line #3`), ).toEqual('Line #1\nLine #2\nLine #3'); expect( dedent(tag`Line #${1} Line #${2} Line #${3}`), ).toEqual('Line #2\nLine #4\nLine #6'); expect( dedent(tag`${1}. line #${1} ${2}. line #${2} ${3}. line`), ).toEqual('2. line #2\n4. line #4\n6. line'); }); it('should remove leading/trailing line break', () => { expect( dedent(tag` Line #1 Line #2 Line #3 `), ).toEqual('Line #1\nLine #2\nLine #3'); expect( dedent(tag` Line #1 Line #2 Line #3 `), ).toEqual('Line #1\n\tLine #2\n\tLine #3'); expect( dedent(tag` Line #${1} Line #${2} Line #${3} `), ).toEqual('Line #2\nLine #4\nLine #6'); expect( dedent(tag` Line #${1} Line #${2} Line #${3} `), ).toEqual('Line #2\n\tLine #4\n\tLine #6'); expect( dedent(tag` ${1}. line #${1} ${2}. line #${2} ${3}. line `), ).toEqual('2. line #2\n4. line #4\n6. line'); }); it('should not remove more than one leading/trailing line break', () => { expect( dedent(tag` Line #1 Line #2 Line #3 `), ).toEqual('\nLine #1\nLine #2\nLine #3\n'); expect( dedent(tag` Line #${1} Line #${2} Line #${3} `), ).toEqual('\nLine #2\nLine #4\nLine #6\n'); expect( dedent(tag` ${1}. line #${1} ${2}. line #${2} ${3}. line `), ).toEqual('\n2. line #2\n4. line #4\n6. line\n'); }); it('should remove the same number of tabs/spaces from each line', () => { expect( dedent(tag` Line #1 Line #2 Line #3 `), ).toEqual('Line #1\n\tLine #2\n\t\tLine #3'); expect( dedent(tag` Line #${1} Line #${2} Line #${3} `), ).toEqual('Line #2\n\tLine #4\n\t\tLine #6'); expect( dedent(tag` ${1}. line #${1} ${2}. line #${2} ${3}. line `), ).toEqual('2. line #2\n\t4. line #4\n\t\t6. line'); }); it("should ignore the last line if it doesn't contain anything else than whitespace", () => { expect( (() => { return dedent(tag` Line #1 Line #2 Line #3 `); })(), ).toEqual('Line #1\nLine #2\nLine #3'); expect( (() => { return dedent(tag` Line #${1} Line #${2} Line #${3} `); })(), ).toEqual('Line #2\nLine #4\nLine #6'); expect( (() => { return dedent(tag` ${1}. line #${1} ${2}. line #${2} ${3}. line `); })(), ).toEqual('2. line #2\n4. line #4\n6. line'); }); it("should process escape sequences", () => { expect( dedent(tag` \${not interpolated} \` `), ).toEqual('${not interpolated}\n`'); }); });