import * as assert from 'assert'; import deindent from './deindent.js'; import CodeBuilder from './CodeBuilder.ts'; describe( 'deindent', () => { it( 'deindents a simple string', () => { const deindented = deindent` deindent me please `; assert.equal( deindented, `deindent me please` ); }); it( 'deindents a multiline string', () => { const deindented = deindent` deindent me please and me as well `; assert.equal( deindented, `deindent me please\nand me as well` ); }); it( 'preserves indentation of inserted values', () => { const insert = deindent` line one line two `; const deindented = deindent` before ${insert} after `; assert.equal( deindented, `before\n\tline one\n\tline two\nafter` ); }); }); describe( 'CodeBuilder', () => { it( 'creates an empty block', () => { const builder = new CodeBuilder(); assert.equal( builder.toString(), '' ); }); it( 'creates a block with a line', () => { const builder = new CodeBuilder(); builder.addLine( 'var answer = 42;' ); assert.equal( builder.toString(), 'var answer = 42;' ); }); it( 'creates a block with two lines', () => { const builder = new CodeBuilder(); builder.addLine( 'var problems = 99;' ); builder.addLine( 'var answer = 42;' ); assert.equal( builder.toString(), 'var problems = 99;\nvar answer = 42;' ); }); it( 'adds newlines around blocks', () => { const builder = new CodeBuilder(); builder.addLine( '// line 1' ); builder.addLine( '// line 2' ); builder.addBlock( deindent` if ( foo ) { bar(); } ` ); builder.addLine( '// line 3' ); builder.addLine( '// line 4' ); assert.equal( builder.toString(), deindent` // line 1 // line 2 if ( foo ) { bar(); } // line 3 // line 4 ` ); }); it( 'nests codebuilders with correct indentation', () => { const child = new CodeBuilder(); child.addBlock( deindent` var obj = { answer: 42 }; ` ); const builder = new CodeBuilder(); builder.addLine( '// line 1' ); builder.addLine( '// line 2' ); builder.addBlock( deindent` if ( foo ) { ${child} } ` ); builder.addLine( '// line 3' ); builder.addLine( '// line 4' ); assert.equal( builder.toString(), deindent` // line 1 // line 2 if ( foo ) { var obj = { answer: 42 }; } // line 3 // line 4 ` ); }); it( 'adds a line at start', () => { const builder = new CodeBuilder(); builder.addLine( '// second' ); builder.addLineAtStart( '// first' ); assert.equal( builder.toString(), deindent` // first // second ` ); }); it( 'adds a line at start before a block', () => { const builder = new CodeBuilder(); builder.addBlock( '// second' ); builder.addLineAtStart( '// first' ); assert.equal( builder.toString(), deindent` // first // second ` ); }); it( 'adds a block at start', () => { const builder = new CodeBuilder(); builder.addLine( '// second' ); builder.addBlockAtStart( '// first' ); assert.equal( builder.toString(), deindent` // first // second ` ); }); it( 'adds a block at start before a block', () => { const builder = new CodeBuilder(); builder.addBlock( '// second' ); builder.addBlockAtStart( '// first' ); assert.equal( builder.toString(), deindent` // first // second ` ); }); });