(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'Test git check-ref-format'>)}
          spids: [4]
        )
      ]
    )
    (C {<.>} {<./test-lib.sh>})
    (command.ShFunction
      name: valid_ref
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:prereq)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [22]
                )
              ]
            )
            (command.Case
              to_match: {($ Id.VSub_Number '$1')}
              arms: [
                (case_arm
                  pat_list: [
                    {<Id.Lit_LBracket '['> <A-Z> <Id.KW_Bang '!'> <Id.Lit_RBracket ']'> 
                      <Id.Lit_Star '*'>
                    }
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:prereq)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_Number '$1')}
                          spids: [40]
                        )
                      ]
                    )
                    (C {<shift>})
                  ]
                  spids: [32 37 -1 47]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:desc)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ <"ref name '"> ($ Id.VSub_Number '$1') <"' is valid"> 
                        (braced_var_sub
                          token: <Id.VSub_Number 2>
                          suffix_op: 
                            (suffix_op.Unary
                              op_id: Id.VTest_ColonPlus
                              arg_word: {<' with options '> ($ Id.VSub_Number '$2')}
                            )
                        )
                      )
                    }
                  spids: [50]
                )
              ]
            )
            (C {<test_expect_success>} {($ Id.VSub_DollarName '$prereq')} 
              {(DQ ($ Id.VSub_DollarName '$desc'))} 
              {
                (DQ <'\n'> <'\t\tgit check-ref-format '> ($ Id.VSub_Number '$2') <" '"> 
                  ($ Id.VSub_Number '$1') <"'\n"> <'\t'>
                )
              }
            )
          ]
        )
    )
    (command.ShFunction
      name: invalid_ref
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:prereq)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [91]
                )
              ]
            )
            (command.Case
              to_match: {($ Id.VSub_Number '$1')}
              arms: [
                (case_arm
                  pat_list: [
                    {<Id.Lit_LBracket '['> <A-Z> <Id.KW_Bang '!'> <Id.Lit_RBracket ']'> 
                      <Id.Lit_Star '*'>
                    }
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:prereq)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_Number '$1')}
                          spids: [109]
                        )
                      ]
                    )
                    (C {<shift>})
                  ]
                  spids: [101 106 -1 116]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:desc)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ <"ref name '"> ($ Id.VSub_Number '$1') <"' is invalid"> 
                        (braced_var_sub
                          token: <Id.VSub_Number 2>
                          suffix_op: 
                            (suffix_op.Unary
                              op_id: Id.VTest_ColonPlus
                              arg_word: {<' with options '> ($ Id.VSub_Number '$2')}
                            )
                        )
                      )
                    }
                  spids: [119]
                )
              ]
            )
            (C {<test_expect_success>} {($ Id.VSub_DollarName '$prereq')} 
              {(DQ ($ Id.VSub_DollarName '$desc'))} 
              {
                (DQ <'\n'> <'\t\ttest_must_fail git check-ref-format '> ($ Id.VSub_Number '$2') <" '"> 
                  ($ Id.VSub_Number '$1') <"'\n"> <'\t'>
                )
              }
            )
          ]
        )
    )
    (C {<invalid_ref>} {(SQ )})
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(SQ </>)})
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(SQ </>)} {<--allow-onelevel>})
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(SQ </>)} {<--normalize>})
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(SQ </>)} {(SQ <'--allow-onelevel --normalize'>)})
    (C {<valid_ref>} {(SQ <foo/bar/baz>)})
    (C {<valid_ref>} {(SQ <foo/bar/baz>)} {<--normalize>})
    (C {<invalid_ref>} {(SQ <refs///heads/foo>)})
    (C {<valid_ref>} {(SQ <refs///heads/foo>)} {<--normalize>})
    (C {<invalid_ref>} {(SQ <heads/foo/>)})
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(SQ </heads/foo>)})
    (C {<valid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(SQ </heads/foo>)} {<--normalize>})
    (C {<invalid_ref>} {(SQ <///heads/foo>)})
    (C {<valid_ref>} {(SQ <///heads/foo>)} {<--normalize>})
    (C {<invalid_ref>} {(SQ <./foo>)})
    (C {<invalid_ref>} {(SQ <./foo/bar>)})
    (C {<invalid_ref>} {(SQ <foo/./bar>)})
    (C {<invalid_ref>} {(SQ <foo/bar/.>)})
    (C {<invalid_ref>} {(SQ <.refs/foo>)})
    (C {<invalid_ref>} {(SQ <refs/heads/foo.>)})
    (C {<invalid_ref>} {(SQ <heads/foo..bar>)})
    (C {<invalid_ref>} {(SQ <'heads/foo?bar'>)})
    (C {<valid_ref>} {(SQ <foo./bar>)})
    (C {<invalid_ref>} {(SQ <heads/foo.lock>)})
    (C {<invalid_ref>} {(SQ <heads///foo.lock>)})
    (C {<invalid_ref>} {(SQ <foo.lock/bar>)})
    (C {<invalid_ref>} {(SQ <foo.lock///bar>)})
    (C {<valid_ref>} {(SQ <'heads/foo@bar'>)})
    (C {<invalid_ref>} {(SQ <'heads/v@{ation'>)})
    (C {<invalid_ref>} {(SQ <'heads/foo\\bar'>)})
    (C {<invalid_ref>} 
      {
        (DQ 
          (command_sub
            left_token: <Id.Left_DollarParen '$('>
            command_list: (command.CommandList children:[(C {<printf>} {(SQ <'heads/foo\\t'>)})])
          )
        )
      }
    )
    (C {<invalid_ref>} 
      {
        (DQ 
          (command_sub
            left_token: <Id.Left_DollarParen '$('>
            command_list: (command.CommandList children:[(C {<printf>} {(SQ <'heads/foo\\177'>)})])
          )
        )
      }
    )
    (C {<valid_ref>} 
      {
        (DQ 
          (command_sub
            left_token: <Id.Left_DollarParen '$('>
            command_list: 
              (command.CommandList
                children: [(C {<printf>} {(SQ <'heads/fu\\303\\237'>)})]
              )
          )
        )
      }
    )
    (C {<valid_ref>} {(SQ <'heads/*foo/bar'>)} {<--refspec-pattern>})
    (C {<valid_ref>} {(SQ <'heads/foo*/bar'>)} {<--refspec-pattern>})
    (C {<valid_ref>} {(SQ <'heads/f*o/bar'>)} {<--refspec-pattern>})
    (C {<invalid_ref>} {(SQ <'heads/f*o*/bar'>)} {<--refspec-pattern>})
    (C {<invalid_ref>} {(SQ <'heads/foo*/bar*'>)} {<--refspec-pattern>})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ref)
          op: assign_op.Equal
          rhs: {(SQ <foo>)}
          spids: [444]
        )
      ]
    )
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--allow-onelevel>})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--refspec-pattern>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--refspec-pattern --allow-onelevel'>)})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--normalize>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--allow-onelevel --normalize'>)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ref)
          op: assign_op.Equal
          rhs: {(SQ <foo/bar>)}
          spids: [500]
        )
      ]
    )
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--allow-onelevel>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--refspec-pattern>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--refspec-pattern --allow-onelevel'>)})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--normalize>})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ref)
          op: assign_op.Equal
          rhs: {(SQ <'foo/*'>)}
          spids: [546]
        )
      ]
    )
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--allow-onelevel>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--refspec-pattern>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--refspec-pattern --allow-onelevel'>)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ref)
          op: assign_op.Equal
          rhs: {(SQ <'*/foo'>)}
          spids: [584]
        )
      ]
    )
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--allow-onelevel>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--refspec-pattern>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--refspec-pattern --allow-onelevel'>)})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--normalize>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--refspec-pattern --normalize'>)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ref)
          op: assign_op.Equal
          rhs: {(SQ <'foo/*/bar'>)}
          spids: [640]
        )
      ]
    )
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--allow-onelevel>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--refspec-pattern>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--refspec-pattern --allow-onelevel'>)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ref)
          op: assign_op.Equal
          rhs: {(SQ <'*'>)}
          spids: [678]
        )
      ]
    )
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--allow-onelevel>})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--refspec-pattern>})
    (C {<valid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--refspec-pattern --allow-onelevel'>)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ref)
          op: assign_op.Equal
          rhs: {(SQ <'foo/*/*'>)}
          spids: [716]
        )
      ]
    )
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--refspec-pattern>})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--refspec-pattern --allow-onelevel'>)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ref)
          op: assign_op.Equal
          rhs: {(SQ <'*/foo/*'>)}
          spids: [740]
        )
      ]
    )
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--refspec-pattern>})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--refspec-pattern --allow-onelevel'>)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ref)
          op: assign_op.Equal
          rhs: {(SQ <'*/*/foo'>)}
          spids: [764]
        )
      ]
    )
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--refspec-pattern>})
    (C {<invalid_ref>} {(DQ ($ Id.VSub_DollarName '$ref'))} {(SQ <'--refspec-pattern --allow-onelevel'>)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ref)
          op: assign_op.Equal
          rhs: {(SQ </foo>)}
          spids: [788]
        )
      ]
    )
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(DQ ($ Id.VSub_DollarName '$ref'))})
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(DQ ($ Id.VSub_DollarName '$ref'))} 
      {<--allow-onelevel>}
    )
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(DQ ($ Id.VSub_DollarName '$ref'))} 
      {<--refspec-pattern>}
    )
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(DQ ($ Id.VSub_DollarName '$ref'))} 
      {(SQ <'--refspec-pattern --allow-onelevel'>)}
    )
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(DQ ($ Id.VSub_DollarName '$ref'))} {<--normalize>})
    (C {<valid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(DQ ($ Id.VSub_DollarName '$ref'))} 
      {(SQ <'--allow-onelevel --normalize'>)}
    )
    (C {<invalid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(DQ ($ Id.VSub_DollarName '$ref'))} 
      {(SQ <'--refspec-pattern --normalize'>)}
    )
    (C {<valid_ref>} {<Id.KW_Bang '!'> <MINGW>} {(DQ ($ Id.VSub_DollarName '$ref'))} 
      {(SQ <'--refspec-pattern --allow-onelevel --normalize'>)}
    )
    (C {<test_expect_success>} {(DQ <'check-ref-format --branch @{-1}'>)} 
      {
        (SQ <'\n'> <'\tT=$(git write-tree) &&\n'> <'\tsha1=$(echo A | git commit-tree $T) &&\n'> 
          <'\tgit update-ref refs/heads/master $sha1 &&\n'> <'\tgit update-ref refs/remotes/origin/master $sha1 &&\n'> <'\tgit checkout master &&\n'> 
          <'\tgit checkout origin/master &&\n'> <'\tgit checkout master &&\n'> <'\trefname=$(git check-ref-format --branch @{-1}) &&\n'> 
          <'\ttest "$refname" = "$sha1" &&\n'> <'\trefname2=$(git check-ref-format --branch @{-2}) &&\n'> <'\ttest "$refname2" = master'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'check-ref-format --branch from subdir'>)} 
      {
        (SQ <'\n'> <'\tmkdir subdir &&\n'> <'\n'> <'\tT=$(git write-tree) &&\n'> 
          <'\tsha1=$(echo A | git commit-tree $T) &&\n'> <'\tgit update-ref refs/heads/master $sha1 &&\n'> 
          <'\tgit update-ref refs/remotes/origin/master $sha1 &&\n'> <'\tgit checkout master &&\n'> <'\tgit checkout origin/master &&\n'> <'\tgit checkout master &&\n'> 
          <'\trefname=$(\n'> <'\t\tcd subdir &&\n'> <'\t\tgit check-ref-format --branch @{-1}\n'> <'\t) &&\n'> 
          <'\ttest "$refname" = "$sha1"\n'>
        )
      }
    )
    (command.ShFunction
      name: valid_ref_normalized
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:prereq)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [942]
                )
              ]
            )
            (command.Case
              to_match: {($ Id.VSub_Number '$1')}
              arms: [
                (case_arm
                  pat_list: [
                    {<Id.Lit_LBracket '['> <A-Z> <Id.KW_Bang '!'> <Id.Lit_RBracket ']'> 
                      <Id.Lit_Star '*'>
                    }
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:prereq)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_Number '$1')}
                          spids: [960]
                        )
                      ]
                    )
                    (C {<shift>})
                  ]
                  spids: [952 957 -1 967]
                )
              ]
            )
            (C {<test_expect_success>} {($ Id.VSub_DollarName '$prereq')} 
              {
                (DQ <"ref name '"> ($ Id.VSub_Number '$1') <"' simplifies to '"> ($ Id.VSub_Number '$2') 
                  <"'">
                )
              } 
              {
                (DQ <'\n'> <'\t\trefname='> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\$'>) 
                  <"(git check-ref-format --normalize '"> ($ Id.VSub_Number '$1') <"') &&\n"> <'\t\ttest '> 
                  (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\$'>) <refname> 
                  (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <" = '"> ($ Id.VSub_Number '$2') <"'\n"> <'\t'>
                )
              }
            )
          ]
        )
    )
    (command.ShFunction
      name: invalid_ref_normalized
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:prereq)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1009]
                )
              ]
            )
            (command.Case
              to_match: {($ Id.VSub_Number '$1')}
              arms: [
                (case_arm
                  pat_list: [
                    {<Id.Lit_LBracket '['> <A-Z> <Id.KW_Bang '!'> <Id.Lit_RBracket ']'> 
                      <Id.Lit_Star '*'>
                    }
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:prereq)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_Number '$1')}
                          spids: [1027]
                        )
                      ]
                    )
                    (C {<shift>})
                  ]
                  spids: [1019 1024 -1 1034]
                )
              ]
            )
            (C {<test_expect_success>} {($ Id.VSub_DollarName '$prereq')} 
              {(DQ <"check-ref-format --normalize rejects '"> ($ Id.VSub_Number '$1') <"'">)} 
              {
                (DQ <'\n'> <"\t\ttest_must_fail git check-ref-format --normalize '"> 
                  ($ Id.VSub_Number '$1') <"'\n"> <'\t'>
                )
              }
            )
          ]
        )
    )
    (C {<valid_ref_normalized>} {(SQ <heads/foo>)} {(SQ <heads/foo>)})
    (C {<valid_ref_normalized>} {(SQ <refs///heads/foo>)} {(SQ <refs/heads/foo>)})
    (C {<valid_ref_normalized>} {<Id.KW_Bang '!'> <MINGW>} {(SQ </heads/foo>)} {(SQ <heads/foo>)})
    (C {<valid_ref_normalized>} {(SQ <///heads/foo>)} {(SQ <heads/foo>)})
    (C {<invalid_ref_normalized>} {(SQ <foo>)})
    (C {<invalid_ref_normalized>} {<Id.KW_Bang '!'> <MINGW>} {(SQ </foo>)})
    (C {<invalid_ref_normalized>} {(SQ <heads/foo/../bar>)})
    (C {<invalid_ref_normalized>} {(SQ <heads/./foo>)})
    (C {<invalid_ref_normalized>} {(SQ <'heads\\foo'>)})
    (C {<invalid_ref_normalized>} {(SQ <heads/foo.lock>)})
    (C {<invalid_ref_normalized>} {(SQ <heads///foo.lock>)})
    (C {<invalid_ref_normalized>} {(SQ <foo.lock/bar>)})
    (C {<invalid_ref_normalized>} {(SQ <foo.lock///bar>)})
    (C {<test_done>})
  ]
)