import 'mocha' ; import { expect } from 'chai' ; import { CodeSubstituter } from '@/application/Parser/ScriptingDefinition/CodeSubstituter' ; import { IExpressionsCompiler } from '@/application/Parser/Script/Compiler/Expressions/IExpressionsCompiler' ; import { ProjectInformationStub } from '@tests/unit/stubs/ProjectInformationStub' ; import { ExpressionsCompilerStub } from '@tests/unit/stubs/ExpressionsCompilerStub' ; describe ( 'CodeSubstituter' , ( ) => { describe ( 'throws with invalid parameters' , ( ) => { const testCases = [ { expectedError : 'undefined code' , parameters : { code : undefined , info : new ProjectInformationStub ( ) , } , } , { expectedError : 'undefined info' , parameters : { code : 'non empty code' , info : undefined , } , } ] ; for ( const testCase of testCases ) { it ( `throws "${ testCase . expectedError }" as expected` , ( ) => { const sut = new CodeSubstituterBuilder ( ) . build ( ) ; const act = ( ) => sut . substitute ( testCase . parameters . code , testCase . parameters . info ) ; expect ( act ) . to . throw ( testCase . expectedError ) ; } ) ; } } ) ; describe ( 'substitutes parameters as expected values' , ( ) => { const info = new ProjectInformationStub ( ) ; const date = new Date ( ) ; const testCases = [ { parameter : 'homepage' , argument : info . homepage , } , { parameter : 'version' , argument : info . version , } , { parameter : 'date' , argument : date . toUTCString ( ) , } , ] ; for ( const testCase of testCases ) { it ( `substitutes ${ testCase . parameter } as expected` , ( ) => { const compilerStub = new ExpressionsCompilerStub ( ) ; const sut = new CodeSubstituterBuilder ( ) . withCompiler ( compilerStub ) . withDate ( date ) . build ( ) ; sut . substitute ( 'non empty code' , info ) ; expect ( compilerStub . callHistory ) . to . have . lengthOf ( 1 ) ; const { parameters } = compilerStub . callHistory [ 0 ] ; expect ( parameters . hasArgument ( testCase . parameter ) ) ; const { argumentValue } = parameters . getArgument ( testCase . parameter ) ; expect ( argumentValue ) . to . equal ( testCase . argument ) ; } ) ; } } ) ; it ( 'returns code as it is' , ( ) => { const expected = 'expected-code' ; const compilerStub = new ExpressionsCompilerStub ( ) ; const sut = new CodeSubstituterBuilder ( ) . withCompiler ( compilerStub ) . build ( ) ; sut . substitute ( expected , new ProjectInformationStub ( ) ) ; expect ( compilerStub . callHistory ) . to . have . lengthOf ( 1 ) ; expect ( compilerStub . callHistory [ 0 ] . code ) . to . equal ( expected ) ; } ) ; } ) ; class CodeSubstituterBuilder { private compiler : IExpressionsCompiler = new ExpressionsCompilerStub ( ) ; private date = new Date ( ) ; public withCompiler ( compiler ) { this . compiler = compiler ; return this ; } public withDate ( date ) { this . date = date ; return this ; } public build ( ) { return new CodeSubstituter ( this . compiler , this . date ) ; } }