import 'mocha' ; import { expect } from 'chai' ; import { parseFunctionCalls } from '@/application/Parser/Script/Compiler/Function/Call/FunctionCallParser' ; import { FunctionCallDataStub } from '@tests/unit/stubs/FunctionCallDataStub' ; describe ( 'FunctionCallParser' , ( ) => { describe ( 'parseFunctionCalls' , ( ) => { it ( 'throws with undefined call' , ( ) => { const expectedError = 'undefined call data' ; const call = undefined ; const act = ( ) => parseFunctionCalls ( call ) ; expect ( act ) . to . throw ( expectedError ) ; } ) ; it ( 'throws if call is not an object' , ( ) => { const expectedError = 'called function(s) must be an object' ; const invalidCalls = [ 'string' , 33 , false ] ; invalidCalls . forEach ( ( invalidCall ) => { const act = ( ) => parseFunctionCalls ( invalidCall as never ) ; expect ( act ) . to . throw ( expectedError ) ; } ) ; } ) ; it ( 'throws if call sequence has undefined call' , ( ) => { const expectedError = 'undefined function call' ; const data = [ new FunctionCallDataStub ( ) , undefined , ] ; const act = ( ) => parseFunctionCalls ( data ) ; expect ( act ) . to . throw ( expectedError ) ; } ) ; it ( 'throws if call sequence has undefined function name' , ( ) => { const expectedError = 'empty function name in function call' ; const data = [ new FunctionCallDataStub ( ) . withName ( 'function-name' ) , new FunctionCallDataStub ( ) . withName ( undefined ) , ] ; const act = ( ) => parseFunctionCalls ( data ) ; expect ( act ) . to . throw ( expectedError ) ; } ) ; it ( 'parses single call as expected' , ( ) => { const expectedFunctionName = 'functionName' ; const expectedParameterName = 'parameterName' ; const expectedArgumentValue = 'argumentValue' ; const data = new FunctionCallDataStub ( ) . withName ( expectedFunctionName ) . withParameters ( { [ expectedParameterName ] : expectedArgumentValue } ) ; const actual = parseFunctionCalls ( data ) ; expect ( actual ) . to . have . lengthOf ( 1 ) ; const call = actual [ 0 ] ; expect ( call . functionName ) . to . equal ( expectedFunctionName ) ; const { args } = call ; expect ( args . getAllParameterNames ( ) ) . to . have . lengthOf ( 1 ) ; expect ( args . hasArgument ( expectedParameterName ) ) . to . equal ( true , `Does not include expected parameter: "${ expectedParameterName }"\n` + `But includes: "${ args . getAllParameterNames ( ) }"` ) ; const argument = args . getArgument ( expectedParameterName ) ; expect ( argument . parameterName ) . to . equal ( expectedParameterName ) ; expect ( argument . argumentValue ) . to . equal ( expectedArgumentValue ) ; } ) ; it ( 'parses multiple calls as expected' , ( ) => { const getFunctionName = ( index ) => `functionName${ index }` ; const getParameterName = ( index ) => `parameterName${ index }` ; const getArgumentValue = ( index ) => `argumentValue${ index }` ; const createCall = ( index ) => new FunctionCallDataStub ( ) . withName ( getFunctionName ( index ) ) . withParameters ( { [ getParameterName ( index ) ] : getArgumentValue ( index ) } ) ; const calls = [ createCall ( 0 ) , createCall ( 1 ) , createCall ( 2 ) , createCall ( 3 ) ] ; const actual = parseFunctionCalls ( calls ) ; expect ( actual ) . to . have . lengthOf ( calls . length ) ; for ( let i = 0 ; i < calls . length ; i ++ ) { const call = actual [ i ] ; const expectedParameterName = getParameterName ( i ) ; const expectedArgumentValue = getArgumentValue ( i ) ; expect ( call . functionName ) . to . equal ( getFunctionName ( i ) ) ; expect ( call . args . getAllParameterNames ( ) ) . to . have . lengthOf ( 1 ) ; expect ( call . args . hasArgument ( expectedParameterName ) ) . to . equal ( true ) ; const argument = call . args . getArgument ( expectedParameterName ) ; expect ( argument . parameterName ) . to . equal ( expectedParameterName ) ; expect ( argument . argumentValue ) . to . equal ( expectedArgumentValue ) ; } } ) ; } ) ; } ) ;