(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:stdoutF) op: assign_op.Equal rhs: { (DQ (braced_var_sub token: (Token id:Id.VSub_Name val:TMPDIR span_id:64) suffix_op: (suffix_op.Unary op_id: Id.VTest_ColonHyphen arg_word: {(Id.Lit_Slash /) (tmp)} ) ) (/STDOUT) ) } spids: [61] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:stderrF) op: assign_op.Equal rhs: { (DQ (braced_var_sub token: (Token id:Id.VSub_Name val:TMPDIR span_id:75) suffix_op: (suffix_op.Unary op_id: Id.VTest_ColonHyphen arg_word: {(Id.Lit_Slash /) (tmp)} ) ) (/STDERR) ) } spids: [72] ) ] ) (C {(.)} {(./shflags_test_helpers)}) (command.ShFunction name: testColumns body: (command.BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:cols) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:100) command_list: (command.CommandList children:[(C {(_flags_columns)})]) ) } spids: [99] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:value) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:108) command_list: (command.CommandList children: [ (C {(expr)} {(DQ (${ Id.VSub_Name cols))} {(Id.Lit_Other ':')} {(SQ (Token id:Id.Lit_Chars val:'\\([0-9]*\\)' span_id:126))} ) ] ) ) } spids: [107] ) ] ) (C {(assertNotNull)} {(DQ ('unexpected screen width (') (${ Id.VSub_Name cols) (')'))} {(DQ (${ Id.VSub_Name value))} ) ] ) ) (command.ShFunction name: testGetoptVers body: (command.BraceGroup children: [ (command.WhileUntil keyword: (Token id:Id.KW_While val:while span_id:161) cond: [ (command.Sentence child: (C {(read)} {(desc)} {(mock)} {(want)}) terminator: (Token id:Id.Op_Semi val:';' span_id:170) ) ] body: (command.DoGroup children: [ (C {(assertEquals)} {(DQ (${ Id.VSub_Name desc))} { (DQ (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:184) command_list: (command.CommandList children: [(C {(_flags_getopt_vers)} {(DQ (${ Id.VSub_Name mock))})] ) ) ) } {(DQ (${ Id.VSub_Name want))} ) ] ) redirects: [ (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:204) fd: -1 here_begin: {(EOF)} here_end_span_id: 218 stdin_parts: [ ('standard mock_getopt_std ') (${ Id.VSub_Name __FLAGS_GETOPT_VERS_STD) ('\n') ('enhanced mock_getopt_enh ') (${ Id.VSub_Name __FLAGS_GETOPT_VERS_ENH) ('\n') ] ) ] ) ] ) ) (command.ShFunction name: mock_getopt_std body: (command.BraceGroup children: [ (command.Sentence child: (C {(echo)} {(SQ (Token id:Id.Lit_Chars val:' -- --foo' span_id:237))}) terminator: (Token id:Id.Op_Semi val:';' span_id:239) ) (command.Sentence child: (command.ControlFlow token: (Token id:Id.ControlFlow_Return val:return span_id:241) arg_word: {(0)} ) terminator: (Token id:Id.Op_Semi val:';' span_id:244) ) ] ) ) (command.ShFunction name: mock_getopt_enh body: (command.BraceGroup children: [ (command.Sentence child: (C {(echo)} {(SQ (Token id:Id.Lit_Chars val:' --foo --' span_id:260))}) terminator: (Token id:Id.Op_Semi val:';' span_id:262) ) (command.Sentence child: (command.ControlFlow token: (Token id:Id.ControlFlow_Return val:return span_id:264) arg_word: {(0)} ) terminator: (Token id:Id.Op_Semi val:';' span_id:267) ) ] ) ) (command.ShFunction name: testGenOptStr body: (command.BraceGroup children: [ (C {(_testGenOptStr)} {(SQ )} {(SQ )}) (C {(DEFINE_boolean)} {(bool)} {(false)} {(SQ (Token id:Id.Lit_Chars val:'boolean value' span_id:296))} {(b)} ) (C {(_testGenOptStr)} {(SQ (Token id:Id.Lit_Chars val:b span_id:305))} {(SQ (Token id:Id.Lit_Chars val:bool span_id:309))} ) (C {(DEFINE_float)} {(float)} {(0.0)} {(SQ (Token id:Id.Lit_Chars val:'float value' span_id:321))} {(f)} ) (C {(_testGenOptStr)} {(SQ (Token id:Id.Lit_Chars val:'bf:' span_id:330))} {(SQ (Token id:Id.Lit_Chars val:'bool,float:' span_id:334))} ) (C {(DEFINE_integer)} {(int)} {(0)} {(SQ (Token id:Id.Lit_Chars val:'integer value' span_id:346))} {(i)} ) (C {(_testGenOptStr)} {(SQ (Token id:Id.Lit_Chars val:'bf:i:' span_id:355))} {(SQ (Token id:Id.Lit_Chars val:'bool,float:,int:' span_id:359))} ) (C {(DEFINE_string)} {(str)} {(0)} {(SQ (Token id:Id.Lit_Chars val:'string value' span_id:371))} {(s)} ) (C {(_testGenOptStr)} {(SQ (Token id:Id.Lit_Chars val:'bf:i:s:' span_id:380))} {(SQ (Token id:Id.Lit_Chars val:'bool,float:,int:,str:' span_id:384))} ) (C {(DEFINE_boolean)} {(help)} {(false)} {(SQ (Token id:Id.Lit_Chars val:'show help' span_id:396))} {(h)} ) (C {(_testGenOptStr)} {(SQ (Token id:Id.Lit_Chars val:'bf:i:s:h' span_id:405))} {(SQ (Token id:Id.Lit_Chars val:'bool,float:,int:,str:,help' span_id:409))} ) ] ) ) (command.ShFunction name: _testGenOptStr body: (command.BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:short) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [422] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:long) op: assign_op.Equal rhs: {($ Id.VSub_Number '$2')} spids: [426] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:result) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:432) command_list: (command.CommandList children: [ (C {(_flags_genOptStr)} {(DQ (${ Id.VSub_Name __FLAGS_OPTSTR_SHORT))}) ] ) ) } spids: [431] ) ] ) (C {(assertTrue)} {(SQ (Token id:Id.Lit_Chars val:'short option string generation failed' span_id:446))} {($ Id.VSub_QMark '$?')} ) (C {(assertEquals)} {(DQ (${ Id.VSub_Name short))} {(DQ (${ Id.VSub_Name result))}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:result) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:469) command_list: (command.CommandList children: [ (C {(_flags_genOptStr)} {(DQ (${ Id.VSub_Name __FLAGS_OPTSTR_LONG))}) ] ) ) } spids: [468] ) ] ) (C {(assertTrue)} {(SQ (Token id:Id.Lit_Chars val:'long option string generation failed' span_id:485))} {($ Id.VSub_QMark '$?')} ) (C {(assertEquals)} {(DQ (${ Id.VSub_Name long))} {(DQ (${ Id.VSub_Name result))}) ] ) ) (command.ShFunction name: testGetFlagInfo body: (command.BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:__flags_blah_foobar) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:1234 span_id:517))} spids: [515] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:rslt) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:523) command_list: (command.CommandList children: [ (C {(_flags_getFlagInfo)} {(SQ (Token id:Id.Lit_Chars val:blah span_id:529))} {(SQ (Token id:Id.Lit_Chars val:foobar span_id:533))} ) ] ) ) } spids: [522] ) ] ) (C {(assertTrue)} {(SQ (Token id:Id.Lit_Chars val:'request for valid flag info failed' span_id:541))} {($ Id.VSub_QMark '$?')} ) (C {(assertEquals)} {(SQ (Token id:Id.Lit_Chars val:'invalid flag info returned' span_id:550))} {(DQ (${ Id.VSub_Name __flags_blah_foobar))} {(DQ (${ Id.VSub_Name rslt))} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:rslt) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:568) command_list: (command.CommandList children: [ (command.Simple words: [ {(_flags_getFlagInfo)} {(SQ (Token id:Id.Lit_Chars val:blah span_id:574))} {(SQ (Token id:Id.Lit_Chars val:hubbabubba span_id:578))} ] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:581) fd: -1 arg_word: {(DQ (${ Id.VSub_Name stdoutF))} ) (redir.Redir op: (Token id:Id.Redir_Great val:'2>' span_id:588) fd: 2 arg_word: {(DQ (${ Id.VSub_Name stderrF))} ) ] ) ] ) ) } spids: [567] ) ] ) (C {(assertEquals)} {(SQ (Token id:Id.Lit_Chars val:'invalid flag did not result in an error' span_id:600))} {(DQ (${ Id.VSub_Name FLAGS_ERROR))} {($ Id.VSub_QMark '$?')} ) (C {(assertErrorMsg)} {(SQ (Token id:Id.Lit_Chars val:'missing flag info variable' span_id:615))} ) ] ) ) (command.ShFunction name: testItemInList body: (command.BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:list) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:'this is a test' span_id:630))} spids: [628] ) ] ) (command.WhileUntil keyword: (Token id:Id.KW_While val:while span_id:638) cond: [ (command.Sentence child: (C {(read)} {(desc)} {(item)} {(want)}) terminator: (Token id:Id.Op_Semi val:';' span_id:647) ) ] body: (command.DoGroup children: [ (C {(_flags_itemInList)} {(DQ (${ Id.VSub_Name item))} {(DQ (${ Id.VSub_Name list))}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:got) op: assign_op.Equal rhs: {($ Id.VSub_QMark '$?')} spids: [667] ) ] ) (C {(assertEquals)} {(DQ (${ Id.VSub_Name desc) (': itemInList(') (${ Id.VSub_Name item) (')'))} {(DQ (${ Id.VSub_Name got))} {(DQ (${ Id.VSub_Name want))} ) ] ) redirects: [ (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:699) fd: -1 here_begin: {(EOF)} here_end_span_id: 743 stdin_parts: [ ('lead_item this ') (${ Id.VSub_Name FLAGS_TRUE) ('\n') ('middle_item is ') (${ Id.VSub_Name FLAGS_TRUE) ('\n') ('last_item test ') (${ Id.VSub_Name FLAGS_TRUE) ('\n') ('missing_item asdf ') (${ Id.VSub_Name FLAGS_FALSE) ('\n') ('test_partial_te te ') (${ Id.VSub_Name FLAGS_FALSE) ('\n') ('test_partial_es es ') (${ Id.VSub_Name FLAGS_FALSE) ('\n') ('test_partial_st st ') (${ Id.VSub_Name FLAGS_FALSE) ('\n') ("empty_item '' ") (${ Id.VSub_Name FLAGS_FALSE) ('\n') ] ) ] ) (C {(_flags_itemInList)} {(SQ (Token id:Id.Lit_Chars val:item span_id:749))} {(SQ )}) (C {(assertFalse)} {(SQ (Token id:Id.Lit_Chars val:'empty lists should not match' span_id:759))} {($ Id.VSub_QMark '$?')} ) ] ) ) (command.ShFunction name: testValidBool body: (command.BraceGroup children: [ (command.ForEach iter_name: value iter_words: [{(${ Id.VSub_Name TH_BOOL_VALID)}] do_arg_iter: F body: (command.DoGroup children: [ (C {(_flags_validBool)} {(DQ (${ Id.VSub_Name value))}) (C {(assertTrue)} {(DQ ('valid value (') (${ Id.VSub_Name value) (') did not validate'))} {($ Id.VSub_QMark '$?')} ) ] ) ) (command.ForEach iter_name: value iter_words: [{(${ Id.VSub_Name TH_BOOL_INVALID)}] do_arg_iter: F body: (command.DoGroup children: [ (C {(_flags_validBool)} {(DQ (${ Id.VSub_Name value))}) (C {(assertFalse)} {(DQ ('invalid value (') (${ Id.VSub_Name value) (') validated'))} {($ Id.VSub_QMark '$?')} ) ] ) ) ] ) ) (command.ShFunction name: _testValidFloat body: (command.BraceGroup children: [ (command.ForEach iter_name: value iter_words: [{(${ Id.VSub_Name TH_INT_VALID)} {(${ Id.VSub_Name TH_FLOAT_VALID)}] do_arg_iter: F body: (command.DoGroup children: [ (C {(_flags_validFloat)} {(DQ (${ Id.VSub_Name value))}) (C {(assertTrue)} {(DQ ('valid value (') (${ Id.VSub_Name value) (') did not validate'))} {($ Id.VSub_QMark '$?')} ) ] ) ) (command.ForEach iter_name: value iter_words: [{(${ Id.VSub_Name TH_FLOAT_INVALID)}] do_arg_iter: F body: (command.DoGroup children: [ (C {(_flags_validFloat)} {(DQ (${ Id.VSub_Name value))}) (C {(assertFalse)} {(DQ ('invalid value (') (${ Id.VSub_Name value) (') validated'))} {($ Id.VSub_QMark '$?')} ) ] ) ) ] ) ) (command.ShFunction name: testValidFloatBuiltin body: (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DPipe] children: [(C {(_flags_useBuiltin)}) (C {(startSkipping)})] ) (C {(_testValidFloat)}) ] ) ) (command.ShFunction name: testValidFloatExpr body: (command.BraceGroup children: [ (command.Subshell command_list: (command.CommandList children: [ (command.ShFunction name: _flags_useBuiltin body: (command.BraceGroup children: [ (command.Sentence child: (command.ControlFlow token: (Token id:Id.ControlFlow_Return val:return span_id:998) arg_word: {(DQ (${ Id.VSub_Name FLAGS_FALSE))} ) terminator: (Token id:Id.Op_Semi val:';' span_id:1005) ) ] ) ) (C {(_testValidFloat)}) ] ) ) ] ) ) (command.ShFunction name: _testValidInt body: (command.BraceGroup children: [ (command.ForEach iter_name: value iter_words: [{(${ Id.VSub_Name TH_INT_VALID)}] do_arg_iter: F body: (command.DoGroup children: [ (C {(_flags_validInt)} {(DQ (${ Id.VSub_Name value))}) (C {(assertTrue)} {(DQ ('valid value (') (${ Id.VSub_Name value) (') did not validate'))} {($ Id.VSub_QMark '$?')} ) ] ) ) (command.ForEach iter_name: value iter_words: [{(${ Id.VSub_Name TH_INT_INVALID)}] do_arg_iter: F body: (command.DoGroup children: [ (C {(_flags_validInt)} {(DQ (${ Id.VSub_Name value))}) (C {(assertFalse)} {(DQ ('invalid value (') (${ Id.VSub_Name value) (') should not validate'))} {($ Id.VSub_QMark '$?')} ) ] ) ) ] ) ) (command.ShFunction name: testValidIntBuiltin body: (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DPipe] children: [(C {(_flags_useBuiltin)}) (C {(startSkipping)})] ) (C {(_testValidInt)}) ] ) ) (command.ShFunction name: testValidIntExpr body: (command.BraceGroup children: [ (command.Subshell command_list: (command.CommandList children: [ (command.ShFunction name: _flags_useBuiltin body: (command.BraceGroup children: [ (command.Sentence child: (command.ControlFlow token: (Token id:Id.ControlFlow_Return val:return span_id:1149) arg_word: {(DQ (${ Id.VSub_Name FLAGS_FALSE))} ) terminator: (Token id:Id.Op_Semi val:';' span_id:1156) ) ] ) ) (C {(_testValidInt)}) ] ) ) ] ) ) (command.ShFunction name: _testMath body: (command.BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:result) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:1177) command_list: (command.CommandList children:[(C {(_flags_math)} {(1)})]) ) } spids: [1176] ) ] ) (C {(assertTrue)} {(SQ (Token id:Id.Lit_Chars val:'1 failed' span_id:1189))} {($ Id.VSub_QMark '$?')} ) (C {(assertEquals)} {(SQ (Token id:Id.Lit_Chars val:1 span_id:1198))} {(1)} {(DQ (${ Id.VSub_Name result))} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:result) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:1212) command_list: (command.CommandList children: [ (C {(_flags_math)} {(SQ (Token id:Id.Lit_Chars val:'1 + 2' span_id:1218))}) ] ) ) } spids: [1211] ) ] ) (C {(assertTrue)} {(SQ (Token id:Id.Lit_Chars val:'1+2 failed' span_id:1226))} {($ Id.VSub_QMark '$?')} ) (C {(assertEquals)} {(SQ (Token id:Id.Lit_Chars val:'1+2' span_id:1235))} {(3)} {(DQ (${ Id.VSub_Name result))} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:result) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:1249) command_list: (command.CommandList children: [ (C {(_flags_math)} {(SQ (Token id:Id.Lit_Chars val:'1 + 2 + 3' span_id:1255))} ) ] ) ) } spids: [1248] ) ] ) (C {(assertTrue)} {(SQ (Token id:Id.Lit_Chars val:'1+2+3 failed' span_id:1263))} {($ Id.VSub_QMark '$?')} ) (C {(assertEquals)} {(SQ (Token id:Id.Lit_Chars val:'1+2+3' span_id:1272))} {(6)} {(DQ (${ Id.VSub_Name result))} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:result) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:1286) command_list: (command.CommandList children:[(C {(_flags_math)})]) ) } spids: [1285] ) ] ) (C {(assertFalse)} {(SQ (Token id:Id.Lit_Chars val:'missing math succeeded' span_id:1296))} {($ Id.VSub_QMark '$?')} ) ] ) ) (command.ShFunction name: testMathBuiltin body: (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DPipe] children: [(C {(_flags_useBuiltin)}) (C {(startSkipping)})] ) (C {(_testMath)}) ] ) ) (command.ShFunction name: testMathExpr body: (command.BraceGroup children: [ (command.Subshell command_list: (command.CommandList children: [ (command.ShFunction name: _flags_useBuiltin body: (command.BraceGroup children: [ (command.Sentence child: (command.ControlFlow token: (Token id:Id.ControlFlow_Return val:return span_id:1339) arg_word: {(DQ (${ Id.VSub_Name FLAGS_FALSE))} ) terminator: (Token id:Id.Op_Semi val:';' span_id:1346) ) ] ) ) (C {(_testMath)}) ] ) ) ] ) ) (command.ShFunction name: _testStrlen body: (command.BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:len) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:1367) command_list: (command.CommandList children:[(C {(_flags_strlen)})]) ) } spids: [1366] ) ] ) (C {(assertTrue)} {(SQ (Token id:Id.Lit_Chars val:'missing argument failed' span_id:1377))} {($ Id.VSub_QMark '$?')} ) (C {(assertEquals)} {(SQ (Token id:Id.Lit_Chars val:'missing argument' span_id:1386))} {(0)} {(DQ (${ Id.VSub_Name len))} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:len) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:1400) command_list: (command.CommandList children:[(C {(_flags_strlen)} {(SQ )})]) ) } spids: [1399] ) ] ) (C {(assertTrue)} {(SQ (Token id:Id.Lit_Chars val:'empty argument failed' span_id:1413))} {($ Id.VSub_QMark '$?')} ) (C {(assertEquals)} {(SQ (Token id:Id.Lit_Chars val:'empty argument' span_id:1422))} {(0)} {(DQ (${ Id.VSub_Name len))} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:len) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:1436) command_list: (command.CommandList children: [(C {(_flags_strlen)} {(abc123)})] ) ) } spids: [1435] ) ] ) (C {(assertTrue)} {(SQ (Token id:Id.Lit_Chars val:'single-word failed' span_id:1448))} {($ Id.VSub_QMark '$?')} ) (C {(assertEquals)} {(SQ (Token id:Id.Lit_Chars val:single-word span_id:1457))} {(6)} {(DQ (${ Id.VSub_Name len))} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:len) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:1471) command_list: (command.CommandList children: [ (C {(_flags_strlen)} {(SQ (Token id:Id.Lit_Chars val:'This is a test' span_id:1477))} ) ] ) ) } spids: [1470] ) ] ) (C {(assertTrue)} {(SQ (Token id:Id.Lit_Chars val:'multi-word failed' span_id:1485))} {($ Id.VSub_QMark '$?')} ) (C {(assertEquals)} {(SQ (Token id:Id.Lit_Chars val:multi-word span_id:1494))} {(14)} {(DQ (${ Id.VSub_Name len))} ) ] ) ) (command.ShFunction name: testStrlenBuiltin body: (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DPipe] children: [(C {(_flags_useBuiltin)}) (C {(startSkipping)})] ) (C {(_testStrlen)}) ] ) ) (command.ShFunction name: testStrlenExpr body: (command.BraceGroup children: [ (command.Subshell command_list: (command.CommandList children: [ (command.ShFunction name: _flags_useBuiltin body: (command.BraceGroup children: [ (command.Sentence child: (command.ControlFlow token: (Token id:Id.ControlFlow_Return val:return span_id:1543) arg_word: {(DQ (${ Id.VSub_Name FLAGS_FALSE))} ) terminator: (Token id:Id.Op_Semi val:';' span_id:1550) ) ] ) ) (C {(_testStrlen)}) ] ) ) ] ) ) (command.ShFunction name: oneTimeSetUp body: (command.BraceGroup children: [ (C {(th_oneTimeSetUp)}) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {(_flags_useBuiltin)}) (C {(th_warn)} { (SQ (Token id: Id.Lit_Chars val: 'Shell built-ins not supported. Some tests will be skipped.' span_id: 1583 ) ) } ) ] ) ] ) ) (command.ShFunction name:tearDown body:(command.BraceGroup children:[(C {(flags_reset)})])) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {(Id.Lit_LBracket '[')} {(-n)} { (DQ (braced_var_sub token: (Token id:Id.VSub_Name val:ZSH_VERSION span_id:1613) suffix_op: (suffix_op.Unary op_id:Id.VTest_ColonHyphen arg_word:(word.Empty)) ) ) } {(Id.Lit_RBracket ']')} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:SHUNIT_PARENT) op: assign_op.Equal rhs: {($ Id.VSub_Number '$0')} spids: [1622] ) ] ) ] ) (C {(.)} {(DQ (${ Id.VSub_Name TH_SHUNIT))}) ] )