From 6b3f4659df0afe1c99a8af6598df44a33c1f863a Mon Sep 17 00:00:00 2001 From: undergroundwires Date: Wed, 28 Sep 2022 23:09:23 +0200 Subject: [PATCH] Use line endings based on script language #88 Use CRLF in batchfile and LF in shellscript. --- .../State/Code/Generation/CodeBuilder.ts | 5 +- .../Code/Generation/Languages/BatchBuilder.ts | 4 ++ .../Code/Generation/Languages/ShellBuilder.ts | 4 ++ .../State/Code/Generation/CodeBuilder.spec.ts | 48 +++++++++++++++++++ .../Generation/Languages/BatchBuilder.spec.ts | 15 ++++++ .../Generation/Languages/ShellBuilder.spec.ts | 15 ++++++ 6 files changed, 89 insertions(+), 2 deletions(-) diff --git a/src/application/Context/State/Code/Generation/CodeBuilder.ts b/src/application/Context/State/Code/Generation/CodeBuilder.ts index dae192dd..22fa6ea1 100644 --- a/src/application/Context/State/Code/Generation/CodeBuilder.ts +++ b/src/application/Context/State/Code/Generation/CodeBuilder.ts @@ -1,6 +1,5 @@ import { ICodeBuilder } from './ICodeBuilder'; -const NewLine = '\n'; const TotalFunctionSeparatorChars = 58; export abstract class CodeBuilder implements ICodeBuilder { @@ -59,10 +58,12 @@ export abstract class CodeBuilder implements ICodeBuilder { } public toString(): string { - return this.lines.join(NewLine); + return this.lines.join(this.getNewLineTerminator()); } protected abstract getCommentDelimiter(): string; protected abstract writeStandardOut(text: string): string; + + protected abstract getNewLineTerminator(): string; } diff --git a/src/application/Context/State/Code/Generation/Languages/BatchBuilder.ts b/src/application/Context/State/Code/Generation/Languages/BatchBuilder.ts index 133d77ed..59baea64 100644 --- a/src/application/Context/State/Code/Generation/Languages/BatchBuilder.ts +++ b/src/application/Context/State/Code/Generation/Languages/BatchBuilder.ts @@ -8,6 +8,10 @@ export class BatchBuilder extends CodeBuilder { protected writeStandardOut(text: string): string { return `echo ${escapeForEcho(text)}`; } + + protected getNewLineTerminator(): string { + return '\r\n'; + } } function escapeForEcho(text: string) { diff --git a/src/application/Context/State/Code/Generation/Languages/ShellBuilder.ts b/src/application/Context/State/Code/Generation/Languages/ShellBuilder.ts index 1f905823..65216389 100644 --- a/src/application/Context/State/Code/Generation/Languages/ShellBuilder.ts +++ b/src/application/Context/State/Code/Generation/Languages/ShellBuilder.ts @@ -8,6 +8,10 @@ export class ShellBuilder extends CodeBuilder { protected writeStandardOut(text: string): string { return `echo '${escapeForEcho(text)}'`; } + + protected getNewLineTerminator(): string { + return '\n'; + } } function escapeForEcho(text: string) { diff --git a/tests/unit/application/Context/State/Code/Generation/CodeBuilder.spec.ts b/tests/unit/application/Context/State/Code/Generation/CodeBuilder.spec.ts index 911b46c0..80414b48 100644 --- a/tests/unit/application/Context/State/Code/Generation/CodeBuilder.spec.ts +++ b/tests/unit/application/Context/State/Code/Generation/CodeBuilder.spec.ts @@ -6,11 +6,18 @@ describe('CodeBuilder', () => { class CodeBuilderConcrete extends CodeBuilder { private commentDelimiter = '//'; + private newLineTerminator = '\n'; + public withCommentDelimiter(delimiter: string): CodeBuilderConcrete { this.commentDelimiter = delimiter; return this; } + public withNewLineTerminator(terminator: string): CodeBuilderConcrete { + this.newLineTerminator = terminator; + return this; + } + protected getCommentDelimiter(): string { return this.commentDelimiter; } @@ -18,6 +25,10 @@ describe('CodeBuilder', () => { protected writeStandardOut(text: string): string { return text; } + + protected getNewLineTerminator(): string { + return this.newLineTerminator; + } } describe('appendLine', () => { it('when empty appends empty line', () => { @@ -40,6 +51,43 @@ describe('CodeBuilder', () => { const lines = getLines(result); expect(lines[1]).to.equal('str'); }); + describe('append multi-line string as multiple lines', () => { + describe('recognizes different line terminators', () => { + const delimiters = ['\n', '\r\n', '\r']; + for (const delimiter of delimiters) { + it(`using "${JSON.stringify(delimiter)}"`, () => { + // arrange + const line1 = 'line1'; + const line2 = 'line2'; + const code = `${line1}${delimiter}${line2}`; + const sut = new CodeBuilderConcrete(); + // act + sut.appendLine(code); + // assert + const result = sut.toString(); + const lines = getLines(result); + expect(lines).to.have.lengthOf(2); + expect(lines[0]).to.equal(line1); + expect(lines[1]).to.equal(line2); + }); + } + }); + it('normalizes different line terminators', () => { + // arrange + const lineTerminator = '🐒'; + const lines = ['line1', 'line2', 'line3', 'line4']; + const code = `${lines[0]}\n${lines[1]}\r\n${lines[2]}\r${lines[3]}`; + const expected = `${lines[0]}${lineTerminator}${lines[1]}${lineTerminator}${lines[2]}${lineTerminator}${lines[3]}`; + const sut = new CodeBuilderConcrete() + .withNewLineTerminator(lineTerminator); + // act + const actual = sut + .appendLine(code) + .toString(); + // assert + expect(actual).to.equal(expected); + }); + }); }); it('appendFunction', () => { // arrange diff --git a/tests/unit/application/Context/State/Code/Generation/Languages/BatchBuilder.spec.ts b/tests/unit/application/Context/State/Code/Generation/Languages/BatchBuilder.spec.ts index 52b4d13c..1bf36d10 100644 --- a/tests/unit/application/Context/State/Code/Generation/Languages/BatchBuilder.spec.ts +++ b/tests/unit/application/Context/State/Code/Generation/Languages/BatchBuilder.spec.ts @@ -11,6 +11,10 @@ describe('BatchBuilder', () => { public writeStandardOut(text: string): string { return super.writeStandardOut(text); } + + public getNewLineTerminator(): string { + return super.getNewLineTerminator(); + } } describe('getCommentDelimiter', () => { it('returns expected', () => { @@ -57,4 +61,15 @@ describe('BatchBuilder', () => { }); } }); + describe('getNewLineTerminator', () => { + it('returns expected', () => { + // arrange + const expected = '\r\n'; + const sut = new BatchBuilderRevealer(); + // act + const actual = sut.getNewLineTerminator(); + // assert + expect(expected).to.equal(actual); + }); + }); }); diff --git a/tests/unit/application/Context/State/Code/Generation/Languages/ShellBuilder.spec.ts b/tests/unit/application/Context/State/Code/Generation/Languages/ShellBuilder.spec.ts index 67a51039..a77b041e 100644 --- a/tests/unit/application/Context/State/Code/Generation/Languages/ShellBuilder.spec.ts +++ b/tests/unit/application/Context/State/Code/Generation/Languages/ShellBuilder.spec.ts @@ -11,6 +11,10 @@ describe('ShellBuilder', () => { public writeStandardOut(text: string): string { return super.writeStandardOut(text); } + + public getNewLineTerminator(): string { + return super.getNewLineTerminator(); + } } describe('getCommentDelimiter', () => { it('returns expected', () => { @@ -52,4 +56,15 @@ describe('ShellBuilder', () => { }); } }); + describe('getNewLineTerminator', () => { + it('returns expected', () => { + // arrange + const expected = '\n'; + const sut = new ShellBuilderRevealer(); + // act + const actual = sut.getNewLineTerminator(); + // assert + expect(expected).to.equal(actual); + }); + }); });