(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: 
            {
              (SQ (Token id:Id.Lit_Chars val:'git web--browse basic tests\n' span_id:9) 
                (Token id:Id.Lit_Chars val:'\n' span_id:10) 
                (Token
                  id: Id.Lit_Chars
                  val: 'This test checks that git web--browse can handle various valid URLs.'
                  span_id: 11
                )
              )
            }
          spids: [7]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: test_web_browse
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [
                    {(git)}
                    {(web--browse)}
                    {(--browser) (Id.Lit_Equals '=') (DQ ($ Id.VSub_Number '$1'))}
                    {(DQ ($ Id.VSub_Number '$2'))}
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:46)
                      fd: -1
                      arg_word: {(actual)}
                    )
                  ]
                )
                (command.Simple
                  words: [{(tr)} {(-d)} {(SQ (Token id:Id.Lit_Chars val:'\\015' span_id:57))}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Less val:'<' span_id:60)
                      fd: -1
                      arg_word: {(actual)}
                    )
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:63)
                      fd: -1
                      arg_word: {(text)}
                    )
                  ]
                )
                (C {(test_cmp)} {(expect)} {(text)})
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'URL with an ampersand in it' span_id:83))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:87) 
          (Token
            id: Id.Lit_Chars
            val: '\techo http://example.com/foo\\&bar >expect &&\n'
            span_id: 88
          ) (Token id:Id.Lit_Chars val:'\tgit config browser.custom.cmd echo &&\n' span_id:89) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_web_browse custom http://example.com/foo\\&bar\n'
            span_id: 90
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'URL with a semi-colon in it' span_id:99))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:103) 
          (Token
            id: Id.Lit_Chars
            val: '\techo http://example.com/foo\\;bar >expect &&\n'
            span_id: 104
          ) (Token id:Id.Lit_Chars val:'\tgit config browser.custom.cmd echo &&\n' span_id:105) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_web_browse custom http://example.com/foo\\;bar\n'
            span_id: 106
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'URL with a hash in it' span_id:115))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:119) 
          (Token
            id: Id.Lit_Chars
            val: '\techo http://example.com/foo#bar >expect &&\n'
            span_id: 120
          ) (Token id:Id.Lit_Chars val:'\tgit config browser.custom.cmd echo &&\n' span_id:121) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_web_browse custom http://example.com/foo#bar\n'
            span_id: 122
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'browser paths are properly quoted' span_id:131))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:135) 
          (Token
            id: Id.Lit_Chars
            val: '\techo fake: http://example.com/foo >expect &&\n'
            span_id: 136
          ) (Token id:Id.Lit_Chars val:'\tcat >"fake browser" <<-\\EOF &&\n' span_id:137) 
          (Token id:Id.Lit_Chars val:'\t#!/bin/sh\n' span_id:138) (Token id:Id.Lit_Chars val:'\techo fake: "$@"\n' span_id:139) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:140) (Token id:Id.Lit_Chars val:'\tchmod +x "fake browser" &&\n' span_id:141) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config browser.w3m.path "$(pwd)/fake browser" &&\n'
            span_id: 142
          ) (Token id:Id.Lit_Chars val:'\ttest_web_browse w3m http://example.com/foo\n' span_id:143)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'browser command allows arbitrary shell code' span_id:152))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:156) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "arg: http://example.com/foo" >expect &&\n'
            span_id: 157
          ) (Token id:Id.Lit_Chars val:'\tgit config browser.custom.cmd "\n' span_id:158) 
          (Token id:Id.Lit_Chars val:'\t\tf() {\n' span_id:159) (Token id:Id.Lit_Chars val:'\t\t\tfor i in \\"\\$@\\"; do\n' span_id:160) 
          (Token id:Id.Lit_Chars val:'\t\t\t\techo arg: \\$i\n' span_id:161) (Token id:Id.Lit_Chars val:'\t\t\tdone\n' span_id:162) 
          (Token id:Id.Lit_Chars val:'\t\t}\n' span_id:163) (Token id:Id.Lit_Chars val:'\t\tf" &&\n' span_id:164) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_web_browse custom http://example.com/foo\n'
            span_id: 165
          )
        )
      }
    )
    (C {(test_done)})
  ]
)