/* eslint-disable no-useless-escape */ import * as sh from '../sh' describe('execShellScript', () => { it('resolves if childprocess sends close signal', async () => { return expect(sh.execShellScript('echo')).resolves }) it('rejects if childprocess sends error signal', async () => { // an error is sent if child_process cant spawn 'some-nonexistant-command' return expect( sh.execShellScript('something', 'some-nonexistant-command'), ).rejects.toBe('Failed to execute something') }) }) describe('getDocumentation', () => { it('returns null for an unknown builtin', async () => { const result = await sh.getShellDocumentation({ word: 'foobar' }) expect(result).toEqual(null) }) it('returns documentation string for a known builtin', async () => { const result = (await sh.getShellDocumentation({ word: 'exit' })) as string const firstLine = result.split('\n')[0] expect(firstLine).toEqual('exit: exit [n]') }) it('returns documentation string (man page) for known command', async () => { const result = (await sh.getShellDocumentation({ word: 'ls' })) as string const lines = result.split('\n') expect(lines[0]).toEqual('NAME') expect(lines[1]).toContain('list directory contents') }) it('skips documentation for some builtins', async () => { const result = await sh.getShellDocumentation({ word: 'else' }) expect(result).toEqual(null) }) it('sanity checks the given word', async () => { await expect(sh.getShellDocumentation({ word: 'ls foo' })).rejects.toThrow() }) }) describe('formatManOutput', () => { // The following were extracted using docker and by running the command: // `MANWIDTH=45 man echo | cat` it('formats GNU (Ubuntu) manuals', () => { expect( sh.formatManOutput(`ECHO(1) User Commands ECHO(1) NAME echo - display a line of text SYNOPSIS echo [SHORT-OPTION]... [STRING]... echo LONG-OPTION DESCRIPTION Echo the STRING(s) to standard out- put. -n do not output the trailing newline -e enable interpretation of backslash escapes -E disable interpretation of backslash escapes (default) --help display this help and exit --version output version information and exit If -e is in effect, the following sequences are recognized: \\ backslash \\a alert (BEL) \\b backspace \\c produce no further output \\e escape \\f form feed \\n new line \\r carriage return \\t horizontal tab \\v vertical tab \\0NNN byte with octal value NNN (1 to 3 digits) \\xHH byte with hexadecimal value HH (1 to 2 digits) NOTE: your shell may have its own version of echo, which usually su- persedes the version described here. Please refer to your shell's docu- mentation for details about the op- tions it supports. AUTHOR Written by Brian Fox and Chet Ramey. REPORTING BUGS GNU coreutils online help: Report echo translation bugs to COPYRIGHT Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later . This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. SEE ALSO Full documentation at: or available locally via: info '(coreutils) echo invocation' GNU coreutils 8September 2019 ECHO(1)`), ).toMatchSnapshot() }) it('formats POSIX (Centos) manuals', () => { expect( sh.formatManOutput(`ECHO(1P) POSIX Programmer's Manual ECHO(1P) PROLOG This manual page is part of the POSIX Programmer's Manual. The Linux implementation of this inter- face may differ (consult the corre- sponding Linux manual page for details of Linux behavior), or the interface may not be implemented on Linux. NAME echo -- write arguments to standard output SYNOPSIS echo [string...] DESCRIPTION The echo utility writes its argu- ments to standard output, followed by a . If there are no arguments, only the is written. OPTIONS The echo utility shall not recognize the "--" argument in the manner specified by Guideline 10 of the Base Definitions volume of POSIX.1-2008, Section 12.2, Utility Syntax Guidelines; "--" shall be recognized as a string operand. Implementations shall not support any options. OPERANDS The following operands shall be sup- ported: string A string to be written to standard output. If the first operand is -n, or if any of the operands con- tain a charac- ter, the results are implementation-defined. On XSI-conformant systems, if the first operand is -n, it shall be treated as a string, not an option. The following character sequences shall be recog- nized on XSI-conformant systems within any of the arguments: \\a Write an . \\b Write a . \\c Suppress the that other- wise follows the final argument in the output. All characters follow- ing the '\\c' in the arguments shall be ignored. \\f Write a . \\n Write a . \\r Write a . \\t Write a . \\v Write a . \\ Write a character. \0num Write an 8-bit value that is the zero, one, two, or three-digit octal number num. STDIN Not used. INPUT FILES None. ENVIRONMENT VARIABLES The following environment variables shall affect the execution of echo: LANG Provide a default value for the internationaliza- tion variables that are unset or null. (See the Base Definitions volume of POSIX.1-2008, Section 8.2, Internationalization Vari- ables for the precedence of internationalization variables used to deter- mine the values of locale categories.) LC_ALL If set to a non-empty string value, override the values of all the other internationalization vari- ables. LC_CTYPE Determine the locale for the interpretation of sequences of bytes of text data as characters (for example, single-byte as opposed to multi-byte characters in arguments). LC_MESSAGES Determine the locale that should be used to affect the format and contents of diagnostic messages writ- ten to standard error. NLSPATH Determine the location of message catalogs for the processing of LC_MESSAGES. ASYNCHRONOUS EVENTS Default. STDOUT The echo utility arguments shall be separated by single charac- ters and a character shall follow the last argument. Output transformations shall occur based on the escape sequences in the input. See the OPERANDS section. STDERR The standard error shall be used only for diagnostic messages. OUTPUT FILES None. EXTENDED DESCRIPTION None. EXIT STATUS The following exit values shall be returned: 0 Successful completion. >0 An error occurred. CONSEQUENCES OF ERRORS Default. The following sections are informa- tive. APPLICATION USAGE It is not possible to use echo portably across all POSIX systems unless both -n (as the first argu- ment) and escape sequences are omit- ted. The printf utility can be used portably to emulate any of the tra- ditional behaviors of the echo util- ity as follows (assuming that IFS has its standard value or is unset): * The historic System V echo and the requirements on XSI imple- mentations in this volume of POSIX.1-2008 are equivalent to: printf "%b\n$*" * The BSD echo is equivalent to: if [ "X$1" = "X-n" ] then shift printf "%s$*" else printf "%s\n$*" fi New applications are encouraged to use printf instead of echo. EXAMPLES None. RATIONALE The echo utility has not been made obsolescent because of its extremely widespread use in historical appli- cations. Conforming applications that wish to do prompting without characters or that could possibly be expecting to echo a -n, should use the printf utility derived from the Ninth Edition sys- tem. As specified, echo writes its argu- ments in the simplest of ways. The two different historical versions of echo vary in fatally incompatible ways. The BSD echo checks the first argu- ment for the string -n which causes it to suppress the that would otherwise follow the final argument in the output. The System V echo does not support any options, but allows escape sequences within its operands, as described for XSI implementations in the OPERANDS section. The echo utility does not support Utility Syntax Guideline 10 because historical applications depend on echo to echo all of its arguments, except for the -n option in the BSD version. FUTURE DIRECTIONS None. SEE ALSO printf The Base Definitions volume of POSIX.1-2008, Chapter 8, Environment Variables, Section 12.2, Utility Syntax Guidelines COPYRIGHT Portions of this text are reprinted and reproduced in electronic form from IEEE Std 1003.1, 2013 Edition, Standard for Information Technology -- Portable Operating System Inter- face (POSIX), The Open Group Base Specifications Issue 7, Copyright (C) 2013 by the Institute of Elec- trical and Electronics Engineers, Inc and The Open Group. (This is POSIX.1-2008 with the 2013 Technical Corrigendum 1 applied.) In the event of any discrepancy between this ver- sion and the original IEEE and The Open Group Standard, the original IEEE and The Open Group Standard is the referee document. The original Standard can be obtained online at http://www.unix.org/online.html . Any typographical or formatting errors that appear in this page are most likely to have been introduced during the conversion of the source files to man page format. To report such errors, see https://www.ker- nel.org/doc/man-pages/report- ing_bugs.html . IEEE/The Open Group 2013 ECHO(1P)`), ).toMatchSnapshot() }) it('formats BSD (OS X) manuals', () => { expect( sh.formatManOutput(` ECHO(1) BSD General Commands Manual ECHO(1) NAME echo -- write arguments to the standard output SYNOPSIS echo [-n] [string ...] DESCRIPTION The echo utility writes any speci- fied operands, separated by single blank (\` ') characters and followed by a newline (\`\\n') character, to the standard output. The following option is available: -n Do not print the trailing newline character. This may also be achieved by appending \`\\c' to the end of the string, as is done by iBCS2 compatible systems. Note that this option as well as the effect of \`\\c' are imple- mentation-defined in IEEE Std 1003.1-2001 (\`\`POSIX.1'') as amended by Cor. 1-2002. Applications aiming for maxi- mum portability are strongly encouraged to use printf(1) to suppress the newline char- acter. Some shells may provide a builtin echo command which is similar or identical to this utility. Most notably, the builtin echo in sh(1) does not accept the -n option. Consult the builtin(1) manual page. EXIT STATUS The echo utility exits 0 on suc- cess, and >0 if an error occurs. SEE ALSO builtin(1), csh(1), printf(1), sh(1) STANDARDS The echo utility conforms to IEEE Std 1003.1-2001 (\`\`POSIX.1'') as amended by Cor. 1-2002. BSD April 12, 2003 BSD`), ).toMatchSnapshot() }) }) describe('memorize', () => { it('memorizes a function', async () => { const fnRaw = jest.fn(async (args) => args) const arg1 = { one: '1' } const arg2 = { another: { word: 'word' } } const fnMemorized = sh.memorize(fnRaw) const arg1CallResult1 = await fnMemorized(arg1) const arg1CallResult2 = await fnMemorized(arg1) const arg2CallResult1 = await fnMemorized(arg2) const arg2CallResult2 = await fnMemorized(arg2) expect(fnRaw).toHaveBeenCalledTimes(2) expect(fnRaw).toHaveBeenCalledWith(arg2) expect(arg1CallResult1).toBe(arg1CallResult2) expect(arg2CallResult1).toBe(arg2CallResult2) }) })