(command.CommandList children: [ (C {(cd)} { (braced_var_sub token: (Token id:Id.VSub_Number val:0 span_id:7) suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{(Id.Lit_Slash /) ('*')}) ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:tmp) op: assign_op.Equal rhs: { (braced_var_sub token: (Token id:Id.VSub_Name val:TEMP span_id:15) suffix_op: (suffix_op.Unary op_id: Id.VTest_ColonHyphen arg_word: {(Id.Lit_Slash /) (tmp)} ) ) } spids: [13] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:tmp) op: assign_op.Equal rhs: { (braced_var_sub token: (Token id:Id.VSub_Name val:tmp span_id:23) suffix_op: (suffix_op.Unary op_id:Id.VOp1_DPercent arg_word:{(Id.Lit_Slash /)}) ) (/) } spids: [21] ) ] ) (command.ShAssignment pairs: [(assign_pair lhs:(sh_lhs_expr.Name name:fails) op:assign_op.Equal rhs:{(0)} spids:[33])] ) (command.ShAssignment pairs: [(assign_pair lhs:(sh_lhs_expr.Name name:i) op:assign_op.Equal rhs:{(0)} spids:[36])] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:tests) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:40) command_list: (command.CommandList children: [ (command.Pipeline children: [(C {(ls)} {(valid/) (Id.Lit_Star '*') (.json)}) (C {(wc)} {(-l)})] negated: F ) ] ) ) } spids: [39] ) ] ) (C {(echo)} {(DQ (1..) ($ Id.VSub_DollarName '$tests'))}) (command.ForEach iter_name: input iter_words: [{(valid/) (Id.Lit_Star '*') (.json)}] do_arg_iter: F body: (command.DoGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:input_file) op: assign_op.Equal rhs: { (braced_var_sub token: (Token id:Id.VSub_Name val:input span_id:78) suffix_op: (suffix_op.Unary op_id: Id.VOp1_DPound arg_word: {('*') (Id.Lit_Slash /)} ) ) } spids: [76] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:expected) op: assign_op.Equal rhs: { (DQ (${ Id.VSub_Name tmp) (braced_var_sub token: (Token id:Id.VSub_Name val:input_file span_id:91) suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{(.json)}) ) (.no-head) ) } spids: [85] ) ] ) (command.Simple words: [{(egrep)} {(-v)} {(SQ (Token id:Id.Lit_Chars val:'^\\[]' span_id:104))}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Less val:'<' span_id:107) fd: -1 arg_word: { (braced_var_sub token: (Token id:Id.VSub_Name val:input span_id:110) suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{(.json)}) ) (.parsed) } ) (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:116) fd: -1 arg_word: {($ Id.VSub_DollarName '$expected')} ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:i) op: assign_op.Equal rhs: { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.VarRef token: (Token id:Id.Lit_ArithVarLike val:i span_id:123) ) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)}) ) ) } spids: [121] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Pipeline children: [ (command.Simple words: [{(../JSON.sh)} {(-n)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Less val:'<' span_id:138) fd: -1 arg_word: {(DQ ($ Id.VSub_DollarName '$input'))} ) ] ) (C {(diff)} {(-u)} {(-)} {(DQ ($ Id.VSub_DollarName '$expected'))}) ] negated: T ) ] action: [ (C {(echo)} { (DQ ('not ok ') ($ Id.VSub_DollarName '$i') (' - ') ($ Id.VSub_DollarName '$input') ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:fails) op: assign_op.Equal rhs: { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.VarRef token: (Token id:Id.Lit_ArithVarLike val:fails span_id:173) ) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)}) ) ) } spids: [171] ) ] ) ] spids: [130 158] ) ] else_action: [ (C {(echo)} {(DQ ('ok ') ($ Id.VSub_DollarName '$i') (' - ') ($ Id.VSub_DollarName '$input'))} ) ] ) ] ) ) (C {(echo)} {(DQ ($ Id.VSub_DollarName '$fails') (' test(s) failed'))}) (command.ControlFlow token: (Token id:Id.ControlFlow_Exit val:exit span_id:205) arg_word: {($ Id.VSub_DollarName '$fails')} ) ] )