import { update, fixTokenListNewLines, beautify } from './manipulation'; import { parseMultiLine, stringifyTokens } from './parser'; import { ModifyMode, Config } from './types'; describe('Updating tokens', () => { it('Creates empty file', () => { expect(stringifyTokens(update([], [], { beautify: true }))).toEqual('\n'); expect(stringifyTokens(update([], [], { enforceNewLineEnd: false }))).toEqual(''); }); it('appends at update with APPEND mode', () => { expect( stringifyTokens( update( [], [ ['ALAMA', 'kota'], ['KOTMA', 'alę'], ], { modifyMode: ModifyMode.APPEND }, ), ), ).toEqual('ALAMA=kota\nKOTMA=alę\n'); expect(stringifyTokens(update([], [{ name: 'ALAMA', value: 'kota', comment: ' # ma' }, ['KOTMA', 'alę']]))).toEqual('ALAMA=kota # ma\nKOTMA=alę\n'); expect( stringifyTokens( update([vtoken('HOST', '127.0.0.1'), nltoken(), vtoken('PORT', '80'), nltoken(), vtoken('LOGIN', 'root')], [['PASSWORD', 'secret']], { modifyMode: ModifyMode.APPEND, }), ), ).toEqual('HOST=127.0.0.1\nPORT=80\nLOGIN=root\nPASSWORD=secret\n'); }); it('appends does not append with EXISTING_ONLY mode', () => { expect( stringifyTokens( update( [], [ ['ALAMA', 'kota'], ['KOTMA', 'alę'], ], { modifyMode: ModifyMode.NO_APPEND }, ), ), ).toEqual('\n'); }); it('update existing value', () => { expect(stringifyTokens(update([vtoken('ALA', 'ma kota')], [['ALA', 'ma psa']], { modifyMode: ModifyMode.APPEND }))).toEqual('ALA="ma psa"\n'); expect( stringifyTokens( update( [vtoken('ALA', 'ma kota')], [ ['ALA', 'ma psa'], ['ALA', 'ma jednak kota'], ], { modifyMode: ModifyMode.APPEND }, ), ), ).toEqual('ALA="ma jednak kota"\n'); expect( stringifyTokens( update( [vtoken('HOST', '127.0.0.1'), nltoken(), vtoken('PORT', '80'), nltoken(), vtoken('LOGIN', 'root')], [['LOGIN', 'debian'], { name: 'PORT', value: '8080', comment: ' # debug only' }], { modifyMode: ModifyMode.APPEND }, ), ), ).toEqual('HOST=127.0.0.1\nPORT=8080 # debug only\nLOGIN=debian\n'); expect( stringifyTokens( update( [ ctoken('###########'), nltoken(), ctoken('# Server'), nltoken(), ctoken('###########'), nltoken('\n\n'), vtoken('SERVER_HOST', '127.0.0.1'), nltoken(), vtoken('SERVER_PORT', '80'), nltoken(), vtoken('SERVER_LOGIN', 'root'), nltoken('\n\n'), ctoken('###########'), nltoken(), ctoken('# Client'), nltoken(), ctoken('###########'), nltoken('\n\n'), vtoken('CLIENT_LOGIN', 'john'), ], [['SERVER_LOGIN', 'debian'], { name: 'SERVER_PORT', value: '8080', comment: ' # debug only' }, ['SERVER_PASSWORD', 'secret']], { modifyMode: ModifyMode.APPEND }, ), ), ).toEqual( '###########\n# Server\n###########\n\nSERVER_HOST=127.0.0.1\nSERVER_PORT=8080 # debug only\nSERVER_LOGIN=debian\n\n###########\n# Client\n###########\n\nCLIENT_LOGIN=john\nSERVER_PASSWORD=secret\n', ); }); it('do not update in append only mode', () => { expect(stringifyTokens(update([vtoken('ALA', 'ma kota')], [['ALA', 'ma psa']], { modifyMode: ModifyMode.APPEND, noUpdate: true }))).toEqual('ALA="ma kota"\n'); expect( stringifyTokens( update( [vtoken('ALA', 'ma kota')], [ ['ALA', 'ma psa'], ['ALA', 'ma jednak kota'], ], { modifyMode: ModifyMode.APPEND, noUpdate: true }, ), ), ).toEqual('ALA="ma kota"\n'); expect( stringifyTokens( update( [vtoken('ALA', 'ma kota')], [ ['ALA', 'ma psa'], ['ALA', 'ma jednak kota'], ], ), ), ).toEqual('ALA="ma jednak kota"\n'); expect( stringifyTokens( update( [vtoken('HOST', '127.0.0.1'), nltoken(), vtoken('PORT', '80'), nltoken(), vtoken('LOGIN', 'root')], [['LOGIN', 'debian'], { name: 'PORT', value: '8080', comment: ' # debug only' }], { modifyMode: ModifyMode.APPEND, noUpdate: true }, ), ), ).toEqual('HOST=127.0.0.1\nPORT=80\nLOGIN=root\n'); expect( stringifyTokens( update( [ ctoken('###########'), nltoken(), ctoken('# Server'), nltoken(), ctoken('###########'), nltoken('\n\n'), vtoken('SERVER_HOST', '127.0.0.1'), nltoken(), vtoken('SERVER_PORT', '80'), nltoken(), vtoken('SERVER_LOGIN', 'root'), nltoken('\n\n'), ctoken('###########'), nltoken(), ctoken('# Client'), nltoken(), ctoken('###########'), nltoken('\n\n'), vtoken('CLIENT_LOGIN', 'john'), ], [['SERVER_LOGIN', 'debian'], { name: 'SERVER_PORT', value: '8080', comment: ' # debug only' }, ['SERVER_PASSWORD', 'secret']], { modifyMode: ModifyMode.APPEND, noUpdate: true }, ), ), ).toEqual( '###########\n# Server\n###########\n\nSERVER_HOST=127.0.0.1\nSERVER_PORT=80\nSERVER_LOGIN=root\n\n###########\n# Client\n###########\n\nCLIENT_LOGIN=john\nSERVER_PASSWORD=secret\n', ); }); it('delete value', () => { expect( stringifyTokens( update([vtoken('HOST', '127.0.0.1'), nltoken(), vtoken('PORT', '80'), nltoken(), vtoken('LOGIN', 'root')], [['PORT', null]], { modifyMode: ModifyMode.APPEND, }), ), ).toEqual('HOST=127.0.0.1\nLOGIN=root\n'); expect( stringifyTokens( update([vtoken('HOST', '127.0.0.1'), nltoken(), vtoken('PORT', '80'), nltoken('\n\n\n'), vtoken('LOGIN', 'root')], [['PORT', null]], { modifyMode: ModifyMode.APPEND, }), ), ).toEqual('HOST=127.0.0.1\n\n\nLOGIN=root\n'); }); it('appends empty', () => { expect(stringifyTokens(update([], [{ name: 'test', value: undefined }], { modifyMode: ModifyMode.APPEND }))).toEqual('test=\n'); expect(stringifyTokens(update([], [{ name: 'test', value: '' }], { modifyMode: ModifyMode.APPEND }))).toEqual('test=\n'); }); it('appends smart', () => { expect( stringifyTokens( update( [ vtoken('SERVER_HOST', '127.0.0.1'), vtoken('SERVER_PORT', '80'), vtoken('SERVER_LOGIN', 'root'), ctoken('#-------------------------'), vtoken('CLIENT_LOGIN', 'john'), vtoken('CLIENT_X_AXIS', '12'), ctoken('#-------------------------'), vtoken('AUTO_RUN', 'true'), vtoken('AUTO_CLEAN', 'false'), ], [ ['CLIENT_ACCESS', 'limited'], ['SERVER_OUTPUT', '/dev/null'], ['CLIENT_Z_AXIS', '100'], ['ZOOM', '100%'], ['AUTO_STOP', 'true'], ['QUALITY', '90%'], ['AUTO_APPEND', 'true'], ['AUTO_ZERO', '000'], ], { modifyMode: ModifyMode.SMART_APPEND }, ), ), ).toEqual( 'SERVER_HOST=127.0.0.1\nSERVER_OUTPUT=/dev/null\nSERVER_PORT=80\nSERVER_LOGIN=root\n' + '#-------------------------\n' + 'CLIENT_ACCESS=limited\nCLIENT_LOGIN=john\nCLIENT_X_AXIS=12\nCLIENT_Z_AXIS=100\n' + '#-------------------------\n' + 'AUTO_APPEND=true\nAUTO_RUN=true\nAUTO_CLEAN=false\nAUTO_STOP=true\nAUTO_ZERO=000\n' + 'QUALITY=90%\nZOOM=100%\n', ); expect( stringifyTokens( update( [], [ ['SERVER_HOST', '127.0.0.1'], ['SERVER_PORT', '80'], ['SERVER_LOGIN', 'root'], ['CLIENT_LOGIN', 'john'], ['CLIENT_X_AXIS', '12'], ['AUTO_RUN', 'true'], ['AUTO_CLEAN', 'false'], ['CLIENT_ACCESS', 'limited'], ['SERVER_OUTPUT', '/dev/null'], ['CLIENT_Z_AXIS', '100'], ['ZOOM', '100%'], ['AUTO_STOP', 'true'], ['QUALITY', '90%'], ['AUTO_APPEND', 'true'], ['AUTO_ZERO', '000'], ], { modifyMode: ModifyMode.SMART_APPEND }, ), ), ).toEqual( 'AUTO_APPEND=true\nAUTO_CLEAN=false\nAUTO_RUN=true\nAUTO_STOP=true\nAUTO_ZERO=000\n' + 'CLIENT_ACCESS=limited\nCLIENT_LOGIN=john\nCLIENT_X_AXIS=12\nCLIENT_Z_AXIS=100\n' + 'QUALITY=90%\n' + 'SERVER_HOST=127.0.0.1\nSERVER_LOGIN=root\nSERVER_OUTPUT=/dev/null\nSERVER_PORT=80\n' + 'ZOOM=100%\n', ); expect( stringifyTokens( update( [ ctoken('###########'), nltoken(), ctoken('# Server'), nltoken(), ctoken('###########'), nltoken('\n\n'), vtoken('SERVER_HOST', '127.0.0.1'), nltoken(), vtoken('SERVER_PORT', '80'), nltoken(), vtoken('SERVER_LOGIN', 'root'), nltoken('\n\n'), ctoken('###########'), nltoken(), ctoken('# Client'), nltoken(), ctoken('###########'), nltoken('\n\n'), vtoken('CLIENT_LOGIN', 'john'), ], [['SERVER_LOGIN', 'debian'], { name: 'SERVER_PORT', value: '8080', comment: ' # debug only' }, ['SERVER_PASSWORD', 'secret']], { modifyMode: ModifyMode.SMART_APPEND }, ), ), ).toEqual( '###########\n# Server\n###########\n\nSERVER_HOST=127.0.0.1\nSERVER_PASSWORD=secret\nSERVER_PORT=8080 # debug only\nSERVER_LOGIN=debian\n\n###########\n# Client\n###########\n\nCLIENT_LOGIN=john\n', ); }); it('appends smart with no update config', () => { expect( stringifyTokens( update( [ vtoken('SERVER_HOST', '127.0.0.1'), vtoken('SERVER_PORT', '80'), vtoken('SERVER_LOGIN', 'root'), ctoken('#-------------------------'), vtoken('CLIENT_LOGIN', 'john'), vtoken('CLIENT_X_AXIS', '12'), ctoken('#-------------------------'), vtoken('AUTO_RUN', 'true'), vtoken('AUTO_CLEAN', 'false'), ], [ ['CLIENT_ACCESS', 'limited'], ['SERVER_OUTPUT', '/dev/null'], ['CLIENT_Z_AXIS', '100'], ['ZOOM', '100%'], ['AUTO_STOP', 'true'], ['QUALITY', '90%'], ['AUTO_APPEND', 'true'], ['AUTO_ZERO', '000'], ], { modifyMode: ModifyMode.SMART_APPEND, noUpdate: true }, ), ), ).toEqual( 'SERVER_HOST=127.0.0.1\nSERVER_OUTPUT=/dev/null\nSERVER_PORT=80\nSERVER_LOGIN=root\n' + '#-------------------------\n' + 'CLIENT_ACCESS=limited\nCLIENT_LOGIN=john\nCLIENT_X_AXIS=12\nCLIENT_Z_AXIS=100\n' + '#-------------------------\n' + 'AUTO_APPEND=true\nAUTO_RUN=true\nAUTO_CLEAN=false\nAUTO_STOP=true\nAUTO_ZERO=000\n' + 'QUALITY=90%\nZOOM=100%\n', ); expect( stringifyTokens( update( [], [ ['SERVER_HOST', '127.0.0.1'], ['SERVER_PORT', '80'], ['SERVER_LOGIN', 'root'], ['CLIENT_LOGIN', 'john'], ['CLIENT_X_AXIS', '12'], ['AUTO_RUN', 'true'], ['AUTO_CLEAN', 'false'], ['CLIENT_ACCESS', 'limited'], ['SERVER_OUTPUT', '/dev/null'], ['CLIENT_Z_AXIS', '100'], ['ZOOM', '100%'], ['AUTO_STOP', 'true'], ['QUALITY', '90%'], ['AUTO_APPEND', 'true'], ['AUTO_ZERO', '000'], ], { modifyMode: ModifyMode.SMART_APPEND, noUpdate: true }, ), ), ).toEqual( 'AUTO_APPEND=true\nAUTO_CLEAN=false\nAUTO_RUN=true\nAUTO_STOP=true\nAUTO_ZERO=000\n' + 'CLIENT_ACCESS=limited\nCLIENT_LOGIN=john\nCLIENT_X_AXIS=12\nCLIENT_Z_AXIS=100\n' + 'QUALITY=90%\n' + 'SERVER_HOST=127.0.0.1\nSERVER_LOGIN=root\nSERVER_OUTPUT=/dev/null\nSERVER_PORT=80\n' + 'ZOOM=100%\n', ); expect( stringifyTokens( update( [ ctoken('###########'), nltoken(), ctoken('# Server'), nltoken(), ctoken('###########'), nltoken('\n\n'), vtoken('SERVER_HOST', '127.0.0.1'), nltoken(), vtoken('SERVER_PORT', '80'), nltoken(), vtoken('SERVER_LOGIN', 'root'), nltoken('\n\n'), ctoken('###########'), nltoken(), ctoken('# Client'), nltoken(), ctoken('###########'), nltoken('\n\n'), vtoken('CLIENT_LOGIN', 'john'), ], [['SERVER_LOGIN', 'debian'], { name: 'SERVER_PORT', value: '8080', comment: ' # debug only' }, ['SERVER_PASSWORD', 'secret']], { modifyMode: ModifyMode.SMART_APPEND, noUpdate: true }, ), ), ).toEqual( '###########\n# Server\n###########\n\nSERVER_HOST=127.0.0.1\nSERVER_PASSWORD=secret\nSERVER_PORT=80\nSERVER_LOGIN=root\n\n###########\n# Client\n###########\n\nCLIENT_LOGIN=john\n', ); }); }); describe('Fixing token list', () => { it('merges and interleave tokens with new lines', () => { expect( fixTokenListNewLines([ ctoken('###########'), ctoken('# Server'), ctoken('###########'), nltoken('\n'), nltoken('\n'), vtoken('SERVER_HOST', '127.0.0.1'), vtoken('SERVER_PORT', '80'), vtoken('SERVER_LOGIN', 'root'), nltoken('\n\n'), ctoken('###########'), nltoken(), ctoken('# Client'), ctoken('###########'), nltoken('\n'), nltoken('\n'), nltoken('\n'), nltoken('\n'), wstoken('\t'), wstoken(' '), wstoken('\t'), vtoken('CLIENT_LOGIN', 'john'), ]), ).toEqual([ ctoken('###########'), nltoken(), ctoken('# Server'), nltoken(), ctoken('###########'), nltoken('\n\n'), vtoken('SERVER_HOST', '127.0.0.1'), nltoken(), vtoken('SERVER_PORT', '80'), nltoken(), vtoken('SERVER_LOGIN', 'root'), nltoken('\n\n'), ctoken('###########'), nltoken(), ctoken('# Client'), nltoken(), ctoken('###########'), nltoken('\n\n\n\n'), wstoken('\t \t'), vtoken('CLIENT_LOGIN', 'john'), ]); }); }); describe('Beautifying output', () => { it('appends single new line', () => { expect(beautify([], { beautify: true })).toEqual([nltoken()]); }); it('beautify output', () => { const cfg: Config = { beautify: true }; expect( stringifyTokens( beautify( parseMultiLine( '\n\n\r\n #-------------------------\n' + '# Server \n' + ' #-------------------------\n\n\n\n' + 'SERVER_HOST=127.0.0.1\nSERVER_OUTPUT= /dev/null # simply ignore it \nSERVER_PORT=80\nSERVER_LOGIN=root\n' + '#-------------------------\n' + '# Client\n' + '#-------------------------\n\r' + 'CLIENT_ACCESS=limited \nCLIENT_LOGIN =john\nCLIENT_X_AXIS=12\nCLIENT_Z_AXIS=100\n' + '#-------------------------\n\r' + 'AUTO_APPEND=true\n AUTO_RUN = true\nAUTO_CLEAN=false\nAUTO_STOP=true\n AUTO_ZERO = 000 \n' + '#-------------------------\n' + '# Other\n' + '#-------------------------\n' + 'QUALITY=90%\n\n\r\n\nZOOM=100%\n\n\n', ), cfg, ), cfg, ), ).toEqual( '#-------------------------\n' + '# Server\n' + '#-------------------------\n\n' + 'SERVER_HOST=127.0.0.1\nSERVER_OUTPUT=/dev/null # simply ignore it\nSERVER_PORT=80\nSERVER_LOGIN=root\n\n' + '#-------------------------\n' + '# Client\n' + '#-------------------------\n\n' + 'CLIENT_ACCESS=limited\nCLIENT_LOGIN=john\nCLIENT_X_AXIS=12\nCLIENT_Z_AXIS=100\n\n' + '#-------------------------\n\n' + 'AUTO_APPEND=true\nAUTO_RUN=true\nAUTO_CLEAN=false\nAUTO_STOP=true\nAUTO_ZERO=000\n\n' + '#-------------------------\n' + '# Other\n' + '#-------------------------\n\n' + 'QUALITY=90%\n\nZOOM=100%\n', ); }); });