(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:base) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_Backtick '`'> child: (C {<basename>} {($ Id.VSub_Number '$0')}) ) } spids: [7] ) ] ) (C {<echo>} {(DQ <1..3>)}) (command.ShFunction name: assert_equals body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:testnum) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$1'))} spids: [31] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:expected) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$2'))} spids: [37] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:fn) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$3'))} spids: [43] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$expected'))} {<Id.Lit_Equals '='>} {(DQ (command_sub left_token:<Id.Left_DollarParen '$('> child:(C {($ Id.VSub_DollarName '$fn')})))} {<Id.Lit_RBracket ']'>} ) ] ) action: [ (C {<echo>} { (DQ <'ok '> ($ Id.VSub_DollarName '$testnum') <' - '> ($ Id.VSub_DollarName '$fn') ) } ) ] spids: [49 68] ) ] else_action: [ (C {<echo>} { (DQ <'not ok '> ($ Id.VSub_DollarName '$testnum') <' - '> ($ Id.VSub_DollarName '$fn') ) } ) ] ) ] ) ) (C {<assert_equals>} {<1>} {<1>} {(DQ <'units -t ft ft'>)}) (C {<assert_equals>} {<2>} {<12>} {(DQ <'units -t ft in'>)}) (C {<assert_equals>} {<3>} {<0.083333333>} {(DQ <'units -t in ft'>)}) ] )